diff --git a/README.md b/README.md index b4fe6d0e63c6e6948586f4d4517fe9effe58b1ff..ed1dd4cd3d5bde979183a8c4d6147ec1ce793f2e 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ We do try to work around some browser bugs, but on the whole we don't use polyfi However, many functions can be mapped via [polyfill.io](https://polyfill.io/) and thus the compatibility can be increased. ```html -<script id="polyfill" src="https://polyfill.io/v3/polyfill.min.js?feat" +<script id="polyfill" src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.fill,Array.prototype.filter,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.sort,ArrayBuffer,atob,CustomEvent,DataView,document,Document,DocumentFragment,Element,Event,fetch,globalThis,HTMLDocument,HTMLTemplateElement,Intl,JSON,Map,Math.log2,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.freeze,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,Set,String.prototype.endsWith,String.prototype.matchAll,String.prototype.padStart,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.iterator,Uint16Array,Uint8Array,URL,WeakMap,WeakSet" crossorigin="anonymous" referrerpolicy="no-referrer"></script> ``` diff --git a/application/source/logging/handler/console.mjs b/application/source/logging/handler/console.mjs index 7a76fd284e624e56c5f692ff4f261369bf5dd0a0..b5cb4b3adc0d5d2922d7776f7da8b9aee9251957 100644 --- a/application/source/logging/handler/console.mjs +++ b/application/source/logging/handler/console.mjs @@ -5,22 +5,22 @@ * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html */ -import {Base} from '../../types/base.mjs'; import {getGlobalObject} from "../../types/global.mjs"; import {Handler} from '../handler.mjs'; import {LogEntry} from "../logentry.mjs"; +import {TRACE, WARN, DEBUG, ERROR, FATAL, INFO} from "../logger.mjs"; export {ConsoleHandler} /** * You can create an object of the class simply by using the namespace `new Monster.Logging.Handler.ConsoleHandler()`. - * + * * @license AGPLv3 * @since 1.5.0 * @copyright schukai GmbH * @memberOf Monster.Logging.Handler */ - class ConsoleHandler extends Handler { +class ConsoleHandler extends Handler { constructor() { super(); } @@ -38,7 +38,29 @@ export {ConsoleHandler} if (super.log(entry)) { let console = getGlobalObject('console'); if (!console) return false; - console.log(entry.toString()); + + if (!console.error) console.error = console.log; + if (!console.warn) console.warn = console.log; + + switch (entry.getLogLevel()) { + case TRACE: + case DEBUG: + case INFO: + console.log(entry.toString()); + break; + case FATAL: + case ERROR: + console.error(entry.toString()); + break; + case WARN: + console.warn(entry.toString()); + break; + default: + console.log(entry.toString()); + break; + + } + return true; } diff --git a/development/makefiles/project.mk b/development/makefiles/project.mk index 8c940363934f7d4ec940d19dd323f1883242d64a..6d8946ff8469a883706936177a0035d085c0b07b 100644 --- a/development/makefiles/project.mk +++ b/development/makefiles/project.mk @@ -21,11 +21,11 @@ test-browser-monster: create-polyfill-monster $(QUIET) $(SED) -i "1 i /** this file was created automatically by the make target test-browser-monster */" $(TEST_PATH)web/import.js $(ESBUILD) --platform=browser --sourcemap=inline --external:jsdom --external:process --external:crypto --bundle $(TEST_PATH)web/import.js --outfile=$(TEST_PATH)web/tests.js # $(QUIET) $(CD) $(MONSTER_BUILD_TEST_BROWSER_DIR); $(WEBPACK) ; $(CD) - - $(QUIET) $(SED) -i -E "/<h1/s_.*_ <h1 style='margin-bottom: 0.1em;'>Monster $(PROJECT_VERSION)</h1>_" $(TEST_PATH)web/test.html $(TEST_PATH)web/monster.html $(TEST_PATH)web/monster-dev.html - $(QUIET) $(SED) -i -E "/id=\"lastupdate\"/s_.*_ <div id=\"lastupdate\" style='font-size:0.7em'>last update $(shell date)</div>_" $(TEST_PATH)web/test.html $(TEST_PATH)web/monster.html $(TEST_PATH)web/monster-dev.html - $(QUIET) $(SED) -i -E "s_src=\"([\"]*)\.js.*\"_src=\"\1.js?r=$(shell date +"%T")\"_" $(TEST_PATH)web/test.html $(TEST_PATH)web/monster.html $(TEST_PATH)web/monster-dev.html - $(QUIET) $(SED) -i -E "s_dist/([0-9]+\.[0-9]+\.[0-9]+)*/dist/monster_dist/$(PROJECT_VERSION)/dist/monster_" $(TEST_PATH)web/monster.html $(TEST_PATH)web/monster-dev.html - #$(QUIET) if $(OPENBROWSER) ; then google-chrome --profile-directory="Default" $(TEST_PATH)web/test.html ; fi +# $(QUIET) $(SED) -i -E "/<h1/s_.*_ <h1 style='margin-bottom: 0.1em;'>Monster $(PROJECT_VERSION)</h1>_" $(TEST_PATH)web/test.html $(TEST_PATH)web/monster.html $(TEST_PATH)web/monster-dev.html +# $(QUIET) $(SED) -i -E "/id=\"lastupdate\"/s_.*_ <div id=\"lastupdate\" style='font-size:0.7em'>last update $(shell date)</div>_" $(TEST_PATH)web/test.html $(TEST_PATH)web/monster.html $(TEST_PATH)web/monster-dev.html +# $(QUIET) $(SED) -i -E "s_src=\"([\"]*)\.js.*\"_src=\"\1.js?r=$(shell date +"%T")\"_" $(TEST_PATH)web/test.html $(TEST_PATH)web/monster.html $(TEST_PATH)web/monster-dev.html +# $(QUIET) $(SED) -i -E "s_dist/([0-9]+\.[0-9]+\.[0-9]+)*/dist/monster_dist/$(PROJECT_VERSION)/dist/monster_" $(TEST_PATH)web/monster.html $(TEST_PATH)web/monster-dev.html +# #$(QUIET) if $(OPENBROWSER) ; then google-chrome --profile-directory="Default" $(TEST_PATH)web/test.html ; fi .PHONY: web-to-s3 diff --git a/development/script/web-test.sh b/development/script/web-test.sh index 01df06bcd8d75f31fddd0a6d0f1cdcb8ef130760..355510a764c0bc06ed109b13ae86a27297b42319 100755 --- a/development/script/web-test.sh +++ b/development/script/web-test.sh @@ -16,9 +16,6 @@ sed -i "1 i import \"./prepare.js\";" ${TEST_PATH}web/import.js sed -i "1 i /** this file was created automatically by the make target test-browser-monster */" ${TEST_PATH}web/import.js npx esbuild --platform=browser --sourcemap=inline --external:jsdom --external:process --external:crypto --bundle ${TEST_PATH}web/import.js --outfile=${TEST_PATH}web/tests.js - -sed -i -E "/<h1/s_.*_ <h1 style='margin-bottom: 0.1em;'>Monster ${VERSION}</h1>_" ${TEST_PATH}web/test.html ${TEST_PATH}web/monster.html ${TEST_PATH}web/monster-dev.html -sed -i -E "/id=\"lastupdate\"/s_.*_ <div id=\"lastupdate\" style='font-size:0.7em'>last update $(date)</div>_" ${TEST_PATH}web/test.html ${TEST_PATH}web/monster.html ${TEST_PATH}web/monster-dev.html -sed -i -E "s_src=\"([\"]*)\.js.*\"_src=\"\1.js?r=$(date +"%T")\"_" ${TEST_PATH}web/test.html ${TEST_PATH}web/monster.html ${TEST_PATH}web/monster-dev.html -sed -i -E "s_dist/([0-9]+\.[0-9]+\.[0-9]+)*/dist/monster_dist/${VERSION}/dist/monster_" ${TEST_PATH}web/monster.html ${TEST_PATH}web/monster-dev.html + + diff --git a/development/test/cases/logging/handler/console.mjs b/development/test/cases/logging/handler/console.mjs index a2cea8069334bdb3916a657a647c84f6d9e1c1cd..06c87520e10a272ec48f97d92bd83404d452e65d 100644 --- a/development/test/cases/logging/handler/console.mjs +++ b/development/test/cases/logging/handler/console.mjs @@ -1,7 +1,7 @@ import {expect} from "chai"; import {ConsoleHandler} from "../../../../../application/source/logging/handler/console.mjs"; import {LogEntry} from "../../../../../application/source/logging/logentry.mjs"; -import {FATAL} from "../../../../../application/source/logging/logger.mjs"; +import {TRACE, WARN, DEBUG, ERROR, FATAL, INFO} from "../../../../../application/source/logging/logger.mjs"; describe('Logging', function () { @@ -12,7 +12,27 @@ describe('Logging', function () { }); it('should log to console', function () { - expect(new ConsoleHandler().setAll().log(new LogEntry(FATAL, [1, true, 'message']))).to.be.true; + expect(new ConsoleHandler().setAll().log(new LogEntry(FATAL, [1, true, 'fatal']))).to.be.true; + }); + + it('should log to console', function () { + expect(new ConsoleHandler().setAll().log(new LogEntry(TRACE, [1, true, 'trace']))).to.be.true; + }); + + it('should log to console', function () { + expect(new ConsoleHandler().setAll().log(new LogEntry(WARN, [1, true, 'warn']))).to.be.true; + }); + + it('should log to console', function () { + expect(new ConsoleHandler().setAll().log(new LogEntry(DEBUG, [1, true, 'debug']))).to.be.true; + }); + + it('should log to console', function () { + expect(new ConsoleHandler().setAll().log(new LogEntry(ERROR, [1, true, 'error']))).to.be.true; + }); + + it('should log to console', function () { + expect(new ConsoleHandler().setAll().log(new LogEntry(INFO, [1, true, 'info']))).to.be.true; }); }); diff --git a/development/test/web/test.html b/development/test/web/test.html index eb1ffc71ee1ddd86bd6c995e7725dbadd284ff53..912787a22d9e8f082dab8b92f9fea9c26f64fdad 100644 --- a/development/test/web/test.html +++ b/development/test/web/test.html @@ -5,7 +5,7 @@ <title>Mocha Monster</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <link rel="stylesheet" href="mocha.css"/> - <script id="polyfill" + <script id="polyfill" src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.fill,Array.prototype.filter,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.sort,ArrayBuffer,atob,CustomEvent,DataView,document,Document,DocumentFragment,Element,Event,fetch,globalThis,HTMLDocument,HTMLTemplateElement,Intl,JSON,Map,Math.log2,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.freeze,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,Set,String.prototype.endsWith,String.prototype.matchAll,String.prototype.padStart,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.iterator,Uint16Array,Uint8Array,URL,WeakMap,WeakSet" src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.fill,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.sort,ArrayBuffer,atob,DataView,document,DocumentFragment,Element,Event,globalThis,HTMLDocument,HTMLTemplateElement,JSON,Map,Math.log2,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.getOwnPropertyDescriptor,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,Set,String.prototype.endsWith,String.prototype.matchAll,String.prototype.padStart,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.iterator,WeakMap,WeakSet" crossorigin="anonymous" referrerpolicy="no-referrer"></script> @@ -14,7 +14,7 @@ </head> <body> <div id="headline" style="display: flex;align-items: center;justify-content: center;flex-direction: column;"> - <h1 style='margin-bottom: 0.1em;'>Monster 0.1.8</h1> + <h1 style='margin-bottom: 0.1em;'>Monster 2.0.7</h1> <div id="lastupdate" style='font-size:0.7em'>last update So 7. Aug 19:45:23 CEST 2022</div> </div> <div id="mocks"></div> diff --git a/development/test/web/tests.js b/development/test/web/tests.js index 7b802c0c4620a8fbab8cd247cf116d1b75b574dd..369975d698b723d925c1046da4d6e82879a0f093 100644 --- a/development/test/web/tests.js +++ b/development/test/web/tests.js @@ -35,9 +35,9 @@ mod )); - // test/node_modules/.pnpm/assertion-error@1.1.0/node_modules/assertion-error/index.js + // development/node_modules/.pnpm/assertion-error@1.1.0/node_modules/assertion-error/index.js var require_assertion_error = __commonJS({ - "test/node_modules/.pnpm/assertion-error@1.1.0/node_modules/assertion-error/index.js"(exports, module) { + "development/node_modules/.pnpm/assertion-error@1.1.0/node_modules/assertion-error/index.js"(exports, module) { function exclude() { var excludes = [].slice.call(arguments); function excludeProps(res, obj) { @@ -86,9 +86,9 @@ } }); - // test/node_modules/.pnpm/pathval@1.1.1/node_modules/pathval/index.js + // development/node_modules/.pnpm/pathval@1.1.1/node_modules/pathval/index.js var require_pathval = __commonJS({ - "test/node_modules/.pnpm/pathval@1.1.1/node_modules/pathval/index.js"(exports, module) { + "development/node_modules/.pnpm/pathval@1.1.1/node_modules/pathval/index.js"(exports, module) { "use strict"; function hasProperty(obj, name) { if (typeof obj === "undefined" || obj === null) { @@ -186,9 +186,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/flag.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/flag.js var require_flag = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/flag.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/flag.js"(exports, module) { module.exports = function flag(obj, key, value) { var flags = obj.__flags || (obj.__flags = /* @__PURE__ */ Object.create(null)); if (arguments.length === 3) { @@ -200,9 +200,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/test.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/test.js var require_test = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/test.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/test.js"(exports, module) { var flag = require_flag(); module.exports = function test(obj, args) { var negate = flag(obj, "negate"), expr = args[0]; @@ -211,9 +211,9 @@ } }); - // test/node_modules/.pnpm/type-detect@4.0.8/node_modules/type-detect/type-detect.js + // development/node_modules/.pnpm/type-detect@4.0.8/node_modules/type-detect/type-detect.js var require_type_detect = __commonJS({ - "test/node_modules/.pnpm/type-detect@4.0.8/node_modules/type-detect/type-detect.js"(exports, module) { + "development/node_modules/.pnpm/type-detect@4.0.8/node_modules/type-detect/type-detect.js"(exports, module) { (function(global4, factory) { typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global4.typeDetect = factory(); })(exports, function() { @@ -330,9 +330,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/expectTypes.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/expectTypes.js var require_expectTypes = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/expectTypes.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/expectTypes.js"(exports, module) { var AssertionError2 = require_assertion_error(); var flag = require_flag(); var type = require_type_detect(); @@ -364,18 +364,18 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getActual.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getActual.js var require_getActual = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getActual.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getActual.js"(exports, module) { module.exports = function getActual(obj, args) { return args.length > 4 ? args[4] : obj._obj; }; } }); - // test/node_modules/.pnpm/get-func-name@2.0.0/node_modules/get-func-name/index.js + // development/node_modules/.pnpm/get-func-name@2.0.0/node_modules/get-func-name/index.js var require_get_func_name = __commonJS({ - "test/node_modules/.pnpm/get-func-name@2.0.0/node_modules/get-func-name/index.js"(exports, module) { + "development/node_modules/.pnpm/get-func-name@2.0.0/node_modules/get-func-name/index.js"(exports, module) { "use strict"; var toString = Function.prototype.toString; var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; @@ -398,15 +398,15 @@ } }); - // (disabled):test/node_modules/.pnpm/util@0.12.4/node_modules/util/util.js + // (disabled):development/node_modules/.pnpm/util@0.12.4/node_modules/util/util.js var require_util = __commonJS({ - "(disabled):test/node_modules/.pnpm/util@0.12.4/node_modules/util/util.js"() { + "(disabled):development/node_modules/.pnpm/util@0.12.4/node_modules/util/util.js"() { } }); - // test/node_modules/.pnpm/loupe@2.3.4/node_modules/loupe/loupe.js + // development/node_modules/.pnpm/loupe@2.3.4/node_modules/loupe/loupe.js var require_loupe = __commonJS({ - "test/node_modules/.pnpm/loupe@2.3.4/node_modules/loupe/loupe.js"(exports, module) { + "development/node_modules/.pnpm/loupe@2.3.4/node_modules/loupe/loupe.js"(exports, module) { (function(global4, factory) { typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global4 = typeof globalThis !== "undefined" ? globalThis : global4 || self, factory(global4.loupe = {})); })(exports, function(exports2) { @@ -1050,9 +1050,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/config.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/config.js var require_config = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/config.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/config.js"(exports, module) { module.exports = { includeStack: false, showDiff: true, @@ -1063,9 +1063,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/inspect.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/inspect.js var require_inspect = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/inspect.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/inspect.js"(exports, module) { var getName = require_get_func_name(); var loupe = require_loupe(); var config2 = require_config(); @@ -1082,9 +1082,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/objDisplay.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/objDisplay.js var require_objDisplay = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/objDisplay.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/objDisplay.js"(exports, module) { var inspect = require_inspect(); var config2 = require_config(); module.exports = function objDisplay(obj) { @@ -1107,9 +1107,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getMessage.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getMessage.js var require_getMessage = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getMessage.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getMessage.js"(exports, module) { var flag = require_flag(); var getActual = require_getActual(); var objDisplay = require_objDisplay(); @@ -1130,9 +1130,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/transferFlags.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/transferFlags.js var require_transferFlags = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/transferFlags.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/transferFlags.js"(exports, module) { module.exports = function transferFlags(assertion, object, includeAll) { var flags = assertion.__flags || (assertion.__flags = /* @__PURE__ */ Object.create(null)); if (!object.__flags) { @@ -1148,9 +1148,9 @@ } }); - // test/node_modules/.pnpm/deep-eql@3.0.1/node_modules/deep-eql/index.js + // development/node_modules/.pnpm/deep-eql@3.0.1/node_modules/deep-eql/index.js var require_deep_eql = __commonJS({ - "test/node_modules/.pnpm/deep-eql@3.0.1/node_modules/deep-eql/index.js"(exports, module) { + "development/node_modules/.pnpm/deep-eql@3.0.1/node_modules/deep-eql/index.js"(exports, module) { "use strict"; var type = require_type_detect(); function FakeMap() { @@ -1404,9 +1404,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/isProxyEnabled.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/isProxyEnabled.js var require_isProxyEnabled = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/isProxyEnabled.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/isProxyEnabled.js"(exports, module) { var config2 = require_config(); module.exports = function isProxyEnabled() { return config2.useProxy && typeof Proxy !== "undefined" && typeof Reflect !== "undefined"; @@ -1414,9 +1414,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addProperty.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addProperty.js var require_addProperty = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addProperty.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addProperty.js"(exports, module) { var chai2 = require_chai(); var flag = require_flag(); var isProxyEnabled = require_isProxyEnabled(); @@ -1446,9 +1446,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addLengthGuard.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addLengthGuard.js var require_addLengthGuard = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addLengthGuard.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addLengthGuard.js"(exports, module) { var fnLengthDesc = Object.getOwnPropertyDescriptor(function() { }, "length"); module.exports = function addLengthGuard(fn, assertionName, isChainable) { @@ -1467,9 +1467,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getProperties.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getProperties.js var require_getProperties = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getProperties.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getProperties.js"(exports, module) { module.exports = function getProperties(object) { var result = Object.getOwnPropertyNames(object); function addProperty(property) { @@ -1487,9 +1487,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/proxify.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/proxify.js var require_proxify = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/proxify.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/proxify.js"(exports, module) { var config2 = require_config(); var flag = require_flag(); var getProperties = require_getProperties(); @@ -1563,9 +1563,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addMethod.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addMethod.js var require_addMethod = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addMethod.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addMethod.js"(exports, module) { var addLengthGuard = require_addLengthGuard(); var chai2 = require_chai(); var flag = require_flag(); @@ -1589,9 +1589,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteProperty.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteProperty.js var require_overwriteProperty = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteProperty.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteProperty.js"(exports, module) { var chai2 = require_chai(); var flag = require_flag(); var isProxyEnabled = require_isProxyEnabled(); @@ -1627,9 +1627,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteMethod.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteMethod.js var require_overwriteMethod = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteMethod.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteMethod.js"(exports, module) { var addLengthGuard = require_addLengthGuard(); var chai2 = require_chai(); var flag = require_flag(); @@ -1662,9 +1662,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addChainableMethod.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addChainableMethod.js var require_addChainableMethod = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addChainableMethod.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/addChainableMethod.js"(exports, module) { var addLengthGuard = require_addLengthGuard(); var chai2 = require_chai(); var flag = require_flag(); @@ -1738,9 +1738,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js var require_overwriteChainableMethod = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js"(exports, module) { var chai2 = require_chai(); var transferFlags = require_transferFlags(); module.exports = function overwriteChainableMethod(ctx, name, method, chainingBehavior) { @@ -1769,9 +1769,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/compareByInspect.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/compareByInspect.js var require_compareByInspect = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/compareByInspect.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/compareByInspect.js"(exports, module) { var inspect = require_inspect(); module.exports = function compareByInspect(a2, b) { return inspect(a2) < inspect(b) ? -1 : 1; @@ -1779,9 +1779,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js var require_getOwnEnumerablePropertySymbols = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js"(exports, module) { module.exports = function getOwnEnumerablePropertySymbols(obj) { if (typeof Object.getOwnPropertySymbols !== "function") return []; @@ -1792,9 +1792,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOwnEnumerableProperties.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOwnEnumerableProperties.js var require_getOwnEnumerableProperties = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOwnEnumerableProperties.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOwnEnumerableProperties.js"(exports, module) { var getOwnEnumerablePropertySymbols = require_getOwnEnumerablePropertySymbols(); module.exports = function getOwnEnumerableProperties(obj) { return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj)); @@ -1802,9 +1802,9 @@ } }); - // test/node_modules/.pnpm/check-error@1.0.2/node_modules/check-error/index.js + // development/node_modules/.pnpm/check-error@1.0.2/node_modules/check-error/index.js var require_check_error = __commonJS({ - "test/node_modules/.pnpm/check-error@1.0.2/node_modules/check-error/index.js"(exports, module) { + "development/node_modules/.pnpm/check-error@1.0.2/node_modules/check-error/index.js"(exports, module) { "use strict"; function compatibleInstance(thrown, errorLike) { return errorLike instanceof Error && thrown === errorLike; @@ -1867,9 +1867,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/isNaN.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/isNaN.js var require_isNaN = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/isNaN.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/isNaN.js"(exports, module) { function isNaN2(value) { return value !== value; } @@ -1877,9 +1877,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOperator.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOperator.js var require_getOperator = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOperator.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/getOperator.js"(exports, module) { var type = require_type_detect(); var flag = require_flag(); function isObjectType(obj) { @@ -1913,9 +1913,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/index.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/index.js var require_utils = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/index.js"(exports) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/utils/index.js"(exports) { var pathval = require_pathval(); exports.test = require_test(); exports.type = require_type_detect(); @@ -1948,9 +1948,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/assertion.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/assertion.js var require_assertion = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/assertion.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/assertion.js"(exports, module) { var config2 = require_config(); module.exports = function(_chai, util2) { var AssertionError2 = _chai.AssertionError, flag = util2.flag; @@ -2043,9 +2043,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/core/assertions.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/core/assertions.js var require_assertions = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/core/assertions.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/core/assertions.js"(exports, module) { module.exports = function(chai2, _) { var Assertion2 = chai2.Assertion, AssertionError2 = chai2.AssertionError, flag = _.flag; [ @@ -3241,9 +3241,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/expect.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/expect.js var require_expect = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/expect.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/expect.js"(exports, module) { module.exports = function(chai2, util2) { chai2.expect = function(val, message) { return new chai2.Assertion(val, message); @@ -3264,9 +3264,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/should.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/should.js var require_should = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/should.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/should.js"(exports, module) { module.exports = function(chai2, util2) { var Assertion2 = chai2.Assertion; function loadShould() { @@ -3332,9 +3332,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/assert.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/assert.js var require_assert = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/assert.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai/interface/assert.js"(exports, module) { module.exports = function(chai2, util2) { var Assertion2 = chai2.Assertion, flag = util2.flag; var assert2 = chai2.assert = function(express, errmsg) { @@ -3895,9 +3895,9 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai.js var require_chai = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai.js"(exports) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/lib/chai.js"(exports) { var used = []; exports.version = "4.3.3"; exports.AssertionError = require_assertion_error(); @@ -3925,18 +3925,17 @@ } }); - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/index.js + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/index.js var require_chai2 = __commonJS({ - "test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/index.js"(exports, module) { + "development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/index.js"(exports, module) { module.exports = require_chai(); } }); - // ../application/source/types/base.mjs + // application/source/types/base.mjs var Base; var init_base = __esm({ - "../application/source/types/base.mjs"() { - "use strict"; + "application/source/types/base.mjs"() { Base = class extends Object { toString() { return JSON.stringify(this); @@ -3945,7 +3944,7 @@ } }); - // ../application/source/types/is.mjs + // application/source/types/is.mjs function isIterable(value) { if (value === void 0) return false; @@ -4015,12 +4014,11 @@ return Number.isInteger(value); } var init_is = __esm({ - "../application/source/types/is.mjs"() { - "use strict"; + "application/source/types/is.mjs"() { } }); - // ../application/source/types/validate.mjs + // application/source/types/validate.mjs function validateIterable(value) { if (!isIterable(value)) { throw new TypeError("value is not iterable"); @@ -4089,13 +4087,12 @@ return value; } var init_validate = __esm({ - "../application/source/types/validate.mjs"() { - "use strict"; + "application/source/types/validate.mjs"() { init_is(); } }); - // ../application/source/types/global.mjs + // application/source/types/global.mjs function getGlobal() { return globalReference; } @@ -4117,8 +4114,7 @@ } var globalReference; var init_global = __esm({ - "../application/source/types/global.mjs"() { - "use strict"; + "application/source/types/global.mjs"() { init_validate(); (function() { if (typeof globalThis === "object") { @@ -4153,17 +4149,16 @@ } }); - // ../application/source/constants.mjs + // application/source/constants.mjs var internalSymbol, internalStateSymbol; var init_constants = __esm({ - "../application/source/constants.mjs"() { - "use strict"; + "application/source/constants.mjs"() { internalSymbol = Symbol("internalData"); internalStateSymbol = Symbol("state"); } }); - // ../application/source/types/typeof.mjs + // application/source/types/typeof.mjs function typeOf(value) { let type = {}.toString.call(value).match(/\s([a-zA-Z]+)/)[1]; if ("Object" === type) { @@ -4177,12 +4172,11 @@ return type.toLowerCase(); } var init_typeof = __esm({ - "../application/source/types/typeof.mjs"() { - "use strict"; + "application/source/types/typeof.mjs"() { } }); - // ../application/source/data/extend.mjs + // application/source/data/extend.mjs function extend() { let o, i; for (i = 0; i < arguments.length; i++) { @@ -4220,18 +4214,16 @@ return o; } var init_extend = __esm({ - "../application/source/data/extend.mjs"() { - "use strict"; + "application/source/data/extend.mjs"() { init_is(); init_typeof(); } }); - // ../application/source/types/id.mjs + // application/source/types/id.mjs var internalCounter, ID; var init_id = __esm({ - "../application/source/types/id.mjs"() { - "use strict"; + "application/source/types/id.mjs"() { init_base(); init_validate(); internalCounter = /* @__PURE__ */ new Map(); @@ -4256,7 +4248,7 @@ } }); - // ../application/source/util/clone.mjs + // application/source/util/clone.mjs function clone(obj) { if (null === obj) { return obj; @@ -4336,8 +4328,7 @@ return copy; } var init_clone = __esm({ - "../application/source/util/clone.mjs"() { - "use strict"; + "application/source/util/clone.mjs"() { init_global(); init_is(); init_typeof(); @@ -4345,11 +4336,10 @@ } }); - // ../application/source/types/stack.mjs + // application/source/types/stack.mjs var Stack; var init_stack = __esm({ - "../application/source/types/stack.mjs"() { - "use strict"; + "application/source/types/stack.mjs"() { init_base(); Stack = class extends Base { constructor() { @@ -4383,7 +4373,7 @@ } }); - // ../application/source/data/pathfinder.mjs + // application/source/data/pathfinder.mjs function iterate(subject, path, check) { const result = /* @__PURE__ */ new Map(); if (isObject(subject) || isArray(subject)) { @@ -4515,8 +4505,7 @@ } var DELIMITER, WILDCARD, Pathfinder; var init_pathfinder = __esm({ - "../application/source/data/pathfinder.mjs"() { - "use strict"; + "application/source/data/pathfinder.mjs"() { init_base(); init_is(); init_stack(); @@ -4563,7 +4552,7 @@ } }); - // ../application/source/data/transformer.mjs + // application/source/data/transformer.mjs function disassemble(command) { validateString(command); let placeholder = /* @__PURE__ */ new Map(); @@ -4816,8 +4805,7 @@ } var Transformer; var init_transformer = __esm({ - "../application/source/data/transformer.mjs"() { - "use strict"; + "application/source/data/transformer.mjs"() { init_base(); init_global(); init_id(); @@ -4851,11 +4839,10 @@ } }); - // ../application/source/data/pipe.mjs + // application/source/data/pipe.mjs var DELIMITER2, Pipe; var init_pipe = __esm({ - "../application/source/data/pipe.mjs"() { - "use strict"; + "application/source/data/pipe.mjs"() { init_base(); init_validate(); init_transformer(); @@ -4883,11 +4870,10 @@ } }); - // ../application/source/dom/constants.mjs + // application/source/dom/constants.mjs var DEFAULT_THEME, ATTRIBUTE_PREFIX, ATTRIBUTE_OPTIONS, ATTRIBUTE_OPTIONS_SELECTOR, ATTRIBUTE_THEME_PREFIX, ATTRIBUTE_THEME_NAME, ATTRIBUTE_UPDATER_ATTRIBUTES, ATTRIBUTE_UPDATER_SELECT_THIS, ATTRIBUTE_UPDATER_REPLACE, ATTRIBUTE_UPDATER_INSERT, ATTRIBUTE_UPDATER_INSERT_REFERENCE, ATTRIBUTE_UPDATER_REMOVE, ATTRIBUTE_UPDATER_BIND, ATTRIBUTE_TEMPLATE_PREFIX, ATTRIBUTE_ROLE, ATTRIBUTE_DISABLED, ATTRIBUTE_VALUE, ATTRIBUTE_OBJECTLINK, ATTRIBUTE_ERRORMESSAGE, objectUpdaterLinkSymbol, TAG_SCRIPT, TAG_LINK, ATTRIBUTE_ID, ATTRIBUTE_CLASS, ATTRIBUTE_TITLE, ATTRIBUTE_SRC, ATTRIBUTE_HREF, ATTRIBUTE_TYPE, ATTRIBUTE_NONCE; var init_constants2 = __esm({ - "../application/source/dom/constants.mjs"() { - "use strict"; + "application/source/dom/constants.mjs"() { DEFAULT_THEME = "monster"; ATTRIBUTE_PREFIX = "data-monster-"; ATTRIBUTE_OPTIONS = ATTRIBUTE_PREFIX + "options"; @@ -4920,7 +4906,7 @@ } }); - // ../application/source/types/tokenlist.mjs + // application/source/types/tokenlist.mjs function toggleValue(token) { if (!(this instanceof TokenList)) throw Error("must be called with TokenList.call"); @@ -4935,8 +4921,7 @@ } var TokenList; var init_tokenlist = __esm({ - "../application/source/types/tokenlist.mjs"() { - "use strict"; + "application/source/types/tokenlist.mjs"() { init_is(); init_validate(); init_base(); @@ -5065,11 +5050,10 @@ } }); - // ../application/source/types/queue.mjs + // application/source/types/queue.mjs var Queue; var init_queue = __esm({ - "../application/source/types/queue.mjs"() { - "use strict"; + "application/source/types/queue.mjs"() { init_base(); Queue = class extends Base { constructor() { @@ -5103,11 +5087,10 @@ } }); - // ../application/source/types/uniquequeue.mjs + // application/source/types/uniquequeue.mjs var UniqueQueue; var init_uniquequeue = __esm({ - "../application/source/types/uniquequeue.mjs"() { - "use strict"; + "application/source/types/uniquequeue.mjs"() { init_queue(); init_validate(); UniqueQueue = class extends Queue { @@ -5140,11 +5123,10 @@ } }); - // ../application/source/types/observer.mjs + // application/source/types/observer.mjs var Observer; var init_observer = __esm({ - "../application/source/types/observer.mjs"() { - "use strict"; + "application/source/types/observer.mjs"() { init_base(); init_is(); init_tokenlist(); @@ -5205,11 +5187,10 @@ } }); - // ../application/source/types/observerlist.mjs + // application/source/types/observerlist.mjs var ObserverList; var init_observerlist = __esm({ - "../application/source/types/observerlist.mjs"() { - "use strict"; + "application/source/types/observerlist.mjs"() { init_base(); init_observer(); init_validate(); @@ -5255,7 +5236,7 @@ } }); - // ../application/source/types/proxyobserver.mjs + // application/source/types/proxyobserver.mjs function getHandler() { const proxy = this; const handler = { @@ -5340,8 +5321,7 @@ } var ProxyObserver; var init_proxyobserver = __esm({ - "../application/source/types/proxyobserver.mjs"() { - "use strict"; + "application/source/types/proxyobserver.mjs"() { init_base(); init_is(); init_observer(); @@ -5391,7 +5371,7 @@ } }); - // ../application/source/types/mediatype.mjs + // application/source/types/mediatype.mjs function parseMediaType(mediatype) { const regex = /(?<type>[A-Za-z]+|\*)\/(?<subtype>([a-zA-Z0-9.\+_\-]+)|\*|)(?<parameter>\s*;\s*([a-zA-Z0-9]+)\s*(=\s*("?[A-Za-z0-9_\-]+"?))?)*/g; const result = regex.exec(validateString(mediatype)); @@ -5429,8 +5409,7 @@ } var internal, MediaType; var init_mediatype = __esm({ - "../application/source/types/mediatype.mjs"() { - "use strict"; + "application/source/types/mediatype.mjs"() { init_base(); init_is(); init_validate(); @@ -5478,7 +5457,7 @@ } }); - // ../application/source/types/dataurl.mjs + // application/source/types/dataurl.mjs function parseDataURL(dataurl) { validateString(dataurl); dataurl = dataurl.trim(); @@ -5511,8 +5490,7 @@ } var internal2, DataUrl; var init_dataurl = __esm({ - "../application/source/types/dataurl.mjs"() { - "use strict"; + "application/source/types/dataurl.mjs"() { init_base(); init_is(); init_mediatype(); @@ -5549,7 +5527,7 @@ } }); - // ../application/source/data/diff.mjs + // application/source/data/diff.mjs function diff(first, second) { return doDiff(first, second); } @@ -5638,14 +5616,13 @@ return operator; } var init_diff = __esm({ - "../application/source/data/diff.mjs"() { - "use strict"; + "application/source/data/diff.mjs"() { init_is(); init_typeof(); } }); - // ../application/source/util/trimspaces.mjs + // application/source/util/trimspaces.mjs function trimSpaces(value) { validateString(value); let placeholder = /* @__PURE__ */ new Map(); @@ -5671,15 +5648,14 @@ return value; } var init_trimspaces = __esm({ - "../application/source/util/trimspaces.mjs"() { - "use strict"; + "application/source/util/trimspaces.mjs"() { init_id(); init_is(); init_validate(); } }); - // ../application/source/dom/util.mjs + // application/source/dom/util.mjs function getDocument() { let document2 = getGlobal()?.["document"]; if (typeof document2 !== "object") { @@ -5702,14 +5678,13 @@ return template.content; } var init_util = __esm({ - "../application/source/dom/util.mjs"() { - "use strict"; + "application/source/dom/util.mjs"() { init_global(); init_validate(); } }); - // ../application/source/dom/events.mjs + // application/source/dom/events.mjs function fireEvent(element2, type) { const document2 = getDocument(); if (element2 instanceof HTMLElement) { @@ -5767,15 +5742,14 @@ return void 0; } var init_events = __esm({ - "../application/source/dom/events.mjs"() { - "use strict"; + "application/source/dom/events.mjs"() { init_is(); init_validate(); init_util(); } }); - // ../application/source/dom/theme.mjs + // application/source/dom/theme.mjs function getDocumentTheme() { let document2 = getGlobalObject("document"); let name = DEFAULT_THEME; @@ -5790,8 +5764,7 @@ } var Theme; var init_theme = __esm({ - "../application/source/dom/theme.mjs"() { - "use strict"; + "application/source/dom/theme.mjs"() { init_base(); init_global(); init_validate(); @@ -5809,7 +5782,7 @@ } }); - // ../application/source/dom/template.mjs + // application/source/dom/template.mjs function findDocumentTemplate(id, currentNode) { validateString(id); const document2 = getGlobalObject("document"); @@ -5865,8 +5838,7 @@ } var Template; var init_template = __esm({ - "../application/source/dom/template.mjs"() { - "use strict"; + "application/source/dom/template.mjs"() { init_base(); init_global(); init_validate(); @@ -5889,7 +5861,7 @@ } }); - // ../application/source/dom/updater.mjs + // application/source/dom/updater.mjs function getCheckStateCallback() { const self2 = this; return function(current) { @@ -6274,8 +6246,7 @@ } var Updater, symbol; var init_updater = __esm({ - "../application/source/dom/updater.mjs"() { - "use strict"; + "application/source/dom/updater.mjs"() { init_constants(); init_diff(); init_pathfinder(); @@ -6359,7 +6330,7 @@ } }); - // ../application/source/dom/attributes.mjs + // application/source/dom/attributes.mjs function findClosestObjectLink(element2) { return findClosestByAttribute(element2, ATTRIBUTE_OBJECTLINK); } @@ -6491,8 +6462,7 @@ return void 0; } var init_attributes = __esm({ - "../application/source/dom/attributes.mjs"() { - "use strict"; + "application/source/dom/attributes.mjs"() { init_global(); init_tokenlist(); init_validate(); @@ -6500,13 +6470,14 @@ } }); - // ../application/source/dom/customelement.mjs + // application/source/dom/customelement.mjs var customelement_exports = {}; __export(customelement_exports, { CustomElement: () => CustomElement, assembleMethodSymbol: () => assembleMethodSymbol, assignUpdaterToElement: () => assignUpdaterToElement, attributeObserverSymbol: () => attributeObserverSymbol, + getSlottedElements: () => getSlottedElements, initMethodSymbol: () => initMethodSymbol, registerCustomElement: () => registerCustomElement }); @@ -6771,8 +6742,7 @@ } var initMethodSymbol, assembleMethodSymbol, attributeObserverSymbol, CustomElement; var init_customelement = __esm({ - "../application/source/dom/customelement.mjs"() { - "use strict"; + "application/source/dom/customelement.mjs"() { init_constants(); init_extend(); init_pathfinder(); @@ -6924,7 +6894,7 @@ } }); - // ../application/source/dom/customcontrol.mjs + // application/source/dom/customcontrol.mjs var customcontrol_exports = {}; __export(customcontrol_exports, { CustomControl: () => CustomControl @@ -6944,8 +6914,7 @@ } var attachedInternalSymbol, CustomControl; var init_customcontrol = __esm({ - "../application/source/dom/customcontrol.mjs"() { - "use strict"; + "application/source/dom/customcontrol.mjs"() { init_extend(); init_constants2(); init_customelement(); @@ -7015,7 +6984,7 @@ } }); - // ../application/source/dom/ready.mjs + // application/source/dom/ready.mjs var ready_exports = {}; __export(ready_exports, { domReady: () => domReady, @@ -7023,8 +6992,7 @@ }); var domReady, windowReady; var init_ready = __esm({ - "../application/source/dom/ready.mjs"() { - "use strict"; + "application/source/dom/ready.mjs"() { init_util(); domReady = new Promise((resolve) => { const document2 = getDocument(); @@ -7046,9 +7014,9 @@ } }); - // test/node_modules/.pnpm/pvtsutils@1.3.2/node_modules/pvtsutils/build/index.js + // development/node_modules/.pnpm/pvtsutils@1.3.2/node_modules/pvtsutils/build/index.js var require_build = __commonJS({ - "test/node_modules/.pnpm/pvtsutils@1.3.2/node_modules/pvtsutils/build/index.js"(exports) { + "development/node_modules/.pnpm/pvtsutils@1.3.2/node_modules/pvtsutils/build/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ARRAY_BUFFER_NAME = "[object ArrayBuffer]"; @@ -7395,7 +7363,7 @@ } }); - // test/node_modules/.pnpm/pvutils@1.1.3/node_modules/pvutils/build/utils.es.js + // development/node_modules/.pnpm/pvutils@1.1.3/node_modules/pvutils/build/utils.es.js function utilFromBase(inputBuffer, inputBase) { let result = 0; if (inputBuffer.length === 1) { @@ -7533,12 +7501,12 @@ } var log2; var init_utils_es = __esm({ - "test/node_modules/.pnpm/pvutils@1.1.3/node_modules/pvutils/build/utils.es.js"() { + "development/node_modules/.pnpm/pvutils@1.1.3/node_modules/pvutils/build/utils.es.js"() { log2 = Math.log(2); } }); - // test/node_modules/.pnpm/asn1js@3.0.5/node_modules/asn1js/build/index.es.js + // development/node_modules/.pnpm/asn1js@3.0.5/node_modules/asn1js/build/index.es.js var index_es_exports = {}; __export(index_es_exports, { Any: () => Any, @@ -8310,7 +8278,7 @@ } var pvtsutils, ViewWriter, powers2, digitsString, NAME, VALUE_HEX_VIEW, IS_HEX_ONLY, ID_BLOCK, TAG_CLASS, TAG_NUMBER, IS_CONSTRUCTED, FROM_BER, TO_BER, LOCAL, EMPTY_STRING, EMPTY_BUFFER, EMPTY_VIEW, END_OF_CONTENT_NAME, OCTET_STRING_NAME, BIT_STRING_NAME, LocalBaseBlock, ValueBlock, LocalIdentificationBlock, LocalLengthBlock, typeStore, BaseBlock, BaseStringBlock, LocalPrimitiveValueBlock, _a$w, Primitive, LocalConstructedValueBlock, _a$v, Constructed, LocalEndOfContentValueBlock, _a$u, EndOfContent, _a$t, Null, LocalBooleanValueBlock, _a$s, Boolean2, LocalOctetStringValueBlock, _a$r, OctetString, LocalBitStringValueBlock, _a$q, BitString, _a$p, LocalIntegerValueBlock, _a$o, Integer, _a$n, Enumerated, LocalSidValueBlock, LocalObjectIdentifierValueBlock, _a$m, ObjectIdentifier, LocalRelativeSidValueBlock, LocalRelativeObjectIdentifierValueBlock, _a$l, RelativeObjectIdentifier, _a$k, Sequence, _a$j, Set2, LocalStringValueBlock, LocalSimpleStringValueBlock, LocalSimpleStringBlock, LocalUtf8StringValueBlock, _a$i, Utf8String, LocalBmpStringValueBlock, _a$h, BmpString, LocalUniversalStringValueBlock, _a$g, UniversalString, _a$f, NumericString, _a$e, PrintableString, _a$d, TeletexString, _a$c, VideotexString, _a$b, IA5String, _a$a, GraphicString, _a$9, VisibleString, _a$8, GeneralString, _a$7, CharacterString, _a$6, UTCTime, _a$5, GeneralizedTime, _a$4, DATE, _a$3, TimeOfDay, _a$2, DateTime, _a$1, Duration, _a, TIME, Any, Choice, Repeated, RawData; var init_index_es = __esm({ - "test/node_modules/.pnpm/asn1js@3.0.5/node_modules/asn1js/build/index.es.js"() { + "development/node_modules/.pnpm/asn1js@3.0.5/node_modules/asn1js/build/index.es.js"() { pvtsutils = __toESM(require_build()); init_utils_es(); ViewWriter = class { @@ -10537,10 +10505,10 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/enums.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/enums.js var AsnTypeTypes, AsnPropTypes; var init_enums = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/enums.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/enums.js"() { (function(AsnTypeTypes2) { AsnTypeTypes2[AsnTypeTypes2["Sequence"] = 0] = "Sequence"; AsnTypeTypes2[AsnTypeTypes2["Set"] = 1] = "Set"; @@ -10578,7 +10546,7 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/converters.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/converters.js function createStringConverter(Asn1Type) { return { fromASN: (value) => value.valueBlock.value, @@ -10637,7 +10605,7 @@ ${values.join("\n")}` : `${blockName} :`; } var AsnAnyConverter, AsnIntegerConverter, AsnEnumeratedConverter, AsnBitStringConverter, AsnObjectIdentifierConverter, AsnBooleanConverter, AsnOctetStringConverter, AsnUtf8StringConverter, AsnBmpStringConverter, AsnUniversalStringConverter, AsnNumericStringConverter, AsnPrintableStringConverter, AsnTeletexStringConverter, AsnVideotexStringConverter, AsnIA5StringConverter, AsnGraphicStringConverter, AsnVisibleStringConverter, AsnGeneralStringConverter, AsnCharacterStringConverter, AsnUTCTimeConverter, AsnGeneralizedTimeConverter, AsnNullConverter; var init_converters = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/converters.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/converters.js"() { init_index_es(); init_enums(); AsnAnyConverter = { @@ -10706,33 +10674,33 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/bit_string.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/bit_string.js var import_pvtsutils; var init_bit_string = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/bit_string.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/bit_string.js"() { init_index_es(); import_pvtsutils = __toESM(require_build()); } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/octet_string.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/octet_string.js var import_pvtsutils2; var init_octet_string = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/octet_string.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/octet_string.js"() { init_index_es(); import_pvtsutils2 = __toESM(require_build()); } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/index.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/index.js var init_types = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/index.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/types/index.js"() { init_bit_string(); init_octet_string(); } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/helper.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/helper.js function isConvertible(target) { if (typeof target === "function" && target.prototype) { if (target.prototype.toASN && target.prototype.fromASN) { @@ -10772,14 +10740,14 @@ ${values.join("\n")}` : `${blockName} :`; return true; } var init_helper = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/helper.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/helper.js"() { } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/schema.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/schema.js var AsnSchemaStorage; var init_schema = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/schema.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/schema.js"() { init_index_es(); init_enums(); init_helper(); @@ -10929,19 +10897,19 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/storage.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/storage.js var schemaStorage; var init_storage = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/storage.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/storage.js"() { init_schema(); schemaStorage = new AsnSchemaStorage(); } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/decorators.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/decorators.js var AsnType, AsnProp; var init_decorators = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/decorators.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/decorators.js"() { init_converters(); init_enums(); init_storage(); @@ -10976,10 +10944,10 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/errors/schema_validation.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/errors/schema_validation.js var AsnSchemaValidationError; var init_schema_validation = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/errors/schema_validation.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/errors/schema_validation.js"() { AsnSchemaValidationError = class extends Error { constructor() { super(...arguments); @@ -10989,17 +10957,17 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/errors/index.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/errors/index.js var init_errors = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/errors/index.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/errors/index.js"() { init_schema_validation(); } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/parser.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/parser.js var AsnParser; var init_parser = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/parser.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/parser.js"() { init_index_es(); init_enums(); init_converters(); @@ -11128,10 +11096,10 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/serializer.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/serializer.js var AsnSerializer; var init_serializer = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/serializer.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/serializer.js"() { init_index_es(); init_converters(); init_enums(); @@ -11272,16 +11240,16 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/objects.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/objects.js var init_objects = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/objects.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/objects.js"() { } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/convert.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/convert.js var import_pvtsutils3, AsnConvert; var init_convert = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/convert.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/convert.js"() { init_index_es(); import_pvtsutils3 = __toESM(require_build()); init_parser(); @@ -11305,9 +11273,9 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/index.js + // development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/index.js var init_es2015 = __esm({ - "test/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/index.js"() { + "development/node_modules/.pnpm/@peculiar+asn1-schema@2.3.0/node_modules/@peculiar/asn1-schema/build/es2015/index.js"() { init_converters(); init_types(); init_decorators(); @@ -11320,9 +11288,9 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/tslib@2.4.0/node_modules/tslib/tslib.js + // development/node_modules/.pnpm/tslib@2.4.0/node_modules/tslib/tslib.js var require_tslib = __commonJS({ - "test/node_modules/.pnpm/tslib@2.4.0/node_modules/tslib/tslib.js"(exports, module) { + "development/node_modules/.pnpm/tslib@2.4.0/node_modules/tslib/tslib.js"(exports, module) { var __extends2; var __assign2; var __rest2; @@ -11760,10 +11728,10 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/tslib@2.4.0/node_modules/tslib/modules/index.js + // development/node_modules/.pnpm/tslib@2.4.0/node_modules/tslib/modules/index.js var import_tslib, __extends, __assign, __rest, __decorate, __param, __metadata, __awaiter, __generator, __exportStar, __createBinding, __values, __read, __spread, __spreadArrays, __spreadArray, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefault, __classPrivateFieldGet, __classPrivateFieldSet, __classPrivateFieldIn; var init_modules = __esm({ - "test/node_modules/.pnpm/tslib@2.4.0/node_modules/tslib/modules/index.js"() { + "development/node_modules/.pnpm/tslib@2.4.0/node_modules/tslib/modules/index.js"() { import_tslib = __toESM(require_tslib(), 1); ({ __extends, @@ -11795,7 +11763,7 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+json-schema@1.1.12/node_modules/@peculiar/json-schema/build/index.es.js + // development/node_modules/.pnpm/@peculiar+json-schema@1.1.12/node_modules/@peculiar/json-schema/build/index.es.js function checkType(value, type) { switch (type) { case JsonPropTypes.Boolean: @@ -11848,7 +11816,7 @@ ${values.join("\n")}` : `${blockName} :`; } var JsonError, TransformError, ParserError, ValidationError, SerializerError, KeyError, JsonPropTypes, JsonSchemaStorage, DEFAULT_SCHEMA, schemaStorage2, PatternValidation, InclusiveValidation, ExclusiveValidation, LengthValidation, EnumerationValidation, JsonTransform, JsonSerializer, JsonParser, JsonProp; var init_index_es2 = __esm({ - "test/node_modules/.pnpm/@peculiar+json-schema@1.1.12/node_modules/@peculiar/json-schema/build/index.es.js"() { + "development/node_modules/.pnpm/@peculiar+json-schema@1.1.12/node_modules/@peculiar/json-schema/build/index.es.js"() { JsonError = class extends Error { constructor(message, innerError) { super(innerError ? `${message}. See the inner exception for more details.` : message); @@ -12238,13 +12206,13 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/webcrypto-core@1.7.5/node_modules/webcrypto-core/build/webcrypto-core.es.js + // development/node_modules/.pnpm/webcrypto-core@1.7.5/node_modules/webcrypto-core/build/webcrypto-core.es.js function isJWK(data) { return typeof data === "object" && "kty" in data; } var import_pvtsutils4, import_pvtsutils5, CryptoError, AlgorithmError, UnsupportedOperationError, OperationError, RequiredPropertyError, ProviderCrypto, AesProvider, AesCbcProvider, AesCmacProvider, AesCtrProvider, AesEcbProvider, AesGcmProvider, AesKwProvider, DesProvider, RsaProvider, RsaSsaProvider, RsaPssProvider, RsaOaepProvider, EllipticProvider, EcdsaProvider, KEY_TYPES, CryptoKey, EcdhProvider, EcdhEsProvider, EdDsaProvider, ObjectIdentifier2, AlgorithmIdentifier, PrivateKeyInfo, PublicKeyInfo, JsonBase64UrlArrayBufferConverter, AsnIntegerArrayBufferConverter, RsaPrivateKey, RsaPublicKey, EcPublicKey, EcPrivateKey, AsnIntegerWithoutPaddingConverter, index$2, EcUtils, EcDsaSignature, OneAsymmetricKey, EdPrivateKey, EdPublicKey, CurvePrivateKey, idSecp256r1, idEllipticCurve, idSecp384r1, idSecp521r1, idSecp256k1, idVersionOne, idBrainpoolP160r1, idBrainpoolP160t1, idBrainpoolP192r1, idBrainpoolP192t1, idBrainpoolP224r1, idBrainpoolP224t1, idBrainpoolP256r1, idBrainpoolP256t1, idBrainpoolP320r1, idBrainpoolP320t1, idBrainpoolP384r1, idBrainpoolP384t1, idBrainpoolP512r1, idBrainpoolP512t1, idX25519, idX448, idEd25519, idEd448, index$1, EcCurves, HmacProvider, Pbkdf2Provider, HkdfProvider, ShakeProvider, Shake128Provider, Shake256Provider, Crypto, ProviderStorage, SubtleCrypto; var init_webcrypto_core_es = __esm({ - "test/node_modules/.pnpm/webcrypto-core@1.7.5/node_modules/webcrypto-core/build/webcrypto-core.es.js"() { + "development/node_modules/.pnpm/webcrypto-core@1.7.5/node_modules/webcrypto-core/build/webcrypto-core.es.js"() { import_pvtsutils4 = __toESM(require_build()); import_pvtsutils5 = __toESM(require_build()); init_es2015(); @@ -13629,7 +13597,7 @@ ${values.join("\n")}` : `${blockName} :`; } }); - // test/node_modules/.pnpm/@peculiar+webcrypto@1.4.0/node_modules/@peculiar/webcrypto/build/webcrypto.es.js + // development/node_modules/.pnpm/@peculiar+webcrypto@1.4.0/node_modules/@peculiar/webcrypto/build/webcrypto.es.js var webcrypto_es_exports = {}; __export(webcrypto_es_exports, { Crypto: () => Crypto2, @@ -13760,7 +13728,7 @@ ${values.join("\n")}` : `${blockName} :`; } var crypto, import_crypto, process2, import_pvtsutils6, JsonBase64UrlConverter, CryptoKey2, SymmetricKey, AsymmetricKey, AesCryptoKey, keyStorage, AesCrypto, AesCbcProvider2, zero, rb, blockSize, AesCmacProvider2, AesCtrProvider2, AesGcmProvider2, AesKwProvider2, AesEcbProvider2, DesCryptoKey, DesCrypto, DesCbcProvider, DesEde3CbcProvider, RsaPrivateKey2, RsaPublicKey2, RsaCrypto, RsaSsaProvider2, RsaPssProvider2, ShaCrypto, RsaOaepProvider2, RsaEsProvider, namedOIDs, EcPrivateKey2, EcPublicKey3, Sha1Provider, Sha256Provider, Sha384Provider, Sha512Provider, Sha3256Provider, Sha3384Provider, Sha3512Provider, EcCrypto, EcdsaProvider2, EcdhProvider2, edOIDs, EdPrivateKey3, EdPublicKey3, EdCrypto, EdDsaProvider2, EcdhEsProvider2, PbkdfCryptoKey, Pbkdf2Provider2, HmacCryptoKey, HmacProvider2, HkdfCryptoKey, HkdfProvider2, ShakeCrypto, Shake128Provider2, Shake256Provider2, SubtleCrypto2, Crypto2; var init_webcrypto_es = __esm({ - "test/node_modules/.pnpm/@peculiar+webcrypto@1.4.0/node_modules/@peculiar/webcrypto/build/webcrypto.es.js"() { + "development/node_modules/.pnpm/@peculiar+webcrypto@1.4.0/node_modules/@peculiar/webcrypto/build/webcrypto.es.js"() { init_webcrypto_core_es(); init_webcrypto_core_es(); init_webcrypto_core_es(); @@ -15880,7 +15848,7 @@ ${key.data.toString("base64")} } }); - // ../application/source/math/random.mjs + // application/source/math/random.mjs var random_exports = {}; __export(random_exports, { random: () => random @@ -15933,8 +15901,7 @@ ${key.data.toString("base64")} } var MAX; var init_random = __esm({ - "../application/source/math/random.mjs"() { - "use strict"; + "application/source/math/random.mjs"() { init_global(); MAX = 1e9; Math.log2 = Math.log2 || function(n) { @@ -15943,15 +15910,14 @@ ${key.data.toString("base64")} } }); - // ../application/source/types/randomid.mjs + // application/source/types/randomid.mjs var randomid_exports = {}; __export(randomid_exports, { RandomID: () => RandomID }); var internalCounter2, RandomID; var init_randomid = __esm({ - "../application/source/types/randomid.mjs"() { - "use strict"; + "application/source/types/randomid.mjs"() { init_random(); init_global(); init_id(); @@ -15966,7 +15932,7 @@ ${key.data.toString("base64")} } }); - // ../application/source/types/uuid.mjs + // application/source/types/uuid.mjs var uuid_exports = {}; __export(uuid_exports, { UUID: () => UUID @@ -15987,8 +15953,7 @@ ${key.data.toString("base64")} } var UUID; var init_uuid = __esm({ - "../application/source/types/uuid.mjs"() { - "use strict"; + "application/source/types/uuid.mjs"() { init_constants(); init_random(); init_is(); @@ -16015,7 +15980,7 @@ ${key.data.toString("base64")} } }); - // test/web/prepare.js + // development/test/web/prepare.js if (typeof window === "object") { (function() { let sayswho = function() { @@ -16039,7 +16004,7 @@ ${key.data.toString("base64")} })(); } - // test/node_modules/.pnpm/chai@4.3.6/node_modules/chai/index.mjs + // development/node_modules/.pnpm/chai@4.3.6/node_modules/chai/index.mjs var import_index = __toESM(require_chai2(), 1); var expect = import_index.default.expect; var version = import_index.default.version; @@ -16053,7 +16018,7 @@ ${key.data.toString("base64")} var core = import_index.default.core; var chai_default = import_index.default; - // ../application/source/types/version.mjs + // application/source/types/version.mjs init_base(); var Version = class extends Base { constructor(major, minor, patch) { @@ -16117,15 +16082,15 @@ ${key.data.toString("base64")} if (monsterVersion instanceof Version) { return monsterVersion; } - monsterVersion = new Version("1.31.0"); + monsterVersion = new Version("2.0.7"); return monsterVersion; } - // test/cases/monster.mjs + // development/test/cases/monster.mjs describe("Monster", function() { describe(".getMonsterVersion()", function() { let monsterVersion2; - monsterVersion2 = new Version("1.31.0"); + monsterVersion2 = new Version("2.0.7"); let m = getMonsterVersion(); it("should " + monsterVersion2 + " is " + m, function() { expect(m.compareTo(monsterVersion2)).is.equal(0); @@ -16133,11 +16098,11 @@ ${key.data.toString("base64")} }); }); - // ../application/source/logging/handler.mjs + // application/source/logging/handler.mjs init_base(); init_validate(); - // ../application/source/logging/logentry.mjs + // application/source/logging/logentry.mjs init_base(); init_validate(); var LogEntry = class extends Base { @@ -16155,7 +16120,7 @@ ${key.data.toString("base64")} } }; - // ../application/source/logging/handler.mjs + // application/source/logging/handler.mjs var Handler = class extends Base { constructor() { super(); @@ -16210,7 +16175,7 @@ ${key.data.toString("base64")} } }; - // ../application/source/logging/logger.mjs + // application/source/logging/logger.mjs init_base(); init_validate(); var ALL = 255; @@ -16315,7 +16280,7 @@ ${key.data.toString("base64")} return logger; } - // test/cases/logging/logger.mjs + // development/test/cases/logging/logger.mjs describe("Logging", function() { describe("new Logger", function() { it("should return instanceof Logger", function() { @@ -16390,7 +16355,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/logging/logentry.mjs + // development/test/cases/logging/logentry.mjs describe("Log", function() { describe("new Log", function() { it("should return instanceof Log", function() { @@ -16411,8 +16376,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/logging/handler/console.mjs - init_base(); + // application/source/logging/handler/console.mjs init_global(); var ConsoleHandler = class extends Handler { constructor() { @@ -16423,26 +16387,61 @@ ${key.data.toString("base64")} let console2 = getGlobalObject("console"); if (!console2) return false; - console2.log(entry.toString()); + if (!console2.error) + console2.error = console2.log; + if (!console2.warn) + console2.warn = console2.log; + switch (entry.getLogLevel()) { + case TRACE: + case DEBUG: + case INFO: + console2.log(entry.toString()); + break; + case FATAL: + case ERROR: + console2.error(entry.toString()); + break; + case WARN: + console2.warn(entry.toString()); + break; + default: + console2.log(entry.toString()); + break; + } return true; } return false; } }; - // test/cases/logging/handler/console.mjs + // development/test/cases/logging/handler/console.mjs describe("Logging", function() { describe("ConsoleHandler", function() { it("should create ConsoleHandler", function() { expect(new ConsoleHandler()).to.be.instanceof(ConsoleHandler); }); it("should log to console", function() { - expect(new ConsoleHandler().setAll().log(new LogEntry(FATAL, [1, true, "message"]))).to.be.true; + expect(new ConsoleHandler().setAll().log(new LogEntry(FATAL, [1, true, "fatal"]))).to.be.true; + }); + it("should log to console", function() { + expect(new ConsoleHandler().setAll().log(new LogEntry(TRACE, [1, true, "trace"]))).to.be.true; + }); + it("should log to console", function() { + expect(new ConsoleHandler().setAll().log(new LogEntry(WARN, [1, true, "warn"]))).to.be.true; + }); + it("should log to console", function() { + expect(new ConsoleHandler().setAll().log(new LogEntry(DEBUG, [1, true, "debug"]))).to.be.true; + }); + it("should log to console", function() { + expect(new ConsoleHandler().setAll().log(new LogEntry(ERROR, [1, true, "error"]))).to.be.true; + }); + it("should log to console", function() { + expect(new ConsoleHandler().setAll().log(new LogEntry(INFO, [1, true, "info"]))).to.be.true; }); }); }); - // test/cases/logging/handler.mjs + // development/test/cases/logging/handler.mjs describe("Logging", function() { describe("Handler.setLogLevel().getLogLevel()", function() { [ @@ -16573,12 +16572,12 @@ ${key.data.toString("base64")} }); }); - // ../application/source/text/formatter.mjs + // application/source/text/formatter.mjs init_constants(); init_extend(); init_pipe(); - // ../application/source/types/basewithoptions.mjs + // application/source/types/basewithoptions.mjs init_constants(); init_extend(); init_pathfinder(); @@ -16607,7 +16606,7 @@ ${key.data.toString("base64")} } }; - // ../application/source/text/formatter.mjs + // application/source/text/formatter.mjs init_is(); init_validate(); var internalObjectSymbol = Symbol("internalObject"); @@ -16747,7 +16746,7 @@ ${key.data.toString("base64")} return formatted.join(""); } - // test/cases/text/formatter.mjs + // development/test/cases/text/formatter.mjs describe("Formatter", function() { describe("examples", function() { it("rfc example should run", function() { @@ -16890,14 +16889,14 @@ ${key.data.toString("base64")} }); }); - // ../application/source/dom/resource/link/stylesheet.mjs + // application/source/dom/resource/link/stylesheet.mjs init_extend(); - // ../application/source/dom/resource/link.mjs + // application/source/dom/resource/link.mjs init_extend(); init_constants2(); - // ../application/source/dom/resource.mjs + // application/source/dom/resource.mjs init_constants(); init_extend(); init_global(); @@ -17017,7 +17016,7 @@ ${key.data.toString("base64")} return self2; } - // ../application/source/dom/resource/link.mjs + // application/source/dom/resource/link.mjs var Link = class extends Resource { get defaults() { return extend({}, super.defaults, { @@ -17058,7 +17057,7 @@ ${key.data.toString("base64")} return self2; } - // ../application/source/dom/resource/link/stylesheet.mjs + // application/source/dom/resource/link/stylesheet.mjs var Stylesheet = class extends Link { get defaults() { return extend({}, super.defaults, { @@ -17067,11 +17066,11 @@ ${key.data.toString("base64")} } }; - // test/cases/dom/resource/link/stylesheet.mjs + // development/test/cases/dom/resource/link/stylesheet.mjs init_dataurl(); init_id(); - // test/util/chai-dom.mjs + // development/test/util/chai-dom.mjs function chaiDom(chai2, utils) { var flag = utils.flag, elToString = function(el) { var desc; @@ -17380,7 +17379,7 @@ ${key.data.toString("base64")} }); } - // test/util/cleanupdom.mjs + // development/test/util/cleanupdom.mjs var addedNodes; var mutationobserver; function init() { @@ -17410,7 +17409,7 @@ ${key.data.toString("base64")} } } - // test/util/jsdom.mjs + // development/test/util/jsdom.mjs init_extend(); init_global(); var isBrowser = new Function("try {return this===window;}catch(e){ return false;}"); @@ -17478,7 +17477,7 @@ ${key.data.toString("base64")} }); } - // test/cases/dom/resource/link/stylesheet.mjs + // development/test/cases/dom/resource/link/stylesheet.mjs var expect2 = chai_default.expect; chai_default.use(chaiDom); describe("Stylesheet", function() { @@ -17537,7 +17536,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/dom/resource/data.mjs + // application/source/dom/resource/data.mjs init_constants(); init_extend(); init_global(); @@ -17609,7 +17608,7 @@ ${key.data.toString("base64")} return self2; } - // test/cases/dom/resource/data.mjs + // development/test/cases/dom/resource/data.mjs init_dataurl(); init_id(); var expect3 = chai_default.expect; @@ -17687,7 +17686,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/resource/link.mjs + // development/test/cases/dom/resource/link.mjs init_dataurl(); init_id(); var expect4 = chai_default.expect; @@ -17748,7 +17747,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/dom/resource/script.mjs + // application/source/dom/resource/script.mjs init_extend(); init_constants2(); var Script = class extends Resource { @@ -17784,7 +17783,7 @@ ${key.data.toString("base64")} return self2; } - // test/cases/dom/resource/script.mjs + // development/test/cases/dom/resource/script.mjs init_dataurl(); init_id(); var expect5 = chai_default.expect; @@ -17858,7 +17857,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/updater.mjs + // development/test/cases/dom/updater.mjs init_updater(); init_id(); init_observer(); @@ -18425,7 +18424,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/customcontrol.mjs + // development/test/cases/dom/customcontrol.mjs init_constants2(); init_util(); var expect7 = chai_default.expect; @@ -18590,7 +18589,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/i18n/locale.mjs + // application/source/i18n/locale.mjs init_base(); init_validate(); init_clone(); @@ -18684,7 +18683,7 @@ ${key.data.toString("base64")} return new Locale(language, region, script, variants, extlang); } - // ../application/source/dom/locale.mjs + // application/source/dom/locale.mjs init_util(); var DEFAULT_LANGUAGE = "en"; function getLocaleOfDocument() { @@ -18699,7 +18698,7 @@ ${key.data.toString("base64")} return parseLocale(DEFAULT_LANGUAGE); } - // test/cases/dom/locale.mjs + // development/test/cases/dom/locale.mjs describe("Attributes", function() { before(function(done) { initJSDOM().then(() => { @@ -18723,7 +18722,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/theme.mjs + // development/test/cases/dom/theme.mjs init_util(); init_theme(); describe("Theme", function() { @@ -18767,7 +18766,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/dom/resourcemanager.mjs + // application/source/dom/resourcemanager.mjs init_extend(); init_global(); init_is(); @@ -18850,7 +18849,7 @@ ${key.data.toString("base64")} return self2; } - // test/cases/dom/resourcemanager.mjs + // development/test/cases/dom/resourcemanager.mjs describe("ResourceManager", function() { let fetchReference2, returnStatus; before(function(done) { @@ -18934,7 +18933,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/util.mjs + // development/test/cases/dom/util.mjs init_util(); describe("DOM", function() { before(async function() { @@ -18973,7 +18972,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/customelement.mjs + // development/test/cases/dom/customelement.mjs init_constants(); init_constants2(); init_util(); @@ -19303,7 +19302,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/attributes.mjs + // development/test/cases/dom/attributes.mjs init_attributes(); var html14; var html22; @@ -19489,7 +19488,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/events.mjs + // development/test/cases/dom/events.mjs init_events(); describe("Events", function() { before(async function() { @@ -19602,7 +19601,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/dom/worker/factory.mjs + // application/source/dom/worker/factory.mjs init_constants(); init_base(); init_global(); @@ -19653,7 +19652,7 @@ ${key.data.toString("base64")} } }; - // test/cases/dom/worker/factory.mjs + // development/test/cases/dom/worker/factory.mjs init_global(); var global2 = getGlobal(); describe("Worker", function() { @@ -19690,7 +19689,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/template.mjs + // development/test/cases/dom/template.mjs init_constants2(); init_template(); describe("Template", function() { @@ -19800,7 +19799,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/dom/ready.mjs + // development/test/cases/dom/ready.mjs var windowReady2; var domReady2; describe("Ready", function() { @@ -19825,7 +19824,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/dom/focusmanager.mjs + // application/source/dom/focusmanager.mjs init_extend(); init_global(); init_is(); @@ -19935,7 +19934,7 @@ ${key.data.toString("base64")} } }; - // test/cases/dom/focusmanager.mjs + // development/test/cases/dom/focusmanager.mjs describe("FocusManager", function() { before(function(done) { initJSDOM().then(() => { @@ -20015,7 +20014,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/dom/assembler.mjs + // application/source/dom/assembler.mjs init_base(); init_global(); init_proxyobserver(); @@ -20046,7 +20045,7 @@ ${key.data.toString("base64")} } }; - // test/cases/dom/assembler.mjs + // development/test/cases/dom/assembler.mjs describe("Assembler", function() { before(async function() { initJSDOM(); @@ -20086,7 +20085,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/i18n/translations.mjs + // application/source/i18n/translations.mjs init_base(); init_is(); init_validate(); @@ -20153,7 +20152,7 @@ ${key.data.toString("base64")} } }; - // test/cases/i18n/translations.mjs + // development/test/cases/i18n/translations.mjs describe("Translations", function() { describe("Instance and Init", function() { let translation; @@ -20192,7 +20191,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/i18n/locale.mjs + // development/test/cases/i18n/locale.mjs describe("Locale", function() { describe("new instance", function() { [ @@ -20246,7 +20245,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/i18n/formatter.mjs + // application/source/i18n/formatter.mjs init_constants(); init_extend(); init_validate(); @@ -20294,7 +20293,7 @@ ${key.data.toString("base64")} } }; - // test/cases/i18n/formatter.mjs + // development/test/cases/i18n/formatter.mjs describe("Formatter", function() { describe("example", function() { it("should run with marker", function() { @@ -20329,14 +20328,14 @@ ${key.data.toString("base64")} }); }); - // ../application/source/i18n/providers/fetch.mjs + // application/source/i18n/providers/fetch.mjs init_constants(); init_extend(); init_global(); init_is(); init_validate(); - // ../application/source/i18n/provider.mjs + // application/source/i18n/provider.mjs var Provider = class extends BaseWithOptions { getTranslations(locale) { return new Promise((resolve, reject) => { @@ -20349,7 +20348,7 @@ ${key.data.toString("base64")} } }; - // ../application/source/i18n/providers/fetch.mjs + // application/source/i18n/providers/fetch.mjs var Fetch = class extends Provider { constructor(url, options) { super(options); @@ -20386,7 +20385,7 @@ ${key.data.toString("base64")} } }; - // test/cases/i18n/providers/fetch.mjs + // development/test/cases/i18n/providers/fetch.mjs init_global(); var global3 = getGlobal(); var fetchReference; @@ -20426,7 +20425,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/i18n/provider.mjs + // development/test/cases/i18n/provider.mjs describe("Provider", function() { describe("Instance and Init", function() { it("create instance", function() { @@ -20435,7 +20434,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/mediatype.mjs + // development/test/cases/types/mediatype.mjs init_mediatype(); describe("Dataurl", function() { [ @@ -20478,7 +20477,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/typeof.mjs + // development/test/cases/types/typeof.mjs init_stack(); init_typeof(); describe("typeOf", function() { @@ -20513,7 +20512,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/observerlist.mjs + // development/test/cases/types/observerlist.mjs init_observerlist(); init_observer(); describe("ObserverList", function() { @@ -20588,7 +20587,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/randomid.mjs + // development/test/cases/types/randomid.mjs describe("RandomID", function() { class RandomID2 { } @@ -20617,7 +20616,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/uuid.mjs + // development/test/cases/types/uuid.mjs describe("UUID", function() { class UUID2 { } @@ -20661,7 +20660,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/observer.mjs + // development/test/cases/types/observer.mjs init_observer(); describe("Observer", function() { let callback = function() { @@ -20759,7 +20758,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/tokenlist.mjs + // development/test/cases/types/tokenlist.mjs init_tokenlist(); describe("TokenList", function() { describe(".toString()", function() { @@ -20952,7 +20951,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/queue.mjs + // development/test/cases/types/queue.mjs init_queue(); describe("Queue", function() { let queue; @@ -20988,7 +20987,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/stack.mjs + // development/test/cases/types/stack.mjs init_stack(); describe("Stack", function() { let stack; @@ -21024,7 +21023,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/types/binary.mjs + // application/source/types/binary.mjs init_validate(); function toBinary(string) { const codeUnits = new Uint16Array(validateString(string).length); @@ -21051,7 +21050,7 @@ ${key.data.toString("base64")} return result; } - // test/cases/types/binary.mjs + // development/test/cases/types/binary.mjs describe("Binary", function() { [ ["a", "a\0"], @@ -21068,7 +21067,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/basewithoptions.mjs + // development/test/cases/types/basewithoptions.mjs describe("BaseWithOptions", function() { describe("new BaseWithOptions", function() { it("is instance of BaseWithOptions", function() { @@ -21083,13 +21082,13 @@ ${key.data.toString("base64")} }); }); - // ../application/source/types/regex.mjs + // application/source/types/regex.mjs init_validate(); function escapeString(value) { return validateString(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"); } - // test/cases/types/regex.mjs + // development/test/cases/types/regex.mjs describe("escapeString", function() { before(function(done) { let promises = []; @@ -21119,7 +21118,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/proxyobserver.mjs + // development/test/cases/types/proxyobserver.mjs init_extend(); init_is(); init_observer(); @@ -21286,11 +21285,11 @@ ${key.data.toString("base64")} }); }); - // ../application/source/types/node.mjs + // application/source/types/node.mjs init_base(); init_is(); - // ../application/source/types/nodelist.mjs + // application/source/types/nodelist.mjs init_is(); init_validate(); var NodeList2 = class extends Set { @@ -21343,7 +21342,7 @@ ${key.data.toString("base64")} } }; - // ../application/source/types/node.mjs + // application/source/types/node.mjs init_validate(); var internalValueSymbol = Symbol("internalData"); var treeStructureSymbol = Symbol("treeStructure"); @@ -21429,7 +21428,7 @@ ${key.data.toString("base64")} return this; } - // test/cases/types/nodelist.mjs + // development/test/cases/types/nodelist.mjs describe("NodeList", function() { describe("#constructor", function() { it("should create an empty NodeList", function() { @@ -21479,7 +21478,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/version.mjs + // development/test/cases/types/version.mjs describe("Version", function() { describe(".compareTo()", function() { [ @@ -21512,7 +21511,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/types/noderecursiveiterator.mjs + // application/source/types/noderecursiveiterator.mjs init_constants(); init_base(); init_is(); @@ -21553,7 +21552,7 @@ ${key.data.toString("base64")} } }; - // test/cases/types/node.mjs + // development/test/cases/types/node.mjs describe("NodeList", function() { describe("#constructor", function() { it("should create an empty NodeList", function() { @@ -21741,7 +21740,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/noderecursiveiterator.mjs + // development/test/cases/types/noderecursiveiterator.mjs describe("NodeRecursiveIterator", function() { it("should throw exeption", function() { expect(() => new NodeRecursiveIterator()).to.throw(Error); @@ -21790,7 +21789,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/global.mjs + // development/test/cases/types/global.mjs init_global(); describe("Global", function() { describe("getGlobal", function() { @@ -21813,7 +21812,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/dataurl.mjs + // development/test/cases/types/dataurl.mjs init_dataurl(); describe("Dataurl", function() { [ @@ -21852,7 +21851,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/validate.mjs + // development/test/cases/types/validate.mjs init_validate(); init_base(); init_id(); @@ -22165,7 +22164,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/uniquequeue.mjs + // development/test/cases/types/uniquequeue.mjs init_uniquequeue(); describe("UniqueQueue", function() { let queue; @@ -22227,7 +22226,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/base.mjs + // development/test/cases/types/base.mjs init_base(); describe("Base", function() { describe("new Base", function() { @@ -22240,7 +22239,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/is.mjs + // development/test/cases/types/is.mjs init_is(); init_id(); describe("Is", function() { @@ -22492,7 +22491,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/types/id.mjs + // development/test/cases/types/id.mjs init_id(); describe("ID", function() { before(function(done) { @@ -22521,10 +22520,10 @@ ${key.data.toString("base64")} }); }); - // ../application/source/constraints/isobject.mjs + // application/source/constraints/isobject.mjs init_is(); - // ../application/source/constraints/abstract.mjs + // application/source/constraints/abstract.mjs init_base(); var AbstractConstraint = class extends Base { constructor() { @@ -22535,7 +22534,7 @@ ${key.data.toString("base64")} } }; - // ../application/source/constraints/isobject.mjs + // application/source/constraints/isobject.mjs var IsObject = class extends AbstractConstraint { isValid(value) { if (isObject(value)) { @@ -22545,7 +22544,7 @@ ${key.data.toString("base64")} } }; - // test/cases/constraint/isobject.mjs + // development/test/cases/constraint/isobject.mjs describe("IsObject", function() { describe(".isValid()", function() { let constraint = new IsObject(); @@ -22560,14 +22559,14 @@ ${key.data.toString("base64")} }); }); - // ../application/source/constraints/invalid.mjs + // application/source/constraints/invalid.mjs var Invalid = class extends AbstractConstraint { isValid(value) { return Promise.reject(value); } }; - // test/cases/constraint/invalid.mjs + // development/test/cases/constraint/invalid.mjs describe("Invalid", function() { describe(".isValid()", function() { let isvalid = new Invalid(); @@ -22580,14 +22579,14 @@ ${key.data.toString("base64")} }); }); - // ../application/source/constraints/valid.mjs + // application/source/constraints/valid.mjs var Valid = class extends AbstractConstraint { isValid(value) { return Promise.resolve(value); } }; - // ../application/source/constraints/abstractoperator.mjs + // application/source/constraints/abstractoperator.mjs var AbstractOperator = class extends AbstractConstraint { constructor(operantA, operantB) { super(); @@ -22599,14 +22598,14 @@ ${key.data.toString("base64")} } }; - // ../application/source/constraints/andoperator.mjs + // application/source/constraints/andoperator.mjs var AndOperator = class extends AbstractOperator { isValid(value) { return Promise.all([this.operantA.isValid(value), this.operantB.isValid(value)]); } }; - // test/cases/constraint/andoperator.mjs + // development/test/cases/constraint/andoperator.mjs describe("AndOperator", function() { describe(".isValid()", function() { [ @@ -22630,7 +22629,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/constraints/oroperator.mjs + // application/source/constraints/oroperator.mjs var OrOperator = class extends AbstractOperator { isValid(value) { var self2 = this; @@ -22656,7 +22655,7 @@ ${key.data.toString("base64")} } }; - // test/cases/constraint/oroperator.mjs + // development/test/cases/constraint/oroperator.mjs describe("OrOperator", function() { describe(".isValid()", function() { [ @@ -22680,7 +22679,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/constraints/isarray.mjs + // application/source/constraints/isarray.mjs init_is(); var IsArray = class extends AbstractConstraint { isValid(value) { @@ -22691,7 +22690,7 @@ ${key.data.toString("base64")} } }; - // test/cases/constraint/isarray.mjs + // development/test/cases/constraint/isarray.mjs describe("IsArray", function() { describe(".isValid()", function() { let constraint = new IsArray(); @@ -22706,7 +22705,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/constraint/valid.mjs + // development/test/cases/constraint/valid.mjs describe("Valid", function() { describe(".isValid()", function() { let constraint = new Valid(); @@ -22720,7 +22719,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/util/trimspaces.mjs + // development/test/cases/util/trimspaces.mjs init_trimspaces(); describe("trimSpaces", function() { [ @@ -22738,7 +22737,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/util/deadmansswitch.mjs + // application/source/util/deadmansswitch.mjs init_constants(); init_base(); init_is(); @@ -22780,7 +22779,7 @@ ${key.data.toString("base64")} initCallback.call(self2); } - // test/cases/util/deadmansswitch.mjs + // development/test/cases/util/deadmansswitch.mjs describe("DeadMansSwitch", function() { describe("run instance", function() { it("should run", function(done) { @@ -22822,7 +22821,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/util/freeze.mjs + // application/source/util/freeze.mjs init_validate(); function deepFreeze(object) { validateObject(object); @@ -22834,7 +22833,7 @@ ${key.data.toString("base64")} return Object.freeze(object); } - // test/cases/util/freeze.mjs + // development/test/cases/util/freeze.mjs describe("deepFreeze", function() { describe("deepFreeze an object", function() { it("should freeze object", function() { @@ -22866,7 +22865,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/util/comparator.mjs + // application/source/util/comparator.mjs init_base(); init_is(); var Comparator = class extends Base { @@ -22910,7 +22909,7 @@ ${key.data.toString("base64")} } }; - // test/cases/util/comparator.mjs + // development/test/cases/util/comparator.mjs describe("Comparator", function() { describe("create new instance", function() { it("should return a comparator object", function() { @@ -23073,7 +23072,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/util/clone.mjs + // development/test/cases/util/clone.mjs init_clone(); describe("Clone", function() { class A { @@ -23199,7 +23198,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/util/processing.mjs + // application/source/util/processing.mjs init_constants(); init_base(); init_global(); @@ -23261,7 +23260,7 @@ ${key.data.toString("base64")} } }; - // test/cases/util/processing.mjs + // development/test/cases/util/processing.mjs describe("Processing", function() { describe("run instance", function() { it("should run many function", function(done) { @@ -23335,7 +23334,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/data/extend.mjs + // development/test/cases/data/extend.mjs init_extend(); var MockForExtends = class { constructor() { @@ -23438,7 +23437,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/data/pipe.mjs + // development/test/cases/data/pipe.mjs init_pipe(); describe("Pipe", function() { before(function(done) { @@ -23500,7 +23499,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/data/buildmap.mjs + // application/source/data/buildmap.mjs init_is(); init_validate(); init_clone(); @@ -23604,7 +23603,7 @@ ${key.data.toString("base64")} return definition; } - // test/cases/data/buildmap.mjs + // development/test/cases/data/buildmap.mjs describe("buildMap", function() { let convertMapResult = function(r) { if (r instanceof Map) { @@ -23918,7 +23917,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/data/datasource.mjs + // application/source/data/datasource.mjs init_constants(); init_base(); init_dataurl(); @@ -24006,7 +24005,7 @@ ${key.data.toString("base64")} return {}; } - // test/cases/data/datasource.mjs + // development/test/cases/data/datasource.mjs describe("Datasource", function() { it("should instance of Datasource ", function() { expect(new Datasource()).to.be.instanceof(Datasource); @@ -24047,7 +24046,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/data/buildtree.mjs + // application/source/data/buildtree.mjs init_is(); init_extend(); var parentSymbol = Symbol("parent"); @@ -24097,7 +24096,7 @@ ${key.data.toString("base64")} return list; } - // test/cases/data/buildtree.mjs + // development/test/cases/data/buildtree.mjs describe("buildTree", function() { describe("example", function() { it("should run example", function() { @@ -24266,7 +24265,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/data/transformer.mjs + // development/test/cases/data/transformer.mjs init_transformer(); describe("Transformer", function() { before(function(done) { @@ -24436,7 +24435,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/data/pathfinder.mjs + // development/test/cases/data/pathfinder.mjs init_pathfinder(); describe("Pathfinder", function() { let convertMapResult = function(r) { @@ -24756,7 +24755,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/data/diff.mjs + // development/test/cases/data/diff.mjs init_diff(); init_queue(); describe("Diff", function() { @@ -24930,13 +24929,13 @@ ${key.data.toString("base64")} }); }); - // ../application/source/data/datasource/restapi.mjs + // application/source/data/datasource/restapi.mjs init_constants(); init_is(); init_pathfinder(); init_pipe(); - // ../application/source/data/datasource/restapi/writeerror.mjs + // application/source/data/datasource/restapi/writeerror.mjs init_constants(); var WriteError = class extends Error { constructor(message, response, validation) { @@ -24954,7 +24953,7 @@ ${key.data.toString("base64")} } }; - // ../application/source/data/datasource/restapi.mjs + // application/source/data/datasource/restapi.mjs var RestAPI = class extends Datasource { constructor(readDefinition, writeDefinition) { super(); @@ -25077,7 +25076,7 @@ ${key.data.toString("base64")} } }; - // test/cases/data/datasource/restapi.mjs + // development/test/cases/data/datasource/restapi.mjs init_validate(); describe("RestAPI", function() { let fetchReference2; @@ -25141,11 +25140,11 @@ ${key.data.toString("base64")} }); }); - // ../application/source/data/datasource/storage/sessionstorage.mjs + // application/source/data/datasource/storage/sessionstorage.mjs init_constants(); init_global(); - // ../application/source/data/datasource/storage.mjs + // application/source/data/datasource/storage.mjs init_constants(); init_validate(); var storageObjectSymbol = Symbol("storageObject"); @@ -25190,7 +25189,7 @@ ${key.data.toString("base64")} } }; - // ../application/source/data/datasource/storage/sessionstorage.mjs + // application/source/data/datasource/storage/sessionstorage.mjs var SessionStorage = class extends Storage { [storageObjectSymbol]() { return getGlobalObject("sessionStorage"); @@ -25201,7 +25200,7 @@ ${key.data.toString("base64")} } }; - // test/util/localstorage.mjs + // development/test/util/localstorage.mjs function createStorage() { let UNSET = Symbol(); let s = {}, noopCallback = () => { @@ -25278,7 +25277,7 @@ ${key.data.toString("base64")} return s; } - // test/cases/data/datasource/storage/sessionstorage.mjs + // development/test/cases/data/datasource/storage/sessionstorage.mjs var storageReference; describe("SessionStorage", function() { afterEach(() => { @@ -25307,7 +25306,7 @@ ${key.data.toString("base64")} }); }); - // ../application/source/data/datasource/storage/localstorage.mjs + // application/source/data/datasource/storage/localstorage.mjs init_constants(); init_global(); var LocalStorage = class extends Storage { @@ -25320,7 +25319,7 @@ ${key.data.toString("base64")} } }; - // test/cases/data/datasource/storage/localstorage.mjs + // development/test/cases/data/datasource/storage/localstorage.mjs var localStorageReference; describe("LocalStorage", function() { afterEach(() => { @@ -25349,7 +25348,7 @@ ${key.data.toString("base64")} }); }); - // test/cases/math/random.mjs + // development/test/cases/math/random.mjs describe("Math", function() { let random2 = () => { }; @@ -25934,4 +25933,2507 @@ ${key.data.toString("base64")} /*! Copyright (c) Peculiar Ventures, LLC */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fzc2VydGlvbi1lcnJvckAxLjEuMC9ub2RlX21vZHVsZXMvYXNzZXJ0aW9uLWVycm9yL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wYXRodmFsQDEuMS4xL25vZGVfbW9kdWxlcy9wYXRodmFsL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2ZsYWcuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvdGVzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vdHlwZS1kZXRlY3RANC4wLjgvbm9kZV9tb2R1bGVzL3R5cGUtZGV0ZWN0L3R5cGUtZGV0ZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2V4cGVjdFR5cGVzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2dldEFjdHVhbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZ2V0LWZ1bmMtbmFtZUAyLjAuMC9ub2RlX21vZHVsZXMvZ2V0LWZ1bmMtbmFtZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vdXRpbEAwLjEyLjQvbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vbG91cGVAMi4zLjQvbm9kZV9tb2R1bGVzL2xvdXBlL2xvdXBlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL2NvbmZpZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9pbnNwZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL29iakRpc3BsYXkuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvZ2V0TWVzc2FnZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy90cmFuc2ZlckZsYWdzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9kZWVwLWVxbEAzLjAuMS9ub2RlX21vZHVsZXMvZGVlcC1lcWwvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvaXNQcm94eUVuYWJsZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvYWRkUHJvcGVydHkuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvYWRkTGVuZ3RoR3VhcmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvZ2V0UHJvcGVydGllcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9wcm94aWZ5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2FkZE1ldGhvZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9vdmVyd3JpdGVQcm9wZXJ0eS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9vdmVyd3JpdGVNZXRob2QuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvYWRkQ2hhaW5hYmxlTWV0aG9kLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9jb21wYXJlQnlJbnNwZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2dldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoZWNrLWVycm9yQDEuMC4yL25vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9pc05hTi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9nZXRPcGVyYXRvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9hc3NlcnRpb24uanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvY29yZS9hc3NlcnRpb25zLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL2ludGVyZmFjZS9leHBlY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvaW50ZXJmYWNlL3Nob3VsZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9pbnRlcmZhY2UvYXNzZXJ0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2luZGV4LmpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9iYXNlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaXMubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2dsb2JhbC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0YW50cy5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3R5cGVvZi5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvZXh0ZW5kLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaWQubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL2Nsb25lLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvc3RhY2subWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL3BhdGhmaW5kZXIubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL3RyYW5zZm9ybWVyLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9waXBlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2NvbnN0YW50cy5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3Rva2VubGlzdC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3F1ZXVlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdW5pcXVlcXVldWUubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9vYnNlcnZlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL29ic2VydmVybGlzdC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3Byb3h5b2JzZXJ2ZXIubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9tZWRpYXR5cGUubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kaWZmLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC90cmltc3BhY2VzLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3V0aWwubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vZXZlbnRzLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3RoZW1lLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3RlbXBsYXRlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3VwZGF0ZXIubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vYXR0cmlidXRlcy5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9jdXN0b21lbGVtZW50Lm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2N1c3RvbWNvbnRyb2wubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVhZHkubWpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wdnRzdXRpbHNAMS4zLjIvbm9kZV9tb2R1bGVzL3B2dHN1dGlscy9idWlsZC9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vcHZ1dGlsc0AxLjEuMy9ub2RlX21vZHVsZXMvcHZ1dGlscy9idWlsZC91dGlscy5lcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vYXNuMWpzQDMuMC41L25vZGVfbW9kdWxlcy9hc24xanMvYnVpbGQvaW5kZXguZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9lbnVtcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2NvbnZlcnRlcnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS90eXBlcy9iaXRfc3RyaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjAvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvdHlwZXMvb2N0ZXRfc3RyaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjAvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvdHlwZXMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9oZWxwZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9zY2hlbWEuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9zdG9yYWdlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjAvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvZGVjb3JhdG9ycy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2Vycm9ycy9zY2hlbWFfdmFsaWRhdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2Vycm9ycy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L3BhcnNlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L3NlcmlhbGl6ZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9vYmplY3RzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjAvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvY29udmVydC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS90c2xpYkAyLjQuMC9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3RzbGliQDIuNC4wL25vZGVfbW9kdWxlcy90c2xpYi9tb2R1bGVzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIranNvbi1zY2hlbWFAMS4xLjEyL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvanNvbi1zY2hlbWEvYnVpbGQvaW5kZXguZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3dlYmNyeXB0by1jb3JlQDEuNy41L25vZGVfbW9kdWxlcy93ZWJjcnlwdG8tY29yZS9idWlsZC93ZWJjcnlwdG8tY29yZS5lcy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK3dlYmNyeXB0b0AxLjQuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL3dlYmNyeXB0by9idWlsZC93ZWJjcnlwdG8uZXMuanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL21hdGgvcmFuZG9tLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcmFuZG9taWQubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy91dWlkLm1qcyIsICJwcmVwYXJlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2luZGV4Lm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdmVyc2lvbi5tanMiLCAiLi4vY2FzZXMvbW9uc3Rlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvaGFuZGxlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvbG9nZW50cnkubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9sb2dnaW5nL2xvZ2dlci5tanMiLCAiLi4vY2FzZXMvbG9nZ2luZy9sb2dnZXIubWpzIiwgIi4uL2Nhc2VzL2xvZ2dpbmcvbG9nZW50cnkubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9sb2dnaW5nL2hhbmRsZXIvY29uc29sZS5tanMiLCAiLi4vY2FzZXMvbG9nZ2luZy9oYW5kbGVyL2NvbnNvbGUubWpzIiwgIi4uL2Nhc2VzL2xvZ2dpbmcvaGFuZGxlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3RleHQvZm9ybWF0dGVyLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qcyIsICIuLi9jYXNlcy90ZXh0L2Zvcm1hdHRlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9yZXNvdXJjZS9saW5rL3N0eWxlc2hlZXQubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVzb3VyY2UvbGluay5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9yZXNvdXJjZS5tanMiLCAiLi4vY2FzZXMvZG9tL3Jlc291cmNlL2xpbmsvc3R5bGVzaGVldC5tanMiLCAiLi4vdXRpbC9jaGFpLWRvbS5tanMiLCAiLi4vdXRpbC9jbGVhbnVwZG9tLm1qcyIsICIuLi91dGlsL2pzZG9tLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3Jlc291cmNlL2RhdGEubWpzIiwgIi4uL2Nhc2VzL2RvbS9yZXNvdXJjZS9kYXRhLm1qcyIsICIuLi9jYXNlcy9kb20vcmVzb3VyY2UvbGluay5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9yZXNvdXJjZS9zY3JpcHQubWpzIiwgIi4uL2Nhc2VzL2RvbS9yZXNvdXJjZS9zY3JpcHQubWpzIiwgIi4uL2Nhc2VzL2RvbS91cGRhdGVyLm1qcyIsICIuLi9jYXNlcy9kb20vY3VzdG9tY29udHJvbC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vbG9jYWxlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2xvY2FsZS5tanMiLCAiLi4vY2FzZXMvZG9tL2xvY2FsZS5tanMiLCAiLi4vY2FzZXMvZG9tL3RoZW1lLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3Jlc291cmNlbWFuYWdlci5tanMiLCAiLi4vY2FzZXMvZG9tL3Jlc291cmNlbWFuYWdlci5tanMiLCAiLi4vY2FzZXMvZG9tL3V0aWwubWpzIiwgIi4uL2Nhc2VzL2RvbS9jdXN0b21lbGVtZW50Lm1qcyIsICIuLi9jYXNlcy9kb20vYXR0cmlidXRlcy5tanMiLCAiLi4vY2FzZXMvZG9tL2V2ZW50cy5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS93b3JrZXIvZmFjdG9yeS5tanMiLCAiLi4vY2FzZXMvZG9tL3dvcmtlci9mYWN0b3J5Lm1qcyIsICIuLi9jYXNlcy9kb20vdGVtcGxhdGUubWpzIiwgIi4uL2Nhc2VzL2RvbS9yZWFkeS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9mb2N1c21hbmFnZXIubWpzIiwgIi4uL2Nhc2VzL2RvbS9mb2N1c21hbmFnZXIubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vYXNzZW1ibGVyLm1qcyIsICIuLi9jYXNlcy9kb20vYXNzZW1ibGVyLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzIiwgIi4uL2Nhc2VzL2kxOG4vdHJhbnNsYXRpb25zLm1qcyIsICIuLi9jYXNlcy9pMThuL2xvY2FsZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vZm9ybWF0dGVyLm1qcyIsICIuLi9jYXNlcy9pMThuL2Zvcm1hdHRlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vcHJvdmlkZXJzL2ZldGNoLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi9wcm92aWRlci5tanMiLCAiLi4vY2FzZXMvaTE4bi9wcm92aWRlcnMvZmV0Y2gubWpzIiwgIi4uL2Nhc2VzL2kxOG4vcHJvdmlkZXIubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL21lZGlhdHlwZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvdHlwZW9mLm1qcyIsICIuLi9jYXNlcy90eXBlcy9vYnNlcnZlcmxpc3QubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3JhbmRvbWlkLm1qcyIsICIuLi9jYXNlcy90eXBlcy91dWlkLm1qcyIsICIuLi9jYXNlcy90eXBlcy9vYnNlcnZlci5tanMiLCAiLi4vY2FzZXMvdHlwZXMvdG9rZW5saXN0Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9xdWV1ZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvc3RhY2subWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9iaW5hcnkubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2JpbmFyeS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcmVnZXgubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3JlZ2V4Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9wcm94eW9ic2VydmVyLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvbm9kZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9ub2RlbGlzdC5tanMiLCAiLi4vY2FzZXMvdHlwZXMvdmVyc2lvbi5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVyZWN1cnNpdmVpdGVyYXRvci5tanMiLCAiLi4vY2FzZXMvdHlwZXMvbm9kZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvbm9kZXJlY3Vyc2l2ZWl0ZXJhdG9yLm1qcyIsICIuLi9jYXNlcy90eXBlcy9nbG9iYWwubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2RhdGF1cmwubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3ZhbGlkYXRlLm1qcyIsICIuLi9jYXNlcy90eXBlcy91bmlxdWVxdWV1ZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvYmFzZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvaXMubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2lkLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvaXNvYmplY3QubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9jb25zdHJhaW50cy9hYnN0cmFjdC5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9pc29iamVjdC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzIiwgIi4uL2Nhc2VzL2NvbnN0cmFpbnQvaW52YWxpZC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL3ZhbGlkLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvYWJzdHJhY3RvcGVyYXRvci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2FuZG9wZXJhdG9yLm1qcyIsICIuLi9jYXNlcy9jb25zdHJhaW50L2FuZG9wZXJhdG9yLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvb3JvcGVyYXRvci5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9vcm9wZXJhdG9yLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvaXNhcnJheS5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9pc2FycmF5Lm1qcyIsICIuLi9jYXNlcy9jb25zdHJhaW50L3ZhbGlkLm1qcyIsICIuLi9jYXNlcy91dGlsL3RyaW1zcGFjZXMubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL2RlYWRtYW5zc3dpdGNoLm1qcyIsICIuLi9jYXNlcy91dGlsL2RlYWRtYW5zc3dpdGNoLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9mcmVlemUubWpzIiwgIi4uL2Nhc2VzL3V0aWwvZnJlZXplLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9jb21wYXJhdG9yLm1qcyIsICIuLi9jYXNlcy91dGlsL2NvbXBhcmF0b3IubWpzIiwgIi4uL2Nhc2VzL3V0aWwvY2xvbmUubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL3Byb2Nlc3NpbmcubWpzIiwgIi4uL2Nhc2VzL3V0aWwvcHJvY2Vzc2luZy5tanMiLCAiLi4vY2FzZXMvZGF0YS9leHRlbmQubWpzIiwgIi4uL2Nhc2VzL2RhdGEvcGlwZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvYnVpbGRtYXAubWpzIiwgIi4uL2Nhc2VzL2RhdGEvYnVpbGRtYXAubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvYnVpbGR0cmVlLm1qcyIsICIuLi9jYXNlcy9kYXRhL2J1aWxkdHJlZS5tanMiLCAiLi4vY2FzZXMvZGF0YS90cmFuc2Zvcm1lci5tanMiLCAiLi4vY2FzZXMvZGF0YS9wYXRoZmluZGVyLm1qcyIsICIuLi9jYXNlcy9kYXRhL2RpZmYubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UvcmVzdGFwaS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9yZXN0YXBpL3dyaXRlZXJyb3IubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS9yZXN0YXBpLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2Uvc2Vzc2lvbnN0b3JhZ2UubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZS5tanMiLCAiLi4vdXRpbC9sb2NhbHN0b3JhZ2UubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlL3Nlc3Npb25zdG9yYWdlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2UvbG9jYWxzdG9yYWdlLm1qcyIsICIuLi9jYXNlcy9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZS9sb2NhbHN0b3JhZ2UubWpzIiwgIi4uL2Nhc2VzL21hdGgvcmFuZG9tLm1qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBhc3NlcnRpb24tZXJyb3JcbiAqIENvcHlyaWdodChjKSAyMDEzIEpha2UgTHVlciA8amFrZUBxdWFsaWFuY3kuY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHdpbGwgY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIG9uZSBvYmplY3QgdG8gYW5vdGhlciBleGNsdWRpbmcgYW55IG9yaWdpbmFsbHlcbiAqIGxpc3RlZC4gUmV0dXJuZWQgZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSBuZXcgYHt9YC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXhjbHVkZWQgcHJvcGVydGllcyAuLi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5cbmZ1bmN0aW9uIGV4Y2x1ZGUgKCkge1xuICB2YXIgZXhjbHVkZXMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgZnVuY3Rpb24gZXhjbHVkZVByb3BzIChyZXMsIG9iaikge1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoIX5leGNsdWRlcy5pbmRleE9mKGtleSkpIHJlc1trZXldID0gb2JqW2tleV07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gZXh0ZW5kRXhjbHVkZSAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICAgICwgaSA9IDBcbiAgICAgICwgcmVzID0ge307XG5cbiAgICBmb3IgKDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4Y2x1ZGVQcm9wcyhyZXMsIGFyZ3NbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG59O1xuXG4vKiFcbiAqIFByaW1hcnkgRXhwb3J0c1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gQXNzZXJ0aW9uRXJyb3I7XG5cbi8qKlxuICogIyMjIEFzc2VydGlvbkVycm9yXG4gKlxuICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBKYXZhU2NyaXB0IGBFcnJvcmAgY29uc3RydWN0b3IgZm9yXG4gKiBhc3NlcnRpb24gYW5kIHZhbGlkYXRpb24gc2NlbmFyaW9zLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyB0byBpbmNsdWRlIChvcHRpb25hbClcbiAqIEBwYXJhbSB7Y2FsbGVlfSBzdGFydCBzdGFjayBmdW5jdGlvbiAob3B0aW9uYWwpXG4gKi9cblxuZnVuY3Rpb24gQXNzZXJ0aW9uRXJyb3IgKG1lc3NhZ2UsIF9wcm9wcywgc3NmKSB7XG4gIHZhciBleHRlbmQgPSBleGNsdWRlKCduYW1lJywgJ21lc3NhZ2UnLCAnc3RhY2snLCAnY29uc3RydWN0b3InLCAndG9KU09OJylcbiAgICAsIHByb3BzID0gZXh0ZW5kKF9wcm9wcyB8fCB7fSk7XG5cbiAgLy8gZGVmYXVsdCB2YWx1ZXNcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVW5zcGVjaWZpZWQgQXNzZXJ0aW9uRXJyb3InO1xuICB0aGlzLnNob3dEaWZmID0gZmFsc2U7XG5cbiAgLy8gY29weSBmcm9tIHByb3BlcnRpZXNcbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgdGhpc1trZXldID0gcHJvcHNba2V5XTtcbiAgfVxuXG4gIC8vIGNhcHR1cmUgc3RhY2sgdHJhY2VcbiAgc3NmID0gc3NmIHx8IEFzc2VydGlvbkVycm9yO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzc2YpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBlLnN0YWNrO1xuICAgIH1cbiAgfVxufVxuXG4vKiFcbiAqIEluaGVyaXQgZnJvbSBFcnJvci5wcm90b3R5cGVcbiAqL1xuXG5Bc3NlcnRpb25FcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5cbi8qIVxuICogU3RhdGljYWxseSBzZXQgbmFtZVxuICovXG5cbkFzc2VydGlvbkVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcblxuLyohXG4gKiBFbnN1cmUgY29ycmVjdCBjb25zdHJ1Y3RvclxuICovXG5cbkFzc2VydGlvbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFzc2VydGlvbkVycm9yO1xuXG4vKipcbiAqIEFsbG93IGVycm9ycyB0byBiZSBjb252ZXJ0ZWQgdG8gSlNPTiBmb3Igc3RhdGljIHRyYW5zZmVyLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5jbHVkZSBzdGFjayAoZGVmYXVsdDogYHRydWVgKVxuICogQHJldHVybiB7T2JqZWN0fSBvYmplY3QgdGhhdCBjYW4gYmUgYEpTT04uc3RyaW5naWZ5YFxuICovXG5cbkFzc2VydGlvbkVycm9yLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgdmFyIGV4dGVuZCA9IGV4Y2x1ZGUoJ2NvbnN0cnVjdG9yJywgJ3RvSlNPTicsICdzdGFjaycpXG4gICAgLCBwcm9wcyA9IGV4dGVuZCh7IG5hbWU6IHRoaXMubmFtZSB9LCB0aGlzKTtcblxuICAvLyBpbmNsdWRlIHN0YWNrIGlmIGV4aXN0cyBhbmQgbm90IHR1cm5lZCBvZmZcbiAgaWYgKGZhbHNlICE9PSBzdGFjayAmJiB0aGlzLnN0YWNrKSB7XG4gICAgcHJvcHMuc3RhY2sgPSB0aGlzLnN0YWNrO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIENoYWkgLSBwYXRodmFsIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpY2FscGFyYWRveC9maWx0clxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmhhc1Byb3BlcnR5KG9iamVjdCwgbmFtZSlcbiAqXG4gKiBUaGlzIGFsbG93cyBjaGVja2luZyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgb3duXG4gKiBvciBpbmhlcml0ZWQgZnJvbSBwcm90b3R5cGUgY2hhaW4gbmFtZWQgcHJvcGVydHkuXG4gKlxuICogQmFzaWNhbGx5IGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGBpbmBcbiAqIG9wZXJhdG9yIGJ1dCB3b3JrcyBwcm9wZXJseSB3aXRoIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICogYW5kIG90aGVyIHByaW1pdGl2ZXMuXG4gKlxuICogICAgIHZhciBvYmogPSB7XG4gKiAgICAgICAgIGFycjogWydhJywgJ2InLCAnYyddXG4gKiAgICAgICAsIHN0cjogJ0hlbGxvJ1xuICogICAgIH1cbiAqXG4gKiBUaGUgZm9sbG93aW5nIHdvdWxkIGJlIHRoZSByZXN1bHRzLlxuICpcbiAqICAgICBoYXNQcm9wZXJ0eShvYmosICdzdHInKTsgIC8vIHRydWVcbiAqICAgICBoYXNQcm9wZXJ0eShvYmosICdjb25zdHJ1Y3RvcicpOyAgLy8gdHJ1ZVxuICogICAgIGhhc1Byb3BlcnR5KG9iaiwgJ2JhcicpOyAgLy8gZmFsc2VcbiAqXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgJ2xlbmd0aCcpOyAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgMSk7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgNSk7ICAvLyBmYWxzZVxuICpcbiAqICAgICBoYXNQcm9wZXJ0eShvYmouYXJyLCAnbGVuZ3RoJyk7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLmFyciwgMik7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLmFyciwgMyk7ICAvLyBmYWxzZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfFN5bWJvbH0gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgaXQgZXhpc3RzXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBoYXNQcm9wZXJ0eVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmosIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRoZSBgaW5gIG9wZXJhdG9yIGRvZXMgbm90IHdvcmsgd2l0aCBwcmltaXRpdmVzLlxuICByZXR1cm4gbmFtZSBpbiBPYmplY3Qob2JqKTtcbn1cblxuLyogIVxuICogIyMgcGFyc2VQYXRoKHBhdGgpXG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gcGFyc2Ugc3RyaW5nIG9iamVjdFxuICogcGF0aHMuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIGBpbnRlcm5hbEdldFBhdGhWYWx1ZWAuXG4gKlxuICogICAgICB2YXIgcGFyc2VkID0gcGFyc2VQYXRoKCdteW9iamVjdC5wcm9wZXJ0eS5zdWJwcm9wJyk7XG4gKlxuICogIyMjIFBhdGhzOlxuICpcbiAqICogQ2FuIGJlIGluZmluaXRlbHkgZGVlcCBhbmQgbmVzdGVkLlxuICogKiBBcnJheXMgYXJlIGFsc28gdmFsaWQgdXNpbmcgdGhlIGZvcm1hbCBgbXlvYmplY3QuZG9jdW1lbnRbM10ucHJvcGVydHlgLlxuICogKiBMaXRlcmFsIGRvdHMgYW5kIGJyYWNrZXRzIChub3QgZGVsaW1pdGVyKSBtdXN0IGJlIGJhY2tzbGFzaC1lc2NhcGVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBwYXJzZWRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIHZhciBzdHIgPSBwYXRoLnJlcGxhY2UoLyhbXlxcXFxdKVxcWy9nLCAnJDEuWycpO1xuICB2YXIgcGFydHMgPSBzdHIubWF0Y2goLyhcXFxcXFwufFteLl0rPykrL2cpO1xuICByZXR1cm4gcGFydHMubWFwKGZ1bmN0aW9uIG1hcE1hdGNoZXModmFsdWUpIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gJ2NvbnN0cnVjdG9yJyB8fFxuICAgICAgdmFsdWUgPT09ICdfX3Byb3RvX18nIHx8XG4gICAgICB2YWx1ZSA9PT0gJ3Byb3RvdHlwZSdcbiAgICApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgdmFyIHJlZ2V4cCA9IC9eXFxbKFxcZCspXFxdJC87XG4gICAgdmFyIG1BcnIgPSByZWdleHAuZXhlYyh2YWx1ZSk7XG4gICAgdmFyIHBhcnNlZCA9IG51bGw7XG4gICAgaWYgKG1BcnIpIHtcbiAgICAgIHBhcnNlZCA9IHsgaTogcGFyc2VGbG9hdChtQXJyWzFdKSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWQgPSB7IHA6IHZhbHVlLnJlcGxhY2UoL1xcXFwoWy5bXFxdXSkvZywgJyQxJykgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9KTtcbn1cblxuLyogIVxuICogIyMgaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWRbLCBwYXRoRGVwdGhdKVxuICpcbiAqIEhlbHBlciBjb21wYW5pb24gZnVuY3Rpb24gZm9yIGAucGFyc2VQYXRoYCB0aGF0IHJldHVybnNcbiAqIHRoZSB2YWx1ZSBsb2NhdGVkIGF0IHRoZSBwYXJzZWQgYWRkcmVzcy5cbiAqXG4gKiAgICAgIHZhciB2YWx1ZSA9IGdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0byBzZWFyY2ggYWdhaW5zdFxuICogQHBhcmFtIHtPYmplY3R9IHBhcnNlZCBkZWZpbml0aW9uIGZyb20gYHBhcnNlUGF0aGAuXG4gKiBAcGFyYW0ge051bWJlcn0gZGVwdGggKG5lc3RpbmcgbGV2ZWwpIG9mIHRoZSBwcm9wZXJ0eSB3ZSB3YW50IHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7T2JqZWN0fFVuZGVmaW5lZH0gdmFsdWVcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkLCBwYXRoRGVwdGgpIHtcbiAgdmFyIHRlbXBvcmFyeVZhbHVlID0gb2JqO1xuICB2YXIgcmVzID0gbnVsbDtcbiAgcGF0aERlcHRoID0gdHlwZW9mIHBhdGhEZXB0aCA9PT0gJ3VuZGVmaW5lZCcgPyBwYXJzZWQubGVuZ3RoIDogcGF0aERlcHRoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICB2YXIgcGFydCA9IHBhcnNlZFtpXTtcbiAgICBpZiAodGVtcG9yYXJ5VmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydC5wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRlbXBvcmFyeVZhbHVlW3BhcnQuaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRlbXBvcmFyeVZhbHVlW3BhcnQucF07XG4gICAgICB9XG5cbiAgICAgIGlmIChpID09PSBwYXRoRGVwdGggLSAxKSB7XG4gICAgICAgIHJlcyA9IHRlbXBvcmFyeVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbi8qICFcbiAqICMjIGludGVybmFsU2V0UGF0aFZhbHVlKG9iaiwgdmFsdWUsIHBhcnNlZClcbiAqXG4gKiBDb21wYW5pb24gZnVuY3Rpb24gZm9yIGBwYXJzZVBhdGhgIHRoYXQgc2V0c1xuICogdGhlIHZhbHVlIGxvY2F0ZWQgYXQgYSBwYXJzZWQgYWRkcmVzcy5cbiAqXG4gKiAgaW50ZXJuYWxTZXRQYXRoVmFsdWUob2JqLCAndmFsdWUnLCBwYXJzZWQpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdG8gc2VhcmNoIGFuZCBkZWZpbmUgb25cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgdG8gdXNlIHVwb24gc2V0XG4gKiBAcGFyYW0ge09iamVjdH0gcGFyc2VkIGRlZmluaXRpb24gZnJvbSBgcGFyc2VQYXRoYFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaW50ZXJuYWxTZXRQYXRoVmFsdWUob2JqLCB2YWwsIHBhcnNlZCkge1xuICB2YXIgdGVtcE9iaiA9IG9iajtcbiAgdmFyIHBhdGhEZXB0aCA9IHBhcnNlZC5sZW5ndGg7XG4gIHZhciBwYXJ0ID0gbnVsbDtcbiAgLy8gSGVyZSB3ZSBpdGVyYXRlIHRocm91Z2ggZXZlcnkgcGFydCBvZiB0aGUgcGF0aFxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhEZXB0aDsgaSsrKSB7XG4gICAgdmFyIHByb3BOYW1lID0gbnVsbDtcbiAgICB2YXIgcHJvcFZhbCA9IG51bGw7XG4gICAgcGFydCA9IHBhcnNlZFtpXTtcblxuICAgIC8vIElmIGl0J3MgdGhlIGxhc3QgcGFydCBvZiB0aGUgcGF0aCwgd2Ugc2V0IHRoZSAncHJvcE5hbWUnIHZhbHVlIHdpdGggdGhlIHByb3BlcnR5IG5hbWVcbiAgICBpZiAoaSA9PT0gcGF0aERlcHRoIC0gMSkge1xuICAgICAgcHJvcE5hbWUgPSB0eXBlb2YgcGFydC5wID09PSAndW5kZWZpbmVkJyA/IHBhcnQuaSA6IHBhcnQucDtcbiAgICAgIC8vIE5vdyB3ZSBzZXQgdGhlIHByb3BlcnR5IHdpdGggdGhlIG5hbWUgaGVsZCBieSAncHJvcE5hbWUnIG9uIG9iamVjdCB3aXRoIHRoZSBkZXNpcmVkIHZhbFxuICAgICAgdGVtcE9ialtwcm9wTmFtZV0gPSB2YWw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFydC5wICE9PSAndW5kZWZpbmVkJyAmJiB0ZW1wT2JqW3BhcnQucF0pIHtcbiAgICAgIHRlbXBPYmogPSB0ZW1wT2JqW3BhcnQucF07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFydC5pICE9PSAndW5kZWZpbmVkJyAmJiB0ZW1wT2JqW3BhcnQuaV0pIHtcbiAgICAgIHRlbXBPYmogPSB0ZW1wT2JqW3BhcnQuaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBvYmogZG9lc24ndCBoYXZlIHRoZSBwcm9wZXJ0eSB3ZSBjcmVhdGUgb25lIHdpdGggdGhhdCBuYW1lIHRvIGRlZmluZSBpdFxuICAgICAgdmFyIG5leHQgPSBwYXJzZWRbaSArIDFdO1xuICAgICAgLy8gSGVyZSB3ZSBzZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIHdpbGwgYmUgZGVmaW5lZFxuICAgICAgcHJvcE5hbWUgPSB0eXBlb2YgcGFydC5wID09PSAndW5kZWZpbmVkJyA/IHBhcnQuaSA6IHBhcnQucDtcbiAgICAgIC8vIEhlcmUgd2UgZGVjaWRlIGlmIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBhbiBhcnJheSBvciBhIG5ldyBvYmplY3RcbiAgICAgIHByb3BWYWwgPSB0eXBlb2YgbmV4dC5wID09PSAndW5kZWZpbmVkJyA/IFtdIDoge307XG4gICAgICB0ZW1wT2JqW3Byb3BOYW1lXSA9IHByb3BWYWw7XG4gICAgICB0ZW1wT2JqID0gdGVtcE9ialtwcm9wTmFtZV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogIyMjIC5nZXRQYXRoSW5mbyhvYmplY3QsIHBhdGgpXG4gKlxuICogVGhpcyBhbGxvd3MgdGhlIHJldHJpZXZhbCBvZiBwcm9wZXJ0eSBpbmZvIGluIGFuXG4gKiBvYmplY3QgZ2l2ZW4gYSBzdHJpbmcgcGF0aC5cbiAqXG4gKiBUaGUgcGF0aCBpbmZvIGNvbnNpc3RzIG9mIGFuIG9iamVjdCB3aXRoIHRoZVxuICogZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogKiBwYXJlbnQgLSBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGUgcHJvcGVydHkgcmVmZXJlbmNlZCBieSBgcGF0aGBcbiAqICogbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaW5hbCBwcm9wZXJ0eSwgYSBudW1iZXIgaWYgaXQgd2FzIGFuIGFycmF5IGluZGV4ZXJcbiAqICogdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgdW5kZWZpbmVkYFxuICogKiBleGlzdHMgLSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdHMgb3Igbm90XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEByZXR1cm5zIHtPYmplY3R9IGluZm9cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldFBhdGhJbmZvXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGdldFBhdGhJbmZvKG9iaiwgcGF0aCkge1xuICB2YXIgcGFyc2VkID0gcGFyc2VQYXRoKHBhdGgpO1xuICB2YXIgbGFzdCA9IHBhcnNlZFtwYXJzZWQubGVuZ3RoIC0gMV07XG4gIHZhciBpbmZvID0ge1xuICAgIHBhcmVudDpcbiAgICAgIHBhcnNlZC5sZW5ndGggPiAxID9cbiAgICAgICAgaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQsIHBhcnNlZC5sZW5ndGggLSAxKSA6XG4gICAgICAgIG9iaixcbiAgICBuYW1lOiBsYXN0LnAgfHwgbGFzdC5pLFxuICAgIHZhbHVlOiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCksXG4gIH07XG4gIGluZm8uZXhpc3RzID0gaGFzUHJvcGVydHkoaW5mby5wYXJlbnQsIGluZm8ubmFtZSk7XG5cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogIyMjIC5nZXRQYXRoVmFsdWUob2JqZWN0LCBwYXRoKVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgdmFsdWVzIGluIGFuXG4gKiBvYmplY3QgZ2l2ZW4gYSBzdHJpbmcgcGF0aC5cbiAqXG4gKiAgICAgdmFyIG9iaiA9IHtcbiAqICAgICAgICAgcHJvcDE6IHtcbiAqICAgICAgICAgICAgIGFycjogWydhJywgJ2InLCAnYyddXG4gKiAgICAgICAgICAgLCBzdHI6ICdIZWxsbydcbiAqICAgICAgICAgfVxuICogICAgICAgLCBwcm9wMjoge1xuICogICAgICAgICAgICAgYXJyOiBbIHsgbmVzdGVkOiAnVW5pdmVyc2UnIH0gXVxuICogICAgICAgICAgICwgc3RyOiAnSGVsbG8gYWdhaW4hJ1xuICogICAgICAgICB9XG4gKiAgICAgfVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgd291bGQgYmUgdGhlIHJlc3VsdHMuXG4gKlxuICogICAgIGdldFBhdGhWYWx1ZShvYmosICdwcm9wMS5zdHInKTsgLy8gSGVsbG9cbiAqICAgICBnZXRQYXRoVmFsdWUob2JqLCAncHJvcDEuYXR0WzJdJyk7IC8vIGJcbiAqICAgICBnZXRQYXRoVmFsdWUob2JqLCAncHJvcDIuYXJyWzBdLm5lc3RlZCcpOyAvLyBVbml2ZXJzZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB2YWx1ZSBvciBgdW5kZWZpbmVkYFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0UGF0aFZhbHVlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGdldFBhdGhWYWx1ZShvYmosIHBhdGgpIHtcbiAgdmFyIGluZm8gPSBnZXRQYXRoSW5mbyhvYmosIHBhdGgpO1xuICByZXR1cm4gaW5mby52YWx1ZTtcbn1cblxuLyoqXG4gKiAjIyMgLnNldFBhdGhWYWx1ZShvYmplY3QsIHBhdGgsIHZhbHVlKVxuICpcbiAqIERlZmluZSB0aGUgdmFsdWUgaW4gYW4gb2JqZWN0IGF0IGEgZ2l2ZW4gc3RyaW5nIHBhdGguXG4gKlxuICogYGBganNcbiAqIHZhciBvYmogPSB7XG4gKiAgICAgcHJvcDE6IHtcbiAqICAgICAgICAgYXJyOiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgICwgc3RyOiAnSGVsbG8nXG4gKiAgICAgfVxuICogICAsIHByb3AyOiB7XG4gKiAgICAgICAgIGFycjogWyB7IG5lc3RlZDogJ1VuaXZlcnNlJyB9IF1cbiAqICAgICAgICwgc3RyOiAnSGVsbG8gYWdhaW4hJ1xuICogICAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIHdvdWxkIGJlIGFjY2VwdGFibGUuXG4gKlxuICogYGBganNcbiAqIHZhciBwcm9wZXJ0aWVzID0gcmVxdWlyZSgndGVhLXByb3BlcnRpZXMnKTtcbiAqIHByb3BlcnRpZXMuc2V0KG9iaiwgJ3Byb3AxLnN0cicsICdIZWxsbyBVbml2ZXJzZSEnKTtcbiAqIHByb3BlcnRpZXMuc2V0KG9iaiwgJ3Byb3AxLmFyclsyXScsICdCJyk7XG4gKiBwcm9wZXJ0aWVzLnNldChvYmosICdwcm9wMi5hcnJbMF0ubmVzdGVkLnZhbHVlJywgeyBoZWxsbzogJ3VuaXZlcnNlJyB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2V0UGF0aFZhbHVlKG9iaiwgcGF0aCwgdmFsKSB7XG4gIHZhciBwYXJzZWQgPSBwYXJzZVBhdGgocGF0aCk7XG4gIGludGVybmFsU2V0UGF0aFZhbHVlKG9iaiwgdmFsLCBwYXJzZWQpO1xuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaGFzUHJvcGVydHk6IGhhc1Byb3BlcnR5LFxuICBnZXRQYXRoSW5mbzogZ2V0UGF0aEluZm8sXG4gIGdldFBhdGhWYWx1ZTogZ2V0UGF0aFZhbHVlLFxuICBzZXRQYXRoVmFsdWU6IHNldFBhdGhWYWx1ZSxcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gZmxhZyB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmZsYWcob2JqZWN0LCBrZXksIFt2YWx1ZV0pXG4gKlxuICogR2V0IG9yIHNldCBhIGZsYWcgdmFsdWUgb24gYW4gb2JqZWN0LiBJZiBhXG4gKiB2YWx1ZSBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHNldCwgZWxzZSBpdCB3aWxsXG4gKiByZXR1cm4gdGhlIGN1cnJlbnRseSBzZXQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgaWZcbiAqIHRoZSB2YWx1ZSBpcyBub3Qgc2V0LlxuICpcbiAqICAgICB1dGlscy5mbGFnKHRoaXMsICdmb28nLCAnYmFyJyk7IC8vIHNldHRlclxuICogICAgIHV0aWxzLmZsYWcodGhpcywgJ2ZvbycpOyAvLyBnZXR0ZXIsIHJldHVybnMgYGJhcmBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IGNvbnN0cnVjdGVkIEFzc2VydGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgKG9wdGlvbmFsKVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZmxhZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmbGFnKG9iaiwga2V5LCB2YWx1ZSkge1xuICB2YXIgZmxhZ3MgPSBvYmouX19mbGFncyB8fCAob2JqLl9fZmxhZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBmbGFnc1trZXldID0gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZsYWdzW2tleV07XG4gIH1cbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gdGVzdCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcblxuLyoqXG4gKiAjIyMgLnRlc3Qob2JqZWN0LCBleHByZXNzaW9uKVxuICpcbiAqIFRlc3QgYW5kIG9iamVjdCBmb3IgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IChjb25zdHJ1Y3RlZCBBc3NlcnRpb24pXG4gKiBAcGFyYW0ge0FyZ3VtZW50c30gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmFzc2VydCBhcmd1bWVudHNcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIHRlc3RcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRlc3Qob2JqLCBhcmdzKSB7XG4gIHZhciBuZWdhdGUgPSBmbGFnKG9iaiwgJ25lZ2F0ZScpXG4gICAgLCBleHByID0gYXJnc1swXTtcbiAgcmV0dXJuIG5lZ2F0ZSA/ICFleHByIDogZXhwcjtcbn07XG4iLCAiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuXHQoZ2xvYmFsLnR5cGVEZXRlY3QgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIHR5cGUtZGV0ZWN0XG4gKiBDb3B5cmlnaHQoYykgMjAxMyBqYWtlIGx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG52YXIgcHJvbWlzZUV4aXN0cyA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xudmFyIGdsb2JhbE9iamVjdCA9IHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyA/IHNlbGYgOiBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaWQtYmxhY2tsaXN0XG5cbnZhciBzeW1ib2xFeGlzdHMgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbnZhciBtYXBFeGlzdHMgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJztcbnZhciBzZXRFeGlzdHMgPSB0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJztcbnZhciB3ZWFrTWFwRXhpc3RzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnO1xudmFyIHdlYWtTZXRFeGlzdHMgPSB0eXBlb2YgV2Vha1NldCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgZGF0YVZpZXdFeGlzdHMgPSB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbEl0ZXJhdG9yRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgIT09ICd1bmRlZmluZWQnO1xudmFyIHNldEVudHJpZXNFeGlzdHMgPSBzZXRFeGlzdHMgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbnZhciBtYXBFbnRyaWVzRXhpc3RzID0gbWFwRXhpc3RzICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XG52YXIgc2V0SXRlcmF0b3JQcm90b3R5cGUgPSBzZXRFbnRyaWVzRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgU2V0KCkuZW50cmllcygpKTtcbnZhciBtYXBJdGVyYXRvclByb3RvdHlwZSA9IG1hcEVudHJpZXNFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBNYXAoKS5lbnRyaWVzKCkpO1xudmFyIGFycmF5SXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG52YXIgYXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgc3RyaW5nSXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgU3RyaW5nLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xudmFyIHN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlID0gc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgdG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGggPSA4O1xudmFyIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCA9IC0xO1xuLyoqXG4gKiAjIyMgdHlwZU9mIChvYmopXG4gKlxuICogVXNlcyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIG9iamVjdCxcbiAqIG5vcm1hbGlzaW5nIGJlaGF2aW91ciBhY3Jvc3MgZW5naW5lIHZlcnNpb25zICYgd2VsbCBvcHRpbWlzZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IG9iamVjdCB0eXBlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiB0eXBlRGV0ZWN0KG9iaikge1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAgKiBQcmU6XG4gICAqICAgc3RyaW5nIGxpdGVyYWwgICAgIHggMywwMzksMDM1IG9wcy9zZWMgXHUwMEIxMS42MiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAxLDQyNCwxMzggb3BzL3NlYyBcdTAwQjE0LjU0JSAoNzUgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDEsNjUzLDE1MyBvcHMvc2VjIFx1MDBCMTEuOTElICg4MiBydW5zIHNhbXBsZWQpXG4gICAqICAgdW5kZWZpbmVkICAgICAgICAgIHggOSw5NzgsNjYwIG9wcy9zZWMgXHUwMEIxMS45MiUgKDc1IHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAyLDU1Niw3Njkgb3BzL3NlYyBcdTAwQjExLjczJSAoNzcgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIHN0cmluZyBsaXRlcmFsICAgICB4IDM4LDU2NCw3OTYgb3BzL3NlYyBcdTAwQjExLjE1JSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIGJvb2xlYW4gbGl0ZXJhbCAgICB4IDMxLDE0OCw5NDAgb3BzL3NlYyBcdTAwQjExLjEwJSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDMyLDY3OSwzMzAgb3BzL3NlYyBcdTAwQjExLjkwJSAoNzggcnVucyBzYW1wbGVkKVxuICAgKiAgIHVuZGVmaW5lZCAgICAgICAgICB4IDMyLDM2MywzNjggb3BzL3NlYyBcdTAwQjExLjA3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiAgIGZ1bmN0aW9uICAgICAgICAgICB4IDMxLDI5Niw4NzAgb3BzL3NlYyBcdTAwQjEwLjk2JSAoODMgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgdmFyIHR5cGVvZk9iaiA9IHR5cGVvZiBvYmo7XG4gIGlmICh0eXBlb2ZPYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHR5cGVvZk9iajtcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAyOCw2NDUsNzY1IG9wcy9zZWMgXHUwMEIxMS4xNyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogUG9zdDpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAzNiw0MjgsOTYyIG9wcy9zZWMgXHUwMEIxMS4zNyUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgICovXG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93KWBgXG4gICAqICAtIE5vZGUgPT09IFwiW29iamVjdCBnbG9iYWxdXCJcbiAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gUGhhbnRvbUpTID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBJRSAxMSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBJRSBFZGdlID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcylgYFxuICAgKiAgLSBDaHJvbWUgV29ya2VyID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIEZpcmVmb3ggV29ya2VyID09PSBcIltvYmplY3QgRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICogIC0gU2FmYXJpIFdvcmtlciA9PT0gXCJbb2JqZWN0IERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIElFIDExIFdvcmtlciA9PT0gXCJbb2JqZWN0IFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIElFIEVkZ2UgV29ya2VyID09PSBcIltvYmplY3QgV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICovXG4gIGlmIChvYmogPT09IGdsb2JhbE9iamVjdCkge1xuICAgIHJldHVybiAnZ2xvYmFsJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBhcnJheSBsaXRlcmFsICAgICAgeCAyLDg4OCwzNTIgb3BzL3NlYyBcdTAwQjEwLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIGFycmF5IGxpdGVyYWwgICAgICB4IDIyLDQ3OSw2NTAgb3BzL3NlYyBcdTAwQjEwLjk2JSAoODEgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkob2JqKSAmJlxuICAgIChzeW1ib2xUb1N0cmluZ1RhZ0V4aXN0cyA9PT0gZmFsc2UgfHwgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gb2JqKSlcbiAgKSB7XG4gICAgcmV0dXJuICdBcnJheSc7XG4gIH1cblxuICAvLyBOb3QgY2FjaGluZyBleGlzdGVuY2Ugb2YgYHdpbmRvd2AgYW5kIHJlbGF0ZWQgcHJvcGVydGllcyBkdWUgdG8gcG90ZW50aWFsXG4gIC8vIGZvciBgd2luZG93YCB0byBiZSB1bnNldCBiZWZvcmUgdGVzdHMgaW4gcXVhc2ktYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cgIT09IG51bGwpIHtcbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNsb2NhdGlvbilcbiAgICAgKiBXaGF0V0cgSFRNTCQ3LjcuMyAtIFRoZSBgTG9jYXRpb25gIGludGVyZmFjZVxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93LmxvY2F0aW9uKWBgXG4gICAgICogIC0gSUUgPD0xMSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAqICAtIElFIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmxvY2F0aW9uID09PSAnb2JqZWN0JyAmJiBvYmogPT09IHdpbmRvdy5sb2NhdGlvbikge1xuICAgICAgcmV0dXJuICdMb2NhdGlvbic7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvY3VtZW50KVxuICAgICAqIFdoYXRXRyBIVE1MJDMuMS4xIC0gVGhlIGBEb2N1bWVudGAgb2JqZWN0XG4gICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICogICAgICAgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1IVE1ML2h0bWwuaHRtbCNJRC0yNjgwOTI2OClcbiAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICogICAgICAgV2hhdFdHIEhUTUwgc3RhdGVzOlxuICAgICAqICAgICAgICAgPiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBXaW5kb3cgb2JqZWN0cyBtdXN0IGFsc28gaGF2ZSBhXG4gICAgICogICAgICAgICA+IHdyaXRhYmxlLCBjb25maWd1cmFibGUsIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVkXG4gICAgICogICAgICAgICA+IEhUTUxEb2N1bWVudCB3aG9zZSB2YWx1ZSBpcyB0aGUgRG9jdW1lbnQgaW50ZXJmYWNlIG9iamVjdC5cbiAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50KWBgXG4gICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBEb2N1bWVudF1cIlxuICAgICAqICAtIElFIDExID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgRWRnZSA8PTEzID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgPT09ICdvYmplY3QnICYmIG9iaiA9PT0gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gJ0RvY3VtZW50JztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjbWltZXR5cGVhcnJheSlcbiAgICAgICAqIFdoYXRXRyBIVE1MJDguNi4xLjUgLSBQbHVnaW5zIC0gSW50ZXJmYWNlIE1pbWVUeXBlQXJyYXlcbiAgICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLm1pbWVUeXBlcylgYFxuICAgICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IE1TTWltZVR5cGVzQ29sbGVjdGlvbl1cIlxuICAgICAgICovXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubWltZVR5cGVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIG9iaiA9PT0gd2luZG93Lm5hdmlnYXRvci5taW1lVHlwZXMpIHtcbiAgICAgICAgcmV0dXJuICdNaW1lVHlwZUFycmF5JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3BsdWdpbmFycmF5KVxuICAgICAgICogV2hhdFdHIEhUTUwkOC42LjEuNSAtIFBsdWdpbnMgLSBJbnRlcmZhY2UgUGx1Z2luQXJyYXlcbiAgICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLnBsdWdpbnMpYGBcbiAgICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBNU1BsdWdpbnNDb2xsZWN0aW9uXVwiXG4gICAgICAgKi9cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5wbHVnaW5zID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIG9iaiA9PT0gd2luZG93Lm5hdmlnYXRvci5wbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiAnUGx1Z2luQXJyYXknO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgodHlwZW9mIHdpbmRvdy5IVE1MRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2Ygd2luZG93LkhUTUxFbGVtZW50ID09PSAnb2JqZWN0JykgJiZcbiAgICAgICAgb2JqIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSB7XG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNwbHVnaW5hcnJheSlcbiAgICAgICogV2hhdFdHIEhUTUwkNC40LjQgLSBUaGUgYGJsb2NrcXVvdGVgIGVsZW1lbnQgLSBJbnRlcmZhY2UgYEhUTUxRdW90ZUVsZW1lbnRgXG4gICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYmxvY2txdW90ZScpKWBgXG4gICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBIVE1MQmxvY2tFbGVtZW50XVwiXG4gICAgICAqL1xuICAgICAgaWYgKG9iai50YWdOYW1lID09PSAnQkxPQ0tRVU9URScpIHtcbiAgICAgICAgcmV0dXJuICdIVE1MUXVvdGVFbGVtZW50JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlZGF0YWNlbGxlbGVtZW50KVxuICAgICAgICogV2hhdFdHIEhUTUwkNC45LjkgLSBUaGUgYHRkYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnRgXG4gICAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgICAqICAgICAgIChodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItSFRNTC9odG1sLmh0bWwjSUQtODI5MTUwNzUpXG4gICAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgICAqIFRlc3Q6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpKVxuICAgICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqL1xuICAgICAgaWYgKG9iai50YWdOYW1lID09PSAnVEQnKSB7XG4gICAgICAgIHJldHVybiAnSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlaGVhZGVyY2VsbGVsZW1lbnQpXG4gICAgICAgKiBXaGF0V0cgSFRNTCQ0LjkuOSAtIFRoZSBgdGRgIGVsZW1lbnQgLSBJbnRlcmZhY2UgYEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50YFxuICAgICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTgyOTE1MDc1KVxuICAgICAgICogICAgICAgd2hpY2ggc3VnZ2VzdHMgdGhhdCBicm93c2VycyBzaG91bGQgdXNlIEhUTUxUYWJsZUNlbGxFbGVtZW50IGZvclxuICAgICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICAgKiBUZXN0OiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKSlcbiAgICAgICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKi9cbiAgICAgIGlmIChvYmoudGFnTmFtZSA9PT0gJ1RIJykge1xuICAgICAgICByZXR1cm4gJ0hUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50JztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDYyNSw2NDQgb3BzL3NlYyBcdTAwQjExLjU4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggMSwyNzksODUyIG9wcy9zZWMgXHUwMEIxMi45MSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQzMkFycmF5ICAgICAgICB4IDEsMTc4LDE4NSBvcHMvc2VjIFx1MDBCMTEuOTUlICg4MyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCAxLDAwOCwzODAgb3BzL3NlYyBcdTAwQjEyLjI1JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggMSwxMjgsMDQwIG9wcy9zZWMgXHUwMEIxMi4xMSUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDMyQXJyYXkgICAgICAgICB4IDEsMTcwLDExOSBvcHMvc2VjIFx1MDBCMTIuODglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCAxLDE3NiwzNDggb3BzL3NlYyBcdTAwQjE1Ljc5JSAoODYgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggMSwwNTgsNzA3IG9wcy9zZWMgXHUwMEIxNC45NCUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4Q2xhbXBlZEFycmF5ICB4IDEsMTEwLDYzMyBvcHMvc2VjIFx1MDBCMTQuMjAlICg4MCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDcsMTA1LDY3MSBvcHMvc2VjIFx1MDBCMTEzLjQ3JSAoNjQgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggNSw4ODcsOTEyIG9wcy9zZWMgXHUwMEIxMS40NiUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQzMkFycmF5ICAgICAgICB4IDYsNDkxLDY2MSBvcHMvc2VjIFx1MDBCMTEuNzYlICg3OSBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCA2LDU1OSw3OTUgb3BzL3NlYyBcdTAwQjExLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggNiw0NjMsOTY2IG9wcy9zZWMgXHUwMEIxMS40MyUgKDg1IHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDMyQXJyYXkgICAgICAgICB4IDUsNjQxLDg0MSBvcHMvc2VjIFx1MDBCMTMuNDklICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCA2LDU4Myw1MTEgb3BzL3NlYyBcdTAwQjExLjk4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggNiw2MDYsMDc4IG9wcy9zZWMgXHUwMEIxMS43NCUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4Q2xhbXBlZEFycmF5ICB4IDYsNjAyLDIyNCBvcHMvc2VjIFx1MDBCMTEuNzclICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIHZhciBzdHJpbmdUYWcgPSAoc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgJiYgb2JqW1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICBpZiAodHlwZW9mIHN0cmluZ1RhZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG5cbiAgdmFyIG9ialByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHJlZ2V4IGxpdGVyYWwgICAgICB4IDEsNzcyLDM4NSBvcHMvc2VjIFx1MDBCMTEuODUlICg3NyBydW5zIHNhbXBsZWQpXG4gICogICByZWdleCBjb25zdHJ1Y3RvciAgeCAyLDE0Myw2MzQgb3BzL3NlYyBcdTAwQjEyLjQ2JSAoNzggcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICByZWdleCBsaXRlcmFsICAgICAgeCAzLDkyOCwwMDkgb3BzL3NlYyBcdTAwQjEwLjY1JSAoNzggcnVucyBzYW1wbGVkKVxuICAqICAgcmVnZXggY29uc3RydWN0b3IgIHggMyw5MzEsMTA4IG9wcy9zZWMgXHUwMEIxMC41OCUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gUmVnRXhwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUmVnRXhwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMiwxMzAsMDc0IG9wcy9zZWMgXHUwMEIxNC40MiUgKDY4IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMyw5NTMsNzc5IG9wcy9zZWMgXHUwMEIxMS4zNSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gRGF0ZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGUnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLXByb21pc2UucHJvdG90eXBlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyNS40LjUuNCAtIFByb21pc2UucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlByb21pc2VcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQcm9taXNlLnJlc29sdmUoKSlgYFxuICAgKiAgLSBDaHJvbWUgPD00NyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKiAgLSBFZGdlIDw9MjAgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICogIC0gRmlyZWZveCAyOS1MYXRlc3QgPT09IFwiW29iamVjdCBQcm9taXNlXVwiXG4gICAqICAtIFNhZmFyaSA3LjEtTGF0ZXN0ID09PSBcIltvYmplY3QgUHJvbWlzZV1cIlxuICAgKi9cbiAgaWYgKHByb21pc2VFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBQcm9taXNlLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUHJvbWlzZSc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDIsMjIyLDE4NiBvcHMvc2VjIFx1MDBCMTEuMzElICg4MiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDQsNTQ1LDg3OSBvcHMvc2VjIFx1MDBCMTEuMTMlICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChzZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBTZXQucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdTZXQnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCAyLDM5Niw4NDIgb3BzL3NlYyBcdTAwQjExLjU5JSAoODEgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCA0LDE4Myw5NDUgb3BzL3NlYyBcdTAwQjE2LjU5JSAoODIgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAobWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gTWFwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnTWFwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggMSwzMjMsMjIwIG9wcy9zZWMgXHUwMEIxMi4xNyUgKDc2IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggNCwyMzcsNTEwIG9wcy9zZWMgXHUwMEIxMi4wMSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHdlYWtTZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBXZWFrU2V0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnV2Vha1NldCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDEsNTAwLDI2MCBvcHMvc2VjIFx1MDBCMTIuMDIlICg3OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDMsODgxLDM4NCBvcHMvc2VjIFx1MDBCMTEuNDUlICg4MiBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmICh3ZWFrTWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gV2Vha01hcC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1dlYWtNYXAnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWRhdGF2aWV3LnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjQuMi40LjIxIC0gRGF0YVZpZXcucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIkRhdGFWaWV3XCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoZGF0YVZpZXdFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBEYXRhVmlldy5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGFWaWV3JztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lbWFwaXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMy4xLjUuMi4yIC0gJU1hcEl0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJNYXAgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgTWFwKCkuZW50cmllcygpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKG1hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IG1hcEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdNYXAgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVzZXRpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIzLjIuNS4yLjIgLSAlU2V0SXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlNldCBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ldyBTZXQoKS5lbnRyaWVzKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoc2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gc2V0SXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1NldCBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMi4xLjUuMi4yIC0gJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIkFycmF5IEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoW11bU3ltYm9sLml0ZXJhdG9yXSgpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBhcnJheUl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdBcnJheSBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjEuMS41LjIuMiAtICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiU3RyaW5nIEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoJydbU3ltYm9sLml0ZXJhdG9yXSgpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKHN0cmluZ0l0ZXJhdG9yRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gc3RyaW5nSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1N0cmluZyBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDIsNDI0LDMyMCBvcHMvc2VjIFx1MDBCMTEuNjclICg3NiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDUsODM4LDAwMCBvcHMvc2VjIFx1MDBCMTAuOTklICg4NCBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChvYmpQcm90b3R5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0XG4gICAgLnByb3RvdHlwZVxuICAgIC50b1N0cmluZ1xuICAgIC5jYWxsKG9iailcbiAgICAuc2xpY2UodG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGgsIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCk7XG59XG5cbnJldHVybiB0eXBlRGV0ZWN0O1xuXG59KSkpO1xuIiwgIi8qIVxuICogQ2hhaSAtIGV4cGVjdFR5cGVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZXhwZWN0VHlwZXMob2JqLCB0eXBlcylcbiAqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQgYWdhaW5zdCBpcyBvZiBhIHZhbGlkIHR5cGUuXG4gKlxuICogICAgIHV0aWxzLmV4cGVjdFR5cGVzKHRoaXMsIFsnYXJyYXknLCAnb2JqZWN0JywgJ3N0cmluZyddKTtcbiAqXG4gKiBAcGFyYW0ge01peGVkfSBvYmogY29uc3RydWN0ZWQgQXNzZXJ0aW9uXG4gKiBAcGFyYW0ge0FycmF5fSB0eXBlIEEgbGlzdCBvZiBhbGxvd2VkIHR5cGVzIGZvciB0aGlzIGFzc2VydGlvblxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZXhwZWN0VHlwZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIEFzc2VydGlvbkVycm9yID0gcmVxdWlyZSgnYXNzZXJ0aW9uLWVycm9yJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIHR5cGUgPSByZXF1aXJlKCd0eXBlLWRldGVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4cGVjdFR5cGVzKG9iaiwgdHlwZXMpIHtcbiAgdmFyIGZsYWdNc2cgPSBmbGFnKG9iaiwgJ21lc3NhZ2UnKTtcbiAgdmFyIHNzZmkgPSBmbGFnKG9iaiwgJ3NzZmknKTtcblxuICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG5cbiAgb2JqID0gZmxhZyhvYmosICdvYmplY3QnKTtcbiAgdHlwZXMgPSB0eXBlcy5tYXAoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTsgfSk7XG4gIHR5cGVzLnNvcnQoKTtcblxuICAvLyBUcmFuc2Zvcm1zIFsnbG9yZW0nLCAnaXBzdW0nXSBpbnRvICdhIGxvcmVtLCBvciBhbiBpcHN1bSdcbiAgdmFyIHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbiAodCwgaW5kZXgpIHtcbiAgICB2YXIgYXJ0ID0gflsgJ2EnLCAnZScsICdpJywgJ28nLCAndScgXS5pbmRleE9mKHQuY2hhckF0KDApKSA/ICdhbicgOiAnYSc7XG4gICAgdmFyIG9yID0gdHlwZXMubGVuZ3RoID4gMSAmJiBpbmRleCA9PT0gdHlwZXMubGVuZ3RoIC0gMSA/ICdvciAnIDogJyc7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgJyAnICsgdDtcbiAgfSkuam9pbignLCAnKTtcblxuICB2YXIgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbiAoZXhwZWN0ZWQpIHsgcmV0dXJuIG9ialR5cGUgPT09IGV4cGVjdGVkOyB9KSkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIGZsYWdNc2cgKyAnb2JqZWN0IHRlc3RlZCBtdXN0IGJlICcgKyBzdHIgKyAnLCBidXQgJyArIG9ialR5cGUgKyAnIGdpdmVuJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG59O1xuIiwgIi8qIVxuICogQ2hhaSAtIGdldEFjdHVhbCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmdldEFjdHVhbChvYmplY3QsIFthY3R1YWxdKVxuICpcbiAqIFJldHVybnMgdGhlIGBhY3R1YWxgIHZhbHVlIGZvciBhbiBBc3NlcnRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAoY29uc3RydWN0ZWQgQXNzZXJ0aW9uKVxuICogQHBhcmFtIHtBcmd1bWVudHN9IGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZS5hc3NlcnQgYXJndW1lbnRzXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBnZXRBY3R1YWxcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldEFjdHVhbChvYmosIGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbNF0gOiBvYmouX29iajtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiAhXG4gKiBDaGFpIC0gZ2V0RnVuY05hbWUgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNiBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5nZXRGdW5jTmFtZShjb25zdHJ1Y3RvckZuKVxuICpcbiAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbi5cbiAqIFdoZW4gYSBub24tZnVuY3Rpb24gaW5zdGFuY2UgaXMgcGFzc2VkLCByZXR1cm5zIGBudWxsYC5cbiAqIFRoaXMgYWxzbyBpbmNsdWRlcyBhIHBvbHlmaWxsIGZ1bmN0aW9uIGlmIGBhRnVuYy5uYW1lYCBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAbmFtZSBnZXRGdW5jTmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3RcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIHRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmN0aW9uTmFtZU1hdGNoID0gL1xccypmdW5jdGlvbig/Olxcc3xcXHMqXFwvXFwqW14oPzoqXFwvKV0rXFwqXFwvXFxzKikqKFteXFxzXFwoXFwvXSspLztcbmZ1bmN0aW9uIGdldEZ1bmNOYW1lKGFGdW5jKSB7XG4gIGlmICh0eXBlb2YgYUZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBuYW1lID0gJyc7XG4gIGlmICh0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlLm5hbWUgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBhRnVuYy5uYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEhlcmUgd2UgcnVuIGEgcG9seWZpbGwgaWYgRnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYG5hbWVgIHByb3BlcnR5IGFuZCBpZiBhRnVuYy5uYW1lIGlzIG5vdCBkZWZpbmVkXG4gICAgdmFyIG1hdGNoID0gdG9TdHJpbmcuY2FsbChhRnVuYykubWF0Y2goZnVuY3Rpb25OYW1lTWF0Y2gpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbmFtZSA9IG1hdGNoWzFdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB3ZSd2ZSBnb3QgYSBgbmFtZWAgcHJvcGVydHkgd2UganVzdCB1c2UgaXRcbiAgICBuYW1lID0gYUZ1bmMubmFtZTtcbiAgfVxuXG4gIHJldHVybiBuYW1lO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEZ1bmNOYW1lO1xuIiwgIiIsICIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLmxvdXBlID0ge30pKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICAgIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG4gIH1cblxuICBmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2FycjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgICBpZiAoIW8pIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICAgIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gICAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgICByZXR1cm4gYXJyMjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHZhciBhbnNpQ29sb3JzID0ge1xuICAgIGJvbGQ6IFsnMScsICcyMiddLFxuICAgIGRpbTogWycyJywgJzIyJ10sXG4gICAgaXRhbGljOiBbJzMnLCAnMjMnXSxcbiAgICB1bmRlcmxpbmU6IFsnNCcsICcyNCddLFxuICAgIC8vIDUgJiA2IGFyZSBibGlua2luZ1xuICAgIGludmVyc2U6IFsnNycsICcyNyddLFxuICAgIGhpZGRlbjogWyc4JywgJzI4J10sXG4gICAgc3RyaWtlOiBbJzknLCAnMjknXSxcbiAgICAvLyAxMC0yMCBhcmUgZm9udHNcbiAgICAvLyAyMS0yOSBhcmUgcmVzZXRzIGZvciAxLTlcbiAgICBibGFjazogWyczMCcsICczOSddLFxuICAgIHJlZDogWyczMScsICczOSddLFxuICAgIGdyZWVuOiBbJzMyJywgJzM5J10sXG4gICAgeWVsbG93OiBbJzMzJywgJzM5J10sXG4gICAgYmx1ZTogWyczNCcsICczOSddLFxuICAgIG1hZ2VudGE6IFsnMzUnLCAnMzknXSxcbiAgICBjeWFuOiBbJzM2JywgJzM5J10sXG4gICAgd2hpdGU6IFsnMzcnLCAnMzknXSxcbiAgICBicmlnaHRibGFjazogWyczMDsxJywgJzM5J10sXG4gICAgYnJpZ2h0cmVkOiBbJzMxOzEnLCAnMzknXSxcbiAgICBicmlnaHRncmVlbjogWyczMjsxJywgJzM5J10sXG4gICAgYnJpZ2h0eWVsbG93OiBbJzMzOzEnLCAnMzknXSxcbiAgICBicmlnaHRibHVlOiBbJzM0OzEnLCAnMzknXSxcbiAgICBicmlnaHRtYWdlbnRhOiBbJzM1OzEnLCAnMzknXSxcbiAgICBicmlnaHRjeWFuOiBbJzM2OzEnLCAnMzknXSxcbiAgICBicmlnaHR3aGl0ZTogWyczNzsxJywgJzM5J10sXG4gICAgZ3JleTogWyc5MCcsICczOSddXG4gIH07XG4gIHZhciBzdHlsZXMgPSB7XG4gICAgc3BlY2lhbDogJ2N5YW4nLFxuICAgIG51bWJlcjogJ3llbGxvdycsXG4gICAgYmlnaW50OiAneWVsbG93JyxcbiAgICBib29sZWFuOiAneWVsbG93JyxcbiAgICB1bmRlZmluZWQ6ICdncmV5JyxcbiAgICBudWxsOiAnYm9sZCcsXG4gICAgc3RyaW5nOiAnZ3JlZW4nLFxuICAgIHN5bWJvbDogJ2dyZWVuJyxcbiAgICBkYXRlOiAnbWFnZW50YScsXG4gICAgcmVnZXhwOiAncmVkJ1xuICB9O1xuICB2YXIgdHJ1bmNhdG9yID0gJ1x1MjAyNic7XG5cbiAgZnVuY3Rpb24gY29sb3Jpc2UodmFsdWUsIHN0eWxlVHlwZSkge1xuICAgIHZhciBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXTtcblxuICAgIGlmICghY29sb3IpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBcIlxceDFCW1wiLmNvbmNhdChjb2xvclswXSwgXCJtXCIpLmNvbmNhdChTdHJpbmcodmFsdWUpLCBcIlxceDFCW1wiKS5jb25jYXQoY29sb3JbMV0sIFwibVwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBfcmVmJHNob3dIaWRkZW4gPSBfcmVmLnNob3dIaWRkZW4sXG4gICAgICAgIHNob3dIaWRkZW4gPSBfcmVmJHNob3dIaWRkZW4gPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzaG93SGlkZGVuLFxuICAgICAgICBfcmVmJGRlcHRoID0gX3JlZi5kZXB0aCxcbiAgICAgICAgZGVwdGggPSBfcmVmJGRlcHRoID09PSB2b2lkIDAgPyAyIDogX3JlZiRkZXB0aCxcbiAgICAgICAgX3JlZiRjb2xvcnMgPSBfcmVmLmNvbG9ycyxcbiAgICAgICAgY29sb3JzID0gX3JlZiRjb2xvcnMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRjb2xvcnMsXG4gICAgICAgIF9yZWYkY3VzdG9tSW5zcGVjdCA9IF9yZWYuY3VzdG9tSW5zcGVjdCxcbiAgICAgICAgY3VzdG9tSW5zcGVjdCA9IF9yZWYkY3VzdG9tSW5zcGVjdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkY3VzdG9tSW5zcGVjdCxcbiAgICAgICAgX3JlZiRzaG93UHJveHkgPSBfcmVmLnNob3dQcm94eSxcbiAgICAgICAgc2hvd1Byb3h5ID0gX3JlZiRzaG93UHJveHkgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzaG93UHJveHksXG4gICAgICAgIF9yZWYkbWF4QXJyYXlMZW5ndGggPSBfcmVmLm1heEFycmF5TGVuZ3RoLFxuICAgICAgICBtYXhBcnJheUxlbmd0aCA9IF9yZWYkbWF4QXJyYXlMZW5ndGggPT09IHZvaWQgMCA/IEluZmluaXR5IDogX3JlZiRtYXhBcnJheUxlbmd0aCxcbiAgICAgICAgX3JlZiRicmVha0xlbmd0aCA9IF9yZWYuYnJlYWtMZW5ndGgsXG4gICAgICAgIGJyZWFrTGVuZ3RoID0gX3JlZiRicmVha0xlbmd0aCA9PT0gdm9pZCAwID8gSW5maW5pdHkgOiBfcmVmJGJyZWFrTGVuZ3RoLFxuICAgICAgICBfcmVmJHNlZW4gPSBfcmVmLnNlZW4sXG4gICAgICAgIHNlZW4gPSBfcmVmJHNlZW4gPT09IHZvaWQgMCA/IFtdIDogX3JlZiRzZWVuLFxuICAgICAgICBfcmVmJHRydW5jYXRlID0gX3JlZi50cnVuY2F0ZSxcbiAgICAgICAgdHJ1bmNhdGUgPSBfcmVmJHRydW5jYXRlID09PSB2b2lkIDAgPyBJbmZpbml0eSA6IF9yZWYkdHJ1bmNhdGUsXG4gICAgICAgIF9yZWYkc3R5bGl6ZSA9IF9yZWYuc3R5bGl6ZSxcbiAgICAgICAgc3R5bGl6ZSA9IF9yZWYkc3R5bGl6ZSA9PT0gdm9pZCAwID8gU3RyaW5nIDogX3JlZiRzdHlsaXplO1xuXG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBzaG93SGlkZGVuOiBCb29sZWFuKHNob3dIaWRkZW4pLFxuICAgICAgZGVwdGg6IE51bWJlcihkZXB0aCksXG4gICAgICBjb2xvcnM6IEJvb2xlYW4oY29sb3JzKSxcbiAgICAgIGN1c3RvbUluc3BlY3Q6IEJvb2xlYW4oY3VzdG9tSW5zcGVjdCksXG4gICAgICBzaG93UHJveHk6IEJvb2xlYW4oc2hvd1Byb3h5KSxcbiAgICAgIG1heEFycmF5TGVuZ3RoOiBOdW1iZXIobWF4QXJyYXlMZW5ndGgpLFxuICAgICAgYnJlYWtMZW5ndGg6IE51bWJlcihicmVha0xlbmd0aCksXG4gICAgICB0cnVuY2F0ZTogTnVtYmVyKHRydW5jYXRlKSxcbiAgICAgIHNlZW46IHNlZW4sXG4gICAgICBzdHlsaXplOiBzdHlsaXplXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLmNvbG9ycykge1xuICAgICAgb3B0aW9ucy5zdHlsaXplID0gY29sb3Jpc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbiAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgpIHtcbiAgICB2YXIgdGFpbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1bmNhdG9yO1xuICAgIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICAgIHZhciB0YWlsTGVuZ3RoID0gdGFpbC5sZW5ndGg7XG4gICAgdmFyIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICBpZiAodGFpbExlbmd0aCA+IGxlbmd0aCAmJiBzdHJpbmdMZW5ndGggPiB0YWlsTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFpbDtcbiAgICB9XG5cbiAgICBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChzdHJpbmcuc2xpY2UoMCwgbGVuZ3RoIC0gdGFpbExlbmd0aCkpLmNvbmNhdCh0YWlsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cbiAgZnVuY3Rpb24gaW5zcGVjdExpc3QobGlzdCwgb3B0aW9ucywgaW5zcGVjdEl0ZW0pIHtcbiAgICB2YXIgc2VwYXJhdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAnLCAnO1xuICAgIGluc3BlY3RJdGVtID0gaW5zcGVjdEl0ZW0gfHwgb3B0aW9ucy5pbnNwZWN0O1xuICAgIHZhciBzaXplID0gbGlzdC5sZW5ndGg7XG4gICAgaWYgKHNpemUgPT09IDApIHJldHVybiAnJztcbiAgICB2YXIgb3JpZ2luYWxMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlO1xuICAgIHZhciBvdXRwdXQgPSAnJztcbiAgICB2YXIgcGVlayA9ICcnO1xuICAgIHZhciB0cnVuY2F0ZWQgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxKSB7XG4gICAgICB2YXIgbGFzdCA9IGkgKyAxID09PSBsaXN0Lmxlbmd0aDtcbiAgICAgIHZhciBzZWNvbmRUb0xhc3QgPSBpICsgMiA9PT0gbGlzdC5sZW5ndGg7XG4gICAgICB0cnVuY2F0ZWQgPSBcIlwiLmNvbmNhdCh0cnVuY2F0b3IsIFwiKFwiKS5jb25jYXQobGlzdC5sZW5ndGggLSBpLCBcIilcIik7XG4gICAgICB2YXIgdmFsdWUgPSBsaXN0W2ldOyAvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHJlbWFpbmluZyB3ZSBuZWVkIHRvIGFjY291bnQgZm9yIGEgc2VwYXJhdG9yIG9mIGAsIGBcblxuICAgICAgb3B0aW9ucy50cnVuY2F0ZSA9IG9yaWdpbmFsTGVuZ3RoIC0gb3V0cHV0Lmxlbmd0aCAtIChsYXN0ID8gMCA6IHNlcGFyYXRvci5sZW5ndGgpO1xuICAgICAgdmFyIHN0cmluZyA9IHBlZWsgfHwgaW5zcGVjdEl0ZW0odmFsdWUsIG9wdGlvbnMpICsgKGxhc3QgPyAnJyA6IHNlcGFyYXRvcik7XG4gICAgICB2YXIgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgICAgdmFyIHRydW5jYXRlZExlbmd0aCA9IG5leHRMZW5ndGggKyB0cnVuY2F0ZWQubGVuZ3RoOyAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGVsZW1lbnQsIGFuZCBhZGRpbmcgaXQgd291bGRcbiAgICAgIC8vIHRha2UgdXMgb3ZlciBsZW5ndGgsIGJ1dCBhZGRpbmcgdGhlIHRydW5jYXRvciB3b3VsZG4ndCAtIHRoZW4gYnJlYWsgbm93XG5cbiAgICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBvciBzZWNvbmQgdG8gbGFzdCBlbGVtZW50IHRvIHNjYW4sXG4gICAgICAvLyBidXQgdGhlIHN0cmluZyBpcyBhbHJlYWR5IG92ZXIgbGVuZ3RoIHRoZW4gYnJlYWsgaGVyZVxuXG5cbiAgICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBQZWVrIGF0IHRoZSBuZXh0IHN0cmluZyB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkXG4gICAgICAvLyBicmVhayBlYXJseSBiZWZvcmUgYWRkaW5nIHRoaXMgaXRlbSB0byB0aGUgb3V0cHV0XG5cblxuICAgICAgcGVlayA9IGxhc3QgPyAnJyA6IGluc3BlY3RJdGVtKGxpc3RbaSArIDFdLCBvcHRpb25zKSArIChzZWNvbmRUb0xhc3QgPyAnJyA6IHNlcGFyYXRvcik7IC8vIElmIHdlIGhhdmUgb25lIGVsZW1lbnQgbGVmdCwgYnV0IHRoaXMgZWxlbWVudCBhbmRcbiAgICAgIC8vIHRoZSBuZXh0IHRha2VzIG92ZXIgbGVuZ3RoLCB0aGUgYnJlYWsgZWFybHlcblxuICAgICAgaWYgKCFsYXN0ICYmIHNlY29uZFRvTGFzdCAmJiB0cnVuY2F0ZWRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBuZXh0TGVuZ3RoICsgcGVlay5sZW5ndGggPiBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgb3V0cHV0ICs9IHN0cmluZzsgLy8gSWYgdGhlIG5leHQgZWxlbWVudCB0YWtlcyB1cyB0byBsZW5ndGggLVxuICAgICAgLy8gYnV0IHRoZXJlIGFyZSBtb3JlIGFmdGVyIHRoYXQsIHRoZW4gd2Ugc2hvdWxkIHRydW5jYXRlIG5vd1xuXG4gICAgICBpZiAoIWxhc3QgJiYgIXNlY29uZFRvTGFzdCAmJiBuZXh0TGVuZ3RoICsgcGVlay5sZW5ndGggPj0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgICAgdHJ1bmNhdGVkID0gXCJcIi5jb25jYXQodHJ1bmNhdG9yLCBcIihcIikuY29uY2F0KGxpc3QubGVuZ3RoIC0gaSAtIDEsIFwiKVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRydW5jYXRlZCA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiLmNvbmNhdChvdXRwdXQpLmNvbmNhdCh0cnVuY2F0ZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVvdGVDb21wbGV4S2V5KGtleSkge1xuICAgIGlmIChrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aXzAtOV0qJC8pKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShrZXkpLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RQcm9wZXJ0eShfcmVmMiwgb3B0aW9ucykge1xuICAgIHZhciBfcmVmMyA9IF9zbGljZWRUb0FycmF5KF9yZWYyLCAyKSxcbiAgICAgICAga2V5ID0gX3JlZjNbMF0sXG4gICAgICAgIHZhbHVlID0gX3JlZjNbMV07XG5cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDI7XG5cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGtleSA9IHF1b3RlQ29tcGxleEtleShrZXkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSAhPT0gJ251bWJlcicpIHtcbiAgICAgIGtleSA9IFwiW1wiLmNvbmNhdChvcHRpb25zLmluc3BlY3Qoa2V5LCBvcHRpb25zKSwgXCJdXCIpO1xuICAgIH1cblxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI6IFwiKS5jb25jYXQodmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gICAgLy8gT2JqZWN0LmtleXMgd2lsbCBhbHdheXMgb3V0cHV0IHRoZSBBcnJheSBpbmRpY2VzIGZpcnN0LCBzbyB3ZSBjYW4gc2xpY2UgYnlcbiAgICAvLyBgYXJyYXkubGVuZ3RoYCB0byBnZXQgbm9uLWluZGV4IHByb3BlcnRpZXNcbiAgICB2YXIgbm9uSW5kZXhQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoYXJyYXkpLnNsaWNlKGFycmF5Lmxlbmd0aCk7XG4gICAgaWYgKCFhcnJheS5sZW5ndGggJiYgIW5vbkluZGV4UHJvcGVydGllcy5sZW5ndGgpIHJldHVybiAnW10nO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAgICB2YXIgbGlzdENvbnRlbnRzID0gaW5zcGVjdExpc3QoYXJyYXksIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbGlzdENvbnRlbnRzLmxlbmd0aDtcbiAgICB2YXIgcHJvcGVydHlDb250ZW50cyA9ICcnO1xuXG4gICAgaWYgKG5vbkluZGV4UHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFtrZXksIGFycmF5W2tleV1dO1xuICAgICAgfSksIG9wdGlvbnMsIGluc3BlY3RQcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiWyBcIi5jb25jYXQobGlzdENvbnRlbnRzKS5jb25jYXQocHJvcGVydHlDb250ZW50cyA/IFwiLCBcIi5jb25jYXQocHJvcGVydHlDb250ZW50cykgOiAnJywgXCIgXVwiKTtcbiAgfVxuXG4gIC8qICFcbiAgICogQ2hhaSAtIGdldEZ1bmNOYW1lIHV0aWxpdHlcbiAgICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNiBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAgICogTUlUIExpY2Vuc2VkXG4gICAqL1xuXG4gIC8qKlxuICAgKiAjIyMgLmdldEZ1bmNOYW1lKGNvbnN0cnVjdG9yRm4pXG4gICAqXG4gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbi5cbiAgICogV2hlbiBhIG5vbi1mdW5jdGlvbiBpbnN0YW5jZSBpcyBwYXNzZWQsIHJldHVybnMgYG51bGxgLlxuICAgKiBUaGlzIGFsc28gaW5jbHVkZXMgYSBwb2x5ZmlsbCBmdW5jdGlvbiBpZiBgYUZ1bmMubmFtZWAgaXMgbm90IGRlZmluZWQuXG4gICAqXG4gICAqIEBuYW1lIGdldEZ1bmNOYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0XG4gICAqIEBuYW1lc3BhY2UgVXRpbHNcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmFyIHRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuICB2YXIgZnVuY3Rpb25OYW1lTWF0Y2ggPSAvXFxzKmZ1bmN0aW9uKD86XFxzfFxccypcXC9cXCpbXig/OipcXC8pXStcXCpcXC9cXHMqKSooW15cXHNcXChcXC9dKykvO1xuICBmdW5jdGlvbiBnZXRGdW5jTmFtZShhRnVuYykge1xuICAgIGlmICh0eXBlb2YgYUZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBuYW1lID0gJyc7XG4gICAgaWYgKHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGUubmFtZSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFGdW5jLm5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBIZXJlIHdlIHJ1biBhIHBvbHlmaWxsIGlmIEZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGBuYW1lYCBwcm9wZXJ0eSBhbmQgaWYgYUZ1bmMubmFtZSBpcyBub3QgZGVmaW5lZFxuICAgICAgdmFyIG1hdGNoID0gdG9TdHJpbmcuY2FsbChhRnVuYykubWF0Y2goZnVuY3Rpb25OYW1lTWF0Y2gpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIG5hbWUgPSBtYXRjaFsxXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgd2UndmUgZ290IGEgYG5hbWVgIHByb3BlcnR5IHdlIGp1c3QgdXNlIGl0XG4gICAgICBuYW1lID0gYUZ1bmMubmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIHZhciBnZXRGdW5jTmFtZV8xID0gZ2V0RnVuY05hbWU7XG5cbiAgdmFyIGdldEFycmF5TmFtZSA9IGZ1bmN0aW9uIGdldEFycmF5TmFtZShhcnJheSkge1xuICAgIC8vIFdlIG5lZWQgdG8gc3BlY2lhbCBjYXNlIE5vZGUuanMnIEJ1ZmZlcnMsIHdoaWNoIHJlcG9ydCB0byBiZSBVaW50OEFycmF5XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgIHJldHVybiAnQnVmZmVyJztcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgICAgcmV0dXJuIGFycmF5W1N5bWJvbC50b1N0cmluZ1RhZ107XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldEZ1bmNOYW1lXzEoYXJyYXkuY29uc3RydWN0b3IpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGluc3BlY3RUeXBlZEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gICAgdmFyIG5hbWUgPSBnZXRBcnJheU5hbWUoYXJyYXkpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGggKyA0OyAvLyBPYmplY3Qua2V5cyB3aWxsIGFsd2F5cyBvdXRwdXQgdGhlIEFycmF5IGluZGljZXMgZmlyc3QsIHNvIHdlIGNhbiBzbGljZSBieVxuICAgIC8vIGBhcnJheS5sZW5ndGhgIHRvIGdldCBub24taW5kZXggcHJvcGVydGllc1xuXG4gICAgdmFyIG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICAgIGlmICghYXJyYXkubGVuZ3RoICYmICFub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSByZXR1cm4gXCJcIi5jb25jYXQobmFtZSwgXCJbXVwiKTsgLy8gQXMgd2Uga25vdyBUeXBlZEFycmF5cyBvbmx5IGNvbnRhaW4gVW5zaWduZWQgSW50ZWdlcnMsIHdlIGNhbiBza2lwIGluc3BlY3RpbmcgZWFjaCBvbmUgYW5kIHNpbXBseVxuICAgIC8vIHN0eWxpc2UgdGhlIHRvU3RyaW5nKCkgdmFsdWUgb2YgdGhlbVxuXG4gICAgdmFyIG91dHB1dCA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0cmluZyA9IFwiXCIuY29uY2F0KG9wdGlvbnMuc3R5bGl6ZSh0cnVuY2F0ZShhcnJheVtpXSwgb3B0aW9ucy50cnVuY2F0ZSksICdudW1iZXInKSkuY29uY2F0KGkgPT09IGFycmF5Lmxlbmd0aCAtIDEgPyAnJyA6ICcsICcpO1xuICAgICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgICAgb3V0cHV0ICs9IFwiXCIuY29uY2F0KHRydW5jYXRvciwgXCIoXCIpLmNvbmNhdChhcnJheS5sZW5ndGggLSBhcnJheVtpXSArIDEsIFwiKVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG91dHB1dCArPSBzdHJpbmc7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5Q29udGVudHMgPSAnJztcblxuICAgIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3Qobm9uSW5kZXhQcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBba2V5LCBhcnJheVtrZXldXTtcbiAgICAgIH0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiLmNvbmNhdChuYW1lLCBcIlsgXCIpLmNvbmNhdChvdXRwdXQpLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzID8gXCIsIFwiLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzKSA6ICcnLCBcIiBdXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdERhdGUoZGF0ZU9iamVjdCwgb3B0aW9ucykge1xuICAgIC8vIElmIHdlIG5lZWQgdG8gLSB0cnVuY2F0ZSB0aGUgdGltZSBwb3J0aW9uLCBidXQgbmV2ZXIgdGhlIGRhdGVcbiAgICB2YXIgc3BsaXQgPSBkYXRlT2JqZWN0LnRvSlNPTigpLnNwbGl0KCdUJyk7XG4gICAgdmFyIGRhdGUgPSBzcGxpdFswXTtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiXCIuY29uY2F0KGRhdGUsIFwiVFwiKS5jb25jYXQodHJ1bmNhdGUoc3BsaXRbMV0sIG9wdGlvbnMudHJ1bmNhdGUgLSBkYXRlLmxlbmd0aCAtIDEpKSwgJ2RhdGUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RGdW5jdGlvbihmdW5jLCBvcHRpb25zKSB7XG4gICAgdmFyIG5hbWUgPSBnZXRGdW5jTmFtZV8xKGZ1bmMpO1xuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdbRnVuY3Rpb25dJywgJ3NwZWNpYWwnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiW0Z1bmN0aW9uIFwiLmNvbmNhdCh0cnVuY2F0ZShuYW1lLCBvcHRpb25zLnRydW5jYXRlIC0gMTEpLCBcIl1cIiksICdzcGVjaWFsJyk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoX3JlZiwgb3B0aW9ucykge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICBrZXkgPSBfcmVmMlswXSxcbiAgICAgICAgdmFsdWUgPSBfcmVmMlsxXTtcblxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAgICBrZXkgPSBvcHRpb25zLmluc3BlY3Qoa2V5LCBvcHRpb25zKTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IGtleS5sZW5ndGg7XG4gICAgdmFsdWUgPSBvcHRpb25zLmluc3BlY3QodmFsdWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXksIFwiID0+IFwiKS5jb25jYXQodmFsdWUpO1xuICB9IC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IGBtYXAuZW50cmllcygpYFxuXG5cbiAgZnVuY3Rpb24gbWFwVG9FbnRyaWVzKG1hcCkge1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIH0pO1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdE1hcChtYXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2l6ZSA9IG1hcC5zaXplIC0gMTtcblxuICAgIGlmIChzaXplIDw9IDApIHtcbiAgICAgIHJldHVybiAnTWFwe30nO1xuICAgIH1cblxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgICByZXR1cm4gXCJNYXB7IFwiLmNvbmNhdChpbnNwZWN0TGlzdChtYXBUb0VudHJpZXMobWFwKSwgb3B0aW9ucywgaW5zcGVjdE1hcEVudHJ5KSwgXCIgfVwiKTtcbiAgfVxuXG4gIHZhciBpc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpICE9PSBpO1xuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuXG5cbiAgZnVuY3Rpb24gaW5zcGVjdE51bWJlcihudW1iZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZSgnTmFOJywgJ251bWJlcicpO1xuICAgIH1cblxuICAgIGlmIChudW1iZXIgPT09IEluZmluaXR5KSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdJbmZpbml0eScsICdudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyID09PSAtSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoJy1JbmZpbml0eScsICdudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKDEgLyBudW1iZXIgPT09IEluZmluaXR5ID8gJyswJyA6ICctMCcsICdudW1iZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKG51bWJlciwgb3B0aW9ucy50cnVuY2F0ZSksICdudW1iZXInKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RCaWdJbnQobnVtYmVyLCBvcHRpb25zKSB7XG4gICAgdmFyIG51bXMgPSB0cnVuY2F0ZShudW1iZXIudG9TdHJpbmcoKSwgb3B0aW9ucy50cnVuY2F0ZSAtIDEpO1xuICAgIGlmIChudW1zICE9PSB0cnVuY2F0b3IpIG51bXMgKz0gJ24nO1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUobnVtcywgJ2JpZ2ludCcpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdFJlZ0V4cCh2YWx1ZSwgb3B0aW9ucykge1xuICAgIHZhciBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy8nKVsyXTtcbiAgICB2YXIgc291cmNlTGVuZ3RoID0gb3B0aW9ucy50cnVuY2F0ZSAtICgyICsgZmxhZ3MubGVuZ3RoKTtcbiAgICB2YXIgc291cmNlID0gdmFsdWUuc291cmNlO1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCIvXCIuY29uY2F0KHRydW5jYXRlKHNvdXJjZSwgc291cmNlTGVuZ3RoKSwgXCIvXCIpLmNvbmNhdChmbGFncyksICdyZWdleHAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5RnJvbVNldChzZXQpIHtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RTZXQoc2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKHNldC5zaXplID09PSAwKSByZXR1cm4gJ1NldHt9JztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gICAgcmV0dXJuIFwiU2V0eyBcIi5jb25jYXQoaW5zcGVjdExpc3QoYXJyYXlGcm9tU2V0KHNldCksIG9wdGlvbnMpLCBcIiB9XCIpO1xuICB9XG5cbiAgdmFyIHN0cmluZ0VzY2FwZUNoYXJzID0gbmV3IFJlZ0V4cChcIlsnXFxcXHUwMDAwLVxcXFx1MDAxZlxcXFx1MDA3Zi1cXFxcdTAwOWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XCIgKyBcIlxcXFx1MjAwYy1cXFxcdTIwMGZcXFxcdTIwMjgtXFxcXHUyMDJmXFxcXHUyMDYwLVxcXFx1MjA2ZlxcXFx1ZmVmZlxcXFx1ZmZmMC1cXFxcdWZmZmZdXCIsICdnJyk7XG4gIHZhciBlc2NhcGVDaGFyYWN0ZXJzID0ge1xuICAgICdcXGInOiAnXFxcXGInLFxuICAgICdcXHQnOiAnXFxcXHQnLFxuICAgICdcXG4nOiAnXFxcXG4nLFxuICAgICdcXGYnOiAnXFxcXGYnLFxuICAgICdcXHInOiAnXFxcXHInLFxuICAgIFwiJ1wiOiBcIlxcXFwnXCIsXG4gICAgJ1xcXFwnOiAnXFxcXFxcXFwnXG4gIH07XG4gIHZhciBoZXggPSAxNjtcbiAgdmFyIHVuaWNvZGVMZW5ndGggPSA0O1xuXG4gIGZ1bmN0aW9uIGVzY2FwZShjaGFyKSB7XG4gICAgcmV0dXJuIGVzY2FwZUNoYXJhY3RlcnNbY2hhcl0gfHwgXCJcXFxcdVwiLmNvbmNhdChcIjAwMDBcIi5jb25jYXQoY2hhci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKGhleCkpLnNsaWNlKC11bmljb2RlTGVuZ3RoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0cmluZywgb3B0aW9ucykge1xuICAgIGlmIChzdHJpbmdFc2NhcGVDaGFycy50ZXN0KHN0cmluZykpIHtcbiAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHN0cmluZ0VzY2FwZUNoYXJzLCBlc2NhcGUpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCInXCIuY29uY2F0KHRydW5jYXRlKHN0cmluZywgb3B0aW9ucy50cnVuY2F0ZSAtIDIpLCBcIidcIiksICdzdHJpbmcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RTeW1ib2wodmFsdWUpIHtcbiAgICBpZiAoJ2Rlc2NyaXB0aW9uJyBpbiBTeW1ib2wucHJvdG90eXBlKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZGVzY3JpcHRpb24gPyBcIlN5bWJvbChcIi5jb25jYXQodmFsdWUuZGVzY3JpcHRpb24sIFwiKVwiKSA6ICdTeW1ib2woKSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cblxuICB2YXIgZ2V0UHJvbWlzZVZhbHVlID0gZnVuY3Rpb24gZ2V0UHJvbWlzZVZhbHVlKCkge1xuICAgIHJldHVybiAnUHJvbWlzZXtcdTIwMjZ9JztcbiAgfTtcblxuICB0cnkge1xuICAgIHZhciBfcHJvY2VzcyRiaW5kaW5nID0gcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyksXG4gICAgICAgIGdldFByb21pc2VEZXRhaWxzID0gX3Byb2Nlc3MkYmluZGluZy5nZXRQcm9taXNlRGV0YWlscyxcbiAgICAgICAga1BlbmRpbmcgPSBfcHJvY2VzcyRiaW5kaW5nLmtQZW5kaW5nLFxuICAgICAgICBrUmVqZWN0ZWQgPSBfcHJvY2VzcyRiaW5kaW5nLmtSZWplY3RlZDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGdldFByb21pc2VEZXRhaWxzKFByb21pc2UucmVzb2x2ZSgpKSkpIHtcbiAgICAgIGdldFByb21pc2VWYWx1ZSA9IGZ1bmN0aW9uIGdldFByb21pc2VWYWx1ZSh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2dldFByb21pc2VEZXRhaWxzID0gZ2V0UHJvbWlzZURldGFpbHModmFsdWUpLFxuICAgICAgICAgICAgX2dldFByb21pc2VEZXRhaWxzMiA9IF9zbGljZWRUb0FycmF5KF9nZXRQcm9taXNlRGV0YWlscywgMiksXG4gICAgICAgICAgICBzdGF0ZSA9IF9nZXRQcm9taXNlRGV0YWlsczJbMF0sXG4gICAgICAgICAgICBpbm5lclZhbHVlID0gX2dldFByb21pc2VEZXRhaWxzMlsxXTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IGtQZW5kaW5nKSB7XG4gICAgICAgICAgcmV0dXJuICdQcm9taXNlezxwZW5kaW5nPn0nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiUHJvbWlzZVwiLmNvbmNhdChzdGF0ZSA9PT0ga1JlamVjdGVkID8gJyEnIDogJycsIFwie1wiKS5jb25jYXQob3B0aW9ucy5pbnNwZWN0KGlubmVyVmFsdWUsIG9wdGlvbnMpLCBcIn1cIik7XG4gICAgICB9O1xuICAgIH1cbiAgfSBjYXRjaCAobm90Tm9kZSkge1xuICAgIC8qIGlnbm9yZSAqL1xuICB9XG5cbiAgdmFyIGluc3BlY3RQcm9taXNlID0gZ2V0UHJvbWlzZVZhbHVlO1xuXG4gIGZ1bmN0aW9uIGluc3BlY3RPYmplY3Qob2JqZWN0LCBvcHRpb25zKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmplY3QpO1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KSA6IFtdO1xuXG4gICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID09PSAwICYmIHN5bWJvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ3t9JztcbiAgICB9XG5cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gICAgb3B0aW9ucy5zZWVuID0gb3B0aW9ucy5zZWVuIHx8IFtdO1xuXG4gICAgaWYgKG9wdGlvbnMuc2Vlbi5pbmRleE9mKG9iamVjdCkgPj0gMCkge1xuICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBvcHRpb25zLnNlZW4ucHVzaChvYmplY3QpO1xuICAgIHZhciBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgICB2YXIgc3ltYm9sQ29udGVudHMgPSBpbnNwZWN0TGlzdChzeW1ib2xzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIG9wdGlvbnMuc2Vlbi5wb3AoKTtcbiAgICB2YXIgc2VwID0gJyc7XG5cbiAgICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgICAgc2VwID0gJywgJztcbiAgICB9XG5cbiAgICByZXR1cm4gXCJ7IFwiLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzKS5jb25jYXQoc2VwKS5jb25jYXQoc3ltYm9sQ29udGVudHMsIFwiIH1cIik7XG4gIH1cblxuICB2YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiBmYWxzZTtcbiAgZnVuY3Rpb24gaW5zcGVjdENsYXNzKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgdmFyIG5hbWUgPSAnJztcblxuICAgIGlmICh0b1N0cmluZ1RhZyAmJiB0b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgICAgbmFtZSA9IHZhbHVlW3RvU3RyaW5nVGFnXTtcbiAgICB9XG5cbiAgICBuYW1lID0gbmFtZSB8fCBnZXRGdW5jTmFtZV8xKHZhbHVlLmNvbnN0cnVjdG9yKTsgLy8gQmFiZWwgdHJhbnNmb3JtcyBhbm9ueW1vdXMgY2xhc3NlcyB0byB0aGUgbmFtZSBgX2NsYXNzYFxuXG4gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT09ICdfY2xhc3MnKSB7XG4gICAgICBuYW1lID0gJzxBbm9ueW1vdXMgQ2xhc3M+JztcbiAgICB9XG5cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChuYW1lKS5jb25jYXQoaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucykpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdEFyZ3VtZW50cyhhcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gJ0FyZ3VtZW50c1tdJztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDEzO1xuICAgIHJldHVybiBcIkFyZ3VtZW50c1sgXCIuY29uY2F0KGluc3BlY3RMaXN0KGFyZ3MsIG9wdGlvbnMpLCBcIiBdXCIpO1xuICB9XG5cbiAgdmFyIGVycm9yS2V5cyA9IFsnc3RhY2snLCAnbGluZScsICdjb2x1bW4nLCAnbmFtZScsICdtZXNzYWdlJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnY29sdW1uTnVtYmVyJywgJ251bWJlcicsICdkZXNjcmlwdGlvbiddO1xuICBmdW5jdGlvbiBpbnNwZWN0T2JqZWN0JDEoZXJyb3IsIG9wdGlvbnMpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIGVycm9yS2V5cy5pbmRleE9mKGtleSkgPT09IC0xO1xuICAgIH0pO1xuICAgIHZhciBuYW1lID0gZXJyb3IubmFtZTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoO1xuICAgIHZhciBtZXNzYWdlID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlID0gdHJ1bmNhdGUoZXJyb3IubWVzc2FnZSwgb3B0aW9ucy50cnVuY2F0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BlcnRpZXMudW5zaGlmdCgnbWVzc2FnZScpO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlID8gXCI6IFwiLmNvbmNhdChtZXNzYWdlKSA6ICcnO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbWVzc2FnZS5sZW5ndGggKyA1O1xuICAgIHZhciBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIGVycm9yW2tleV1dO1xuICAgIH0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChuYW1lKS5jb25jYXQobWVzc2FnZSkuY29uY2F0KHByb3BlcnR5Q29udGVudHMgPyBcIiB7IFwiLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzLCBcIiB9XCIpIDogJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdEF0dHJpYnV0ZShfcmVmLCBvcHRpb25zKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIGtleSA9IF9yZWYyWzBdLFxuICAgICAgICB2YWx1ZSA9IF9yZWYyWzFdO1xuXG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSAzO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KG9wdGlvbnMuc3R5bGl6ZShrZXksICd5ZWxsb3cnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG9wdGlvbnMuc3R5bGl6ZShrZXksICd5ZWxsb3cnKSwgXCI9XCIpLmNvbmNhdChvcHRpb25zLnN0eWxpemUoXCJcXFwiXCIuY29uY2F0KHZhbHVlLCBcIlxcXCJcIiksICdzdHJpbmcnKSk7XG4gIH1cbiAgZnVuY3Rpb24gaW5zcGVjdEhUTUxDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdEhUTUwsICdcXG4nKTtcbiAgfVxuICBmdW5jdGlvbiBpbnNwZWN0SFRNTChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgdmFyIG5hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgaGVhZCA9IG9wdGlvbnMuc3R5bGl6ZShcIjxcIi5jb25jYXQobmFtZSksICdzcGVjaWFsJyk7XG4gICAgdmFyIGhlYWRDbG9zZSA9IG9wdGlvbnMuc3R5bGl6ZShcIj5cIiwgJ3NwZWNpYWwnKTtcbiAgICB2YXIgdGFpbCA9IG9wdGlvbnMuc3R5bGl6ZShcIjwvXCIuY29uY2F0KG5hbWUsIFwiPlwiKSwgJ3NwZWNpYWwnKTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoICogMiArIDU7XG4gICAgdmFyIHByb3BlcnR5Q29udGVudHMgPSAnJztcblxuICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb3BlcnR5Q29udGVudHMgKz0gJyAnO1xuICAgICAgcHJvcGVydHlDb250ZW50cyArPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBba2V5LCBlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpXTtcbiAgICAgIH0pLCBvcHRpb25zLCBpbnNwZWN0QXR0cmlidXRlLCAnICcpO1xuICAgIH1cblxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gcHJvcGVydHlDb250ZW50cy5sZW5ndGg7XG4gICAgdmFyIHRydW5jYXRlID0gb3B0aW9ucy50cnVuY2F0ZTtcbiAgICB2YXIgY2hpbGRyZW4gPSBpbnNwZWN0SFRNTENvbGxlY3Rpb24oZWxlbWVudC5jaGlsZHJlbiwgb3B0aW9ucyk7XG5cbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gdHJ1bmNhdGUpIHtcbiAgICAgIGNoaWxkcmVuID0gXCJcIi5jb25jYXQodHJ1bmNhdG9yLCBcIihcIikuY29uY2F0KGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoLCBcIilcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGhlYWQpLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzKS5jb25jYXQoaGVhZENsb3NlKS5jb25jYXQoY2hpbGRyZW4pLmNvbmNhdCh0YWlsKTtcbiAgfVxuXG4gIHZhciBzeW1ib2xzU3VwcG9ydGVkID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLmZvciA9PT0gJ2Z1bmN0aW9uJztcbiAgdmFyIGNoYWlJbnNwZWN0ID0gc3ltYm9sc1N1cHBvcnRlZCA/IFN5bWJvbC5mb3IoJ2NoYWkvaW5zcGVjdCcpIDogJ0BAY2hhaS9pbnNwZWN0JztcbiAgdmFyIG5vZGVJbnNwZWN0ID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICB2YXIgbm9kZVV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbiAgICBub2RlSW5zcGVjdCA9IG5vZGVVdGlsLmluc3BlY3QgPyBub2RlVXRpbC5pbnNwZWN0LmN1c3RvbSA6IGZhbHNlO1xuICB9IGNhdGNoIChub05vZGVJbnNwZWN0KSB7XG4gICAgbm9kZUluc3BlY3QgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBjb25zdHJ1Y3Rvck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciBzdHJpbmdUYWdNYXAgPSB7fTtcbiAgdmFyIGJhc2VUeXBlc01hcCA9IHtcbiAgICB1bmRlZmluZWQ6IGZ1bmN0aW9uIHVuZGVmaW5lZCQxKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gICAgfSxcbiAgICBudWxsOiBmdW5jdGlvbiBfbnVsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShudWxsLCAnbnVsbCcpO1xuICAgIH0sXG4gICAgYm9vbGVhbjogZnVuY3Rpb24gYm9vbGVhbih2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZSh2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgICB9LFxuICAgIEJvb2xlYW46IGZ1bmN0aW9uIEJvb2xlYW4odmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUodmFsdWUsICdib29sZWFuJyk7XG4gICAgfSxcbiAgICBudW1iZXI6IGluc3BlY3ROdW1iZXIsXG4gICAgTnVtYmVyOiBpbnNwZWN0TnVtYmVyLFxuICAgIGJpZ2ludDogaW5zcGVjdEJpZ0ludCxcbiAgICBCaWdJbnQ6IGluc3BlY3RCaWdJbnQsXG4gICAgc3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICAgIFN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgICBmdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICAgIEZ1bmN0aW9uOiBpbnNwZWN0RnVuY3Rpb24sXG4gICAgc3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICAgIC8vIEEgU3ltYm9sIHBvbHlmaWxsIHdpbGwgcmV0dXJuIGBTeW1ib2xgIG5vdCBgc3ltYm9sYCBmcm9tIHR5cGVkZXRlY3RcbiAgICBTeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gICAgQXJyYXk6IGluc3BlY3RBcnJheSxcbiAgICBEYXRlOiBpbnNwZWN0RGF0ZSxcbiAgICBNYXA6IGluc3BlY3RNYXAsXG4gICAgU2V0OiBpbnNwZWN0U2V0LFxuICAgIFJlZ0V4cDogaW5zcGVjdFJlZ0V4cCxcbiAgICBQcm9taXNlOiBpbnNwZWN0UHJvbWlzZSxcbiAgICAvLyBXZWFrU2V0LCBXZWFrTWFwIGFyZSB0b3RhbGx5IG9wYXF1ZSB0byB1c1xuICAgIFdlYWtTZXQ6IGZ1bmN0aW9uIFdlYWtTZXQodmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoJ1dlYWtTZXR7XHUyMDI2fScsICdzcGVjaWFsJyk7XG4gICAgfSxcbiAgICBXZWFrTWFwOiBmdW5jdGlvbiBXZWFrTWFwKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdXZWFrTWFwe1x1MjAyNn0nLCAnc3BlY2lhbCcpO1xuICAgIH0sXG4gICAgQXJndW1lbnRzOiBpbnNwZWN0QXJndW1lbnRzLFxuICAgIEludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgVWludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEludDE2QXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIFVpbnQxNkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBJbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBVaW50MzJBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgRmxvYXQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBGbG9hdDY0QXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEdlbmVyYXRvcjogZnVuY3Rpb24gR2VuZXJhdG9yKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0sXG4gICAgRGF0YVZpZXc6IGZ1bmN0aW9uIERhdGFWaWV3KCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0sXG4gICAgQXJyYXlCdWZmZXI6IGZ1bmN0aW9uIEFycmF5QnVmZmVyKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0sXG4gICAgRXJyb3I6IGluc3BlY3RPYmplY3QkMSxcbiAgICBIVE1MQ29sbGVjdGlvbjogaW5zcGVjdEhUTUxDb2xsZWN0aW9uLFxuICAgIE5vZGVMaXN0OiBpbnNwZWN0SFRNTENvbGxlY3Rpb25cbiAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuICB2YXIgaW5zcGVjdEN1c3RvbSA9IGZ1bmN0aW9uIGluc3BlY3RDdXN0b20odmFsdWUsIG9wdGlvbnMsIHR5cGUpIHtcbiAgICBpZiAoY2hhaUluc3BlY3QgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlW2NoYWlJbnNwZWN0XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlW2NoYWlJbnNwZWN0XShvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZUluc3BlY3QgJiYgbm9kZUluc3BlY3QgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlW25vZGVJbnNwZWN0XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlW25vZGVJbnNwZWN0XShvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoJ2luc3BlY3QnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaW5zcGVjdChvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoJ2NvbnN0cnVjdG9yJyBpbiB2YWx1ZSAmJiBjb25zdHJ1Y3Rvck1hcC5oYXModmFsdWUuY29uc3RydWN0b3IpKSB7XG4gICAgICByZXR1cm4gY29uc3RydWN0b3JNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHN0cmluZ1RhZ01hcFt0eXBlXSkge1xuICAgICAgcmV0dXJuIHN0cmluZ1RhZ01hcFt0eXBlXSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIHZhciB0b1N0cmluZyQxID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG5vcm1hbGlzZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgb3B0aW9ucy5pbnNwZWN0ID0gaW5zcGVjdDtcbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICBjdXN0b21JbnNwZWN0ID0gX29wdGlvbnMuY3VzdG9tSW5zcGVjdDtcbiAgICB2YXIgdHlwZSA9IHZhbHVlID09PSBudWxsID8gJ251bGwnIDogX3R5cGVvZih2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHR5cGUgPSB0b1N0cmluZyQxLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKTtcbiAgICB9IC8vIElmIGl0IGlzIGEgYmFzZSB2YWx1ZSB0aGF0IHdlIGFscmVhZHkgc3VwcG9ydCwgdGhlbiB1c2UgTG91cGUncyBpbnNwZWN0b3JcblxuXG4gICAgaWYgKGJhc2VUeXBlc01hcFt0eXBlXSkge1xuICAgICAgcmV0dXJuIGJhc2VUeXBlc01hcFt0eXBlXSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfSAvLyBJZiBgb3B0aW9ucy5jdXN0b21JbnNwZWN0YCBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHRyeSB0byB1c2UgdGhlIGN1c3RvbSBpbnNwZWN0b3JcblxuXG4gICAgaWYgKGN1c3RvbUluc3BlY3QgJiYgdmFsdWUpIHtcbiAgICAgIHZhciBvdXRwdXQgPSBpbnNwZWN0Q3VzdG9tKHZhbHVlLCBvcHRpb25zLCB0eXBlKTtcblxuICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIHJldHVybiBpbnNwZWN0KG91dHB1dCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gdmFsdWUgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpIDogZmFsc2U7IC8vIElmIGl0J3MgYSBwbGFpbiBPYmplY3QgdGhlbiB1c2UgTG91cGUncyBpbnNwZWN0b3JcblxuICAgIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGluc3BlY3RPYmplY3QodmFsdWUsIG9wdGlvbnMpO1xuICAgIH0gLy8gU3BlY2lmaWNhbGx5IGFjY291bnQgZm9yIEhUTUxFbGVtZW50c1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBpbnNwZWN0SFRNTCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKCdjb25zdHJ1Y3RvcicgaW4gdmFsdWUpIHtcbiAgICAgIC8vIElmIGl0IGlzIGEgY2xhc3MsIGluc3BlY3QgaXQgbGlrZSBhbiBvYmplY3QgYnV0IGFkZCB0aGUgY29uc3RydWN0b3IgbmFtZVxuICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICB9IC8vIElmIGl0IGlzIGFuIG9iamVjdCB3aXRoIGFuIGFub255bW91cyBwcm90b3R5cGUsIGRpc3BsYXkgaXQgYXMgYW4gb2JqZWN0LlxuXG5cbiAgICAgIHJldHVybiBpbnNwZWN0T2JqZWN0KHZhbHVlLCBvcHRpb25zKTtcbiAgICB9IC8vIGxhc3QgY2hhbmNlIHRvIGNoZWNrIGlmIGl0J3MgYW4gb2JqZWN0XG5cblxuICAgIGlmICh2YWx1ZSA9PT0gT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGluc3BlY3RPYmplY3QodmFsdWUsIG9wdGlvbnMpO1xuICAgIH0gLy8gV2UgaGF2ZSBydW4gb3V0IG9mIG9wdGlvbnMhIEp1c3Qgc3RyaW5naWZ5IHRoZSB2YWx1ZVxuXG5cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIHR5cGUpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyQ29uc3RydWN0b3IoY29uc3RydWN0b3IsIGluc3BlY3Rvcikge1xuICAgIGlmIChjb25zdHJ1Y3Rvck1hcC5oYXMoY29uc3RydWN0b3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3JNYXAuYWRkKGNvbnN0cnVjdG9yLCBpbnNwZWN0b3IpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU3RyaW5nVGFnKHN0cmluZ1RhZywgaW5zcGVjdG9yKSB7XG4gICAgaWYgKHN0cmluZ1RhZyBpbiBzdHJpbmdUYWdNYXApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdHJpbmdUYWdNYXBbc3RyaW5nVGFnXSA9IGluc3BlY3RvcjtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgY3VzdG9tID0gY2hhaUluc3BlY3Q7XG5cbiAgZXhwb3J0cy5jdXN0b20gPSBjdXN0b207XG4gIGV4cG9ydHMuZGVmYXVsdCA9IGluc3BlY3Q7XG4gIGV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG4gIGV4cG9ydHMucmVnaXN0ZXJDb25zdHJ1Y3RvciA9IHJlZ2lzdGVyQ29uc3RydWN0b3I7XG4gIGV4cG9ydHMucmVnaXN0ZXJTdHJpbmdUYWcgPSByZWdpc3RlclN0cmluZ1RhZztcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwgIm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmluY2x1ZGVTdGFja1xuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgaW5mbHVlbmNlcyB3aGV0aGVyIHN0YWNrIHRyYWNlXG4gICAqIGlzIGluY2x1ZGVkIGluIEFzc2VydGlvbiBlcnJvciBtZXNzYWdlLiBEZWZhdWx0IG9mIGZhbHNlXG4gICAqIHN1cHByZXNzZXMgc3RhY2sgdHJhY2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgPSB0cnVlOyAgLy8gZW5hYmxlIHN0YWNrIG9uIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgaW5jbHVkZVN0YWNrOiBmYWxzZSxcblxuICAvKipcbiAgICogIyMjIGNvbmZpZy5zaG93RGlmZlxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgaW5mbHVlbmNlcyB3aGV0aGVyIG9yIG5vdFxuICAgKiB0aGUgYHNob3dEaWZmYCBmbGFnIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3duXG4gICAqIEFzc2VydGlvbkVycm9ycy4gYGZhbHNlYCB3aWxsIGFsd2F5cyBiZSBgZmFsc2VgOyBgdHJ1ZWBcbiAgICogd2lsbCBiZSB0cnVlIHdoZW4gdGhlIGFzc2VydGlvbiBoYXMgcmVxdWVzdGVkIGEgZGlmZlxuICAgKiBiZSBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBzaG93RGlmZjogdHJ1ZSxcblxuICAvKipcbiAgICogIyMjIGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZFxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgc2V0cyBsZW5ndGggdGhyZXNob2xkIGZvciBhY3R1YWwgYW5kXG4gICAqIGV4cGVjdGVkIHZhbHVlcyBpbiBhc3NlcnRpb24gZXJyb3JzLiBJZiB0aGlzIHRocmVzaG9sZCBpcyBleGNlZWRlZCwgZm9yXG4gICAqIGV4YW1wbGUgZm9yIGxhcmdlIGRhdGEgc3RydWN0dXJlcywgdGhlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nXG4gICAqIGxpa2UgYFsgQXJyYXkoMykgXWAgb3IgYHsgT2JqZWN0IChwcm9wMSwgcHJvcDIpIH1gLlxuICAgKlxuICAgKiBTZXQgaXQgdG8gemVybyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRydW5jYXRpbmcgYWx0b2dldGhlci5cbiAgICpcbiAgICogVGhpcyBpcyBlc3BlY2lhbGx5IHVzZXJmdWwgd2hlbiBkb2luZyBhc3NlcnRpb25zIG9uIGFycmF5czogaGF2aW5nIHRoaXNcbiAgICogc2V0IHRvIGEgcmVhc29uYWJsZSBsYXJnZSB2YWx1ZSBtYWtlcyB0aGUgZmFpbHVyZSBtZXNzYWdlcyByZWFkaWx5XG4gICAqIGluc3BlY3RhYmxlLlxuICAgKlxuICAgKiAgICAgY2hhaS5jb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgPSAwOyAgLy8gZGlzYWJsZSB0cnVuY2F0aW5nXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB0cnVuY2F0ZVRocmVzaG9sZDogNDAsXG5cbiAgLyoqXG4gICAqICMjIyBjb25maWcudXNlUHJveHlcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgaWYgY2hhaSB3aWxsIHVzZSBhIFByb3h5IHRvIHRocm93XG4gICAqIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnQgcHJvcGVydHkgaXMgcmVhZCwgd2hpY2ggcHJvdGVjdHMgdXNlcnNcbiAgICogZnJvbSB0eXBvcyB3aGVuIHVzaW5nIHByb3BlcnR5LWJhc2VkIGFzc2VydGlvbnMuXG4gICAqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cbiAgICpcbiAgICogICAgIGNoYWkuY29uZmlnLnVzZVByb3h5ID0gZmFsc2U7ICAvLyBkaXNhYmxlIHVzZSBvZiBQcm94eVxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlnIHZhbHVlXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IGRvbid0IHN1cHBvcnQgcHJveGllcy5cbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB1c2VQcm94eTogdHJ1ZSxcblxuICAvKipcbiAgICogIyMjIGNvbmZpZy5wcm94eUV4Y2x1ZGVkS2V5c1xuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgZGVmaW5lcyB3aGljaCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlIGFzc2VydGlvbi5cbiAgICogVGhpcyBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIGVudmlyb25tZW50IENoYWkgaXMgcnVubmluZyBpbiBzdXBwb3J0cyBwcm94aWVzIGFuZFxuICAgKiBpZiB0aGUgYHVzZVByb3h5YCBjb25maWd1cmF0aW9uIHNldHRpbmcgaXMgZW5hYmxlZC5cbiAgICogQnkgZGVmYXVsdCwgYHRoZW5gIGFuZCBgaW5zcGVjdGAgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlXG4gICAqIGFzc2VydGlvbiBvYmplY3QgYmVjYXVzZSB0aGUgYC5pbnNwZWN0YCBwcm9wZXJ0eSBpcyByZWFkIGJ5IGB1dGlsLmluc3BlY3RgIChmb3IgZXhhbXBsZSwgd2hlblxuICAgKiB1c2luZyBgY29uc29sZS5sb2dgIG9uIHRoZSBhc3NlcnRpb24gb2JqZWN0KSBhbmQgYC50aGVuYCBpcyBuZWNlc3NhcnkgZm9yIHByb21pc2UgdHlwZS1jaGVja2luZy5cbiAgICpcbiAgICogICAgIC8vIEJ5IGRlZmF1bHQgdGhlc2Uga2V5cyB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciBpZiB0aGV5IGRvIG5vdCBleGlzdCBvbiB0aGUgYXNzZXJ0aW9uIG9iamVjdFxuICAgKiAgICAgY2hhaS5jb25maWcucHJveHlFeGNsdWRlZEtleXMgPSBbJ3RoZW4nLCAnaW5zcGVjdCddO1xuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBwcm94eUV4Y2x1ZGVkS2V5czogWyd0aGVuJywgJ2NhdGNoJywgJ2luc3BlY3QnLCAndG9KU09OJ11cbn07XG4iLCAiLy8gVGhpcyBpcyAoYWxtb3N0KSBkaXJlY3RseSBmcm9tIE5vZGUuanMgdXRpbHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9ibG9iL2Y4YzMzNWQwY2FmNDdmMTZkMzE0MTNmODlhYTI4ZWRhMzg3OGUzYWEvbGliL3V0aWwuanNcblxudmFyIGdldE5hbWUgPSByZXF1aXJlKCdnZXQtZnVuYy1uYW1lJyk7XG52YXIgbG91cGUgPSByZXF1aXJlKCdsb3VwZScpO1xudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluc3BlY3Q7XG5cbi8qKlxuICogIyMjIC5pbnNwZWN0KG9iaiwgW3Nob3dIaWRkZW5dLCBbZGVwdGhdLCBbY29sb3JzXSlcbiAqXG4gKiBFY2hvZXMgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyaWVzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNob3dIaWRkZW4gRmxhZyB0aGF0IHNob3dzIGhpZGRlbiAobm90IGVudW1lcmFibGUpXG4gKiAgICBwcm9wZXJ0aWVzIG9mIG9iamVjdHMuIERlZmF1bHQgaXMgZmFsc2UuXG4gKiBAcGFyYW0ge051bWJlcn0gZGVwdGggRGVwdGggaW4gd2hpY2ggdG8gZGVzY2VuZCBpbiBvYmplY3QuIERlZmF1bHQgaXMgMi5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gY29sb3JzIEZsYWcgdG8gdHVybiBvbiBBTlNJIGVzY2FwZSBjb2RlcyB0byBjb2xvciB0aGVcbiAqICAgIG91dHB1dC4gRGVmYXVsdCBpcyBmYWxzZSAobm8gY29sb3JpbmcpLlxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgaW5zcGVjdFxuICovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycykge1xuICB2YXIgb3B0aW9ucyA9IHtcbiAgICBjb2xvcnM6IGNvbG9ycyxcbiAgICBkZXB0aDogKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcgPyAyIDogZGVwdGgpLFxuICAgIHNob3dIaWRkZW46IHNob3dIaWRkZW4sXG4gICAgdHJ1bmNhdGU6IGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA/IGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA6IEluZmluaXR5LFxuICB9O1xuICByZXR1cm4gbG91cGUuaW5zcGVjdChvYmosIG9wdGlvbnMpO1xufVxuIiwgIi8qIVxuICogQ2hhaSAtIGZsYWcgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qIVxuICogTW9kdWxlIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnLi9pbnNwZWN0Jyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cbi8qKlxuICogIyMjIC5vYmpEaXNwbGF5KG9iamVjdClcbiAqXG4gKiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBvciBhbiBhcnJheSBtYXRjaGVzXG4gKiBjcml0ZXJpYSB0byBiZSBpbnNwZWN0ZWQgaW4tbGluZSBmb3IgZXJyb3JcbiAqIG1lc3NhZ2VzIG9yIHNob3VsZCBiZSB0cnVuY2F0ZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gamF2YXNjcmlwdCBvYmplY3QgdG8gaW5zcGVjdFxuICogQG5hbWUgb2JqRGlzcGxheVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9iakRpc3BsYXkob2JqKSB7XG4gIHZhciBzdHIgPSBpbnNwZWN0KG9iailcbiAgICAsIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcblxuICBpZiAoY29uZmlnLnRydW5jYXRlVGhyZXNob2xkICYmIHN0ci5sZW5ndGggPj0gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkKSB7XG4gICAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScpIHtcbiAgICAgIHJldHVybiAhb2JqLm5hbWUgfHwgb2JqLm5hbWUgPT09ICcnXG4gICAgICAgID8gJ1tGdW5jdGlvbl0nXG4gICAgICAgIDogJ1tGdW5jdGlvbjogJyArIG9iai5uYW1lICsgJ10nO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgcmV0dXJuICdbIEFycmF5KCcgKyBvYmoubGVuZ3RoICsgJykgXSc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICwga3N0ciA9IGtleXMubGVuZ3RoID4gMlxuICAgICAgICAgID8ga2V5cy5zcGxpY2UoMCwgMikuam9pbignLCAnKSArICcsIC4uLidcbiAgICAgICAgICA6IGtleXMuam9pbignLCAnKTtcbiAgICAgIHJldHVybiAneyBPYmplY3QgKCcgKyBrc3RyICsgJykgfSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gbWVzc2FnZSBjb21wb3NpdGlvbiB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKVxuICAsIGdldEFjdHVhbCA9IHJlcXVpcmUoJy4vZ2V0QWN0dWFsJylcbiAgLCBvYmpEaXNwbGF5ID0gcmVxdWlyZSgnLi9vYmpEaXNwbGF5Jyk7XG5cbi8qKlxuICogIyMjIC5nZXRNZXNzYWdlKG9iamVjdCwgbWVzc2FnZSwgbmVnYXRlTWVzc2FnZSlcbiAqXG4gKiBDb25zdHJ1Y3QgdGhlIGVycm9yIG1lc3NhZ2UgYmFzZWQgb24gZmxhZ3NcbiAqIGFuZCB0ZW1wbGF0ZSB0YWdzLiBUZW1wbGF0ZSB0YWdzIHdpbGwgcmV0dXJuXG4gKiBhIHN0cmluZ2lmaWVkIGluc3BlY3Rpb24gb2YgdGhlIG9iamVjdCByZWZlcmVuY2VkLlxuICpcbiAqIE1lc3NhZ2UgdGVtcGxhdGUgdGFnczpcbiAqIC0gYCN7dGhpc31gIGN1cnJlbnQgYXNzZXJ0ZWQgb2JqZWN0XG4gKiAtIGAje2FjdH1gIGFjdHVhbCB2YWx1ZVxuICogLSBgI3tleHB9YCBleHBlY3RlZCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgKGNvbnN0cnVjdGVkIEFzc2VydGlvbilcbiAqIEBwYXJhbSB7QXJndW1lbnRzfSBjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUuYXNzZXJ0IGFyZ3VtZW50c1xuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0TWVzc2FnZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE1lc3NhZ2Uob2JqLCBhcmdzKSB7XG4gIHZhciBuZWdhdGUgPSBmbGFnKG9iaiwgJ25lZ2F0ZScpXG4gICAgLCB2YWwgPSBmbGFnKG9iaiwgJ29iamVjdCcpXG4gICAgLCBleHBlY3RlZCA9IGFyZ3NbM11cbiAgICAsIGFjdHVhbCA9IGdldEFjdHVhbChvYmosIGFyZ3MpXG4gICAgLCBtc2cgPSBuZWdhdGUgPyBhcmdzWzJdIDogYXJnc1sxXVxuICAgICwgZmxhZ01zZyA9IGZsYWcob2JqLCAnbWVzc2FnZScpO1xuXG4gIGlmKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIikgbXNnID0gbXNnKCk7XG4gIG1zZyA9IG1zZyB8fCAnJztcbiAgbXNnID0gbXNnXG4gICAgLnJlcGxhY2UoLyNcXHt0aGlzXFx9L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9iakRpc3BsYXkodmFsKTsgfSlcbiAgICAucmVwbGFjZSgvI1xce2FjdFxcfS9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBvYmpEaXNwbGF5KGFjdHVhbCk7IH0pXG4gICAgLnJlcGxhY2UoLyNcXHtleHBcXH0vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JqRGlzcGxheShleHBlY3RlZCk7IH0pO1xuXG4gIHJldHVybiBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgKyBtc2cgOiBtc2c7XG59O1xuIiwgIi8qIVxuICogQ2hhaSAtIHRyYW5zZmVyRmxhZ3MgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC50cmFuc2ZlckZsYWdzKGFzc2VydGlvbiwgb2JqZWN0LCBpbmNsdWRlQWxsID0gdHJ1ZSlcbiAqXG4gKiBUcmFuc2ZlciBhbGwgdGhlIGZsYWdzIGZvciBgYXNzZXJ0aW9uYCB0byBgb2JqZWN0YC4gSWZcbiAqIGBpbmNsdWRlQWxsYCBpcyBzZXQgdG8gYGZhbHNlYCwgdGhlbiB0aGUgYmFzZSBDaGFpXG4gKiBhc3NlcnRpb24gZmxhZ3MgKG5hbWVseSBgb2JqZWN0YCwgYHNzZmlgLCBgbG9ja1NzZmlgLFxuICogYW5kIGBtZXNzYWdlYCkgd2lsbCBub3QgYmUgdHJhbnNmZXJyZWQuXG4gKlxuICpcbiAqICAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICogICAgIHV0aWxzLnRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBuZXdBc3NlcnRpb24pO1xuICpcbiAqICAgICB2YXIgYW5vdGhlckFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24obXlPYmopO1xuICogICAgIHV0aWxzLnRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBhbm90aGVyQXNzZXJ0aW9uLCBmYWxzZSk7XG4gKlxuICogQHBhcmFtIHtBc3NlcnRpb259IGFzc2VydGlvbiB0aGUgYXNzZXJ0aW9uIHRvIHRyYW5zZmVyIHRoZSBmbGFncyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRoZSBvYmplY3QgdG8gdHJhbnNmZXIgdGhlIGZsYWdzIHRvOyB1c3VhbGx5IGEgbmV3IGFzc2VydGlvblxuICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlQWxsXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSB0cmFuc2ZlckZsYWdzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBvYmplY3QsIGluY2x1ZGVBbGwpIHtcbiAgdmFyIGZsYWdzID0gYXNzZXJ0aW9uLl9fZmxhZ3MgfHwgKGFzc2VydGlvbi5fX2ZsYWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbiAgaWYgKCFvYmplY3QuX19mbGFncykge1xuICAgIG9iamVjdC5fX2ZsYWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIGluY2x1ZGVBbGwgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gaW5jbHVkZUFsbCA6IHRydWU7XG5cbiAgZm9yICh2YXIgZmxhZyBpbiBmbGFncykge1xuICAgIGlmIChpbmNsdWRlQWxsIHx8XG4gICAgICAgIChmbGFnICE9PSAnb2JqZWN0JyAmJiBmbGFnICE9PSAnc3NmaScgJiYgZmxhZyAhPT0gJ2xvY2tTc2ZpJyAmJiBmbGFnICE9ICdtZXNzYWdlJykpIHtcbiAgICAgIG9iamVjdC5fX2ZsYWdzW2ZsYWddID0gZmxhZ3NbZmxhZ107XG4gICAgfVxuICB9XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qIGdsb2JhbHMgU3ltYm9sOiBmYWxzZSwgVWludDhBcnJheTogZmFsc2UsIFdlYWtNYXA6IGZhbHNlICovXG4vKiFcbiAqIGRlZXAtZXFsXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciB0eXBlID0gcmVxdWlyZSgndHlwZS1kZXRlY3QnKTtcbmZ1bmN0aW9uIEZha2VNYXAoKSB7XG4gIHRoaXMuX2tleSA9ICdjaGFpL2RlZXAtZXFsX18nICsgTWF0aC5yYW5kb20oKSArIERhdGUubm93KCk7XG59XG5cbkZha2VNYXAucHJvdG90eXBlID0ge1xuICBnZXQ6IGZ1bmN0aW9uIGdldE1hcChrZXkpIHtcbiAgICByZXR1cm4ga2V5W3RoaXMuX2tleV07XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gc2V0TWFwKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoa2V5LCB0aGlzLl9rZXksIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG59O1xuXG52YXIgTWVtb2l6ZU1hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IEZha2VNYXA7XG4vKiFcbiAqIENoZWNrIHRvIHNlZSBpZiB0aGUgTWVtb2l6ZU1hcCBoYXMgcmVjb3JkZWQgYSByZXN1bHQgb2YgdGhlIHR3byBvcGVyYW5kc1xuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNZW1vaXplTWFwfSBtZW1vaXplTWFwXG4gKiBAcmV0dXJucyB7Qm9vbGVhbnxudWxsfSByZXN1bHRcbiovXG5mdW5jdGlvbiBtZW1vaXplQ29tcGFyZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG1lbW9pemVNYXApIHtcbiAgLy8gVGVjaG5pY2FsbHksIFdlYWtNYXAga2V5cyBjYW4gKm9ubHkqIGJlIG9iamVjdHMsIG5vdCBwcmltaXRpdmVzLlxuICBpZiAoIW1lbW9pemVNYXAgfHwgaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsZWZ0SGFuZE1hcCA9IG1lbW9pemVNYXAuZ2V0KGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZE1hcCkge1xuICAgIHZhciByZXN1bHQgPSBsZWZ0SGFuZE1hcC5nZXQocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qIVxuICogU2V0IHRoZSByZXN1bHQgb2YgdGhlIGVxdWFsaXR5IGludG8gdGhlIE1lbW9pemVNYXBcbiAqXG4gKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWl4ZWR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWVtb2l6ZU1hcH0gbWVtb2l6ZU1hcFxuICogQHBhcmFtIHtCb29sZWFufSByZXN1bHRcbiovXG5mdW5jdGlvbiBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCwgcmVzdWx0KSB7XG4gIC8vIFRlY2huaWNhbGx5LCBXZWFrTWFwIGtleXMgY2FuICpvbmx5KiBiZSBvYmplY3RzLCBub3QgcHJpbWl0aXZlcy5cbiAgaWYgKCFtZW1vaXplTWFwIHx8IGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxlZnRIYW5kTWFwID0gbWVtb2l6ZU1hcC5nZXQobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kTWFwKSB7XG4gICAgbGVmdEhhbmRNYXAuc2V0KHJpZ2h0SGFuZE9wZXJhbmQsIHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgbGVmdEhhbmRNYXAgPSBuZXcgTWVtb2l6ZU1hcCgpO1xuICAgIGxlZnRIYW5kTWFwLnNldChyaWdodEhhbmRPcGVyYW5kLCByZXN1bHQpO1xuICAgIG1lbW9pemVNYXAuc2V0KGxlZnRIYW5kT3BlcmFuZCwgbGVmdEhhbmRNYXApO1xuICB9XG59XG5cbi8qIVxuICogUHJpbWFyeSBFeHBvcnRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZXBFcXVhbDtcbm1vZHVsZS5leHBvcnRzLk1lbW9pemVNYXAgPSBNZW1vaXplTWFwO1xuXG4vKipcbiAqIEFzc2VydCBkZWVwbHkgbmVzdGVkIHNhbWVWYWx1ZSBlcXVhbGl0eSBiZXR3ZWVuIHR3byBvYmplY3RzIG9mIGFueSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAob3B0aW9uYWwpIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMuY29tcGFyYXRvcl0gKG9wdGlvbmFsKSBPdmVycmlkZSBkZWZhdWx0IGFsZ29yaXRobSwgZGV0ZXJtaW5pbmcgY3VzdG9tIGVxdWFsaXR5LlxuICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMubWVtb2l6ZV0gKG9wdGlvbmFsKSBQcm92aWRlIGEgY3VzdG9tIG1lbW9pemF0aW9uIG9iamVjdCB3aGljaCB3aWxsIGNhY2hlIHRoZSByZXN1bHRzIG9mXG4gICAgY29tcGxleCBvYmplY3RzIGZvciBhIHNwZWVkIGJvb3N0LiBCeSBwYXNzaW5nIGBmYWxzZWAgeW91IGNhbiBkaXNhYmxlIG1lbW9pemF0aW9uLCBidXQgdGhpcyB3aWxsIGNhdXNlIGNpcmN1bGFyXG4gICAgcmVmZXJlbmNlcyB0byBibG93IHRoZSBzdGFjay5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGVxdWFsIG1hdGNoXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgLy8gSWYgd2UgaGF2ZSBhIGNvbXBhcmF0b3IsIHdlIGNhbid0IGFzc3VtZSBhbnl0aGluZzsgc28gYmFpbCB0byBpdHMgY2hlY2sgZmlyc3QuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgIHJldHVybiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxuXG4gIHZhciBzaW1wbGVSZXN1bHQgPSBzaW1wbGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpO1xuICBpZiAoc2ltcGxlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHNpbXBsZVJlc3VsdDtcbiAgfVxuXG4gIC8vIERlZXBlciBjb21wYXJpc29ucyBhcmUgcHVzaGVkIHRocm91Z2ggdG8gYSBsYXJnZXIgZnVuY3Rpb25cbiAgcmV0dXJuIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIE1hbnkgY29tcGFyaXNvbnMgY2FuIGJlIGNhbmNlbGVkIG91dCBlYXJseSB2aWEgc2ltcGxlIGVxdWFsaXR5IG9yIHByaW1pdGl2ZSBjaGVja3MuXG4gKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWl4ZWR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEByZXR1cm4ge0Jvb2xlYW58bnVsbH0gZXF1YWwgbWF0Y2hcbiAqL1xuZnVuY3Rpb24gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKSB7XG4gIC8vIEVxdWFsIHJlZmVyZW5jZXMgKGV4Y2VwdCBmb3IgTnVtYmVycykgY2FuIGJlIHJldHVybmVkIGVhcmx5XG4gIGlmIChsZWZ0SGFuZE9wZXJhbmQgPT09IHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgICAvLyBIYW5kbGUgKy0wIGNhc2VzXG4gICAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZCAhPT0gMCB8fCAxIC8gbGVmdEhhbmRPcGVyYW5kID09PSAxIC8gcmlnaHRIYW5kT3BlcmFuZDtcbiAgfVxuXG4gIC8vIGhhbmRsZSBOYU4gY2FzZXNcbiAgaWYgKFxuICAgIGxlZnRIYW5kT3BlcmFuZCAhPT0gbGVmdEhhbmRPcGVyYW5kICYmIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmlnaHRIYW5kT3BlcmFuZCAhPT0gcmlnaHRIYW5kT3BlcmFuZCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEFueXRoaW5nIHRoYXQgaXMgbm90IGFuICdvYmplY3QnLCBpLmUuIHN5bWJvbHMsIGZ1bmN0aW9ucywgYm9vbGVhbnMsIG51bWJlcnMsXG4gIC8vIHN0cmluZ3MsIGFuZCB1bmRlZmluZWQsIGNhbiBiZSBjb21wYXJlZCBieSByZWZlcmVuY2UuXG4gIGlmIChpc1ByaW1pdGl2ZShsZWZ0SGFuZE9wZXJhbmQpIHx8IGlzUHJpbWl0aXZlKHJpZ2h0SGFuZE9wZXJhbmQpKSB7XG4gICAgLy8gRWFzeSBvdXQgYi9jIGl0IHdvdWxkIGhhdmUgcGFzc2VkIHRoZSBmaXJzdCBlcXVhbGl0eSBjaGVja1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyohXG4gKiBUaGUgbWFpbiBsb2dpYyBvZiB0aGUgYGRlZXBFcXVhbGAgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChvcHRpb25hbCkgQWRkaXRpb25hbCBvcHRpb25zXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5jb21wYXJhdG9yXSAob3B0aW9uYWwpIE92ZXJyaWRlIGRlZmF1bHQgYWxnb3JpdGhtLCBkZXRlcm1pbmluZyBjdXN0b20gZXF1YWxpdHkuXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5tZW1vaXplXSAob3B0aW9uYWwpIFByb3ZpZGUgYSBjdXN0b20gbWVtb2l6YXRpb24gb2JqZWN0IHdoaWNoIHdpbGwgY2FjaGUgdGhlIHJlc3VsdHMgb2ZcbiAgICBjb21wbGV4IG9iamVjdHMgZm9yIGEgc3BlZWQgYm9vc3QuIEJ5IHBhc3NpbmcgYGZhbHNlYCB5b3UgY2FuIGRpc2FibGUgbWVtb2l6YXRpb24sIGJ1dCB0aGlzIHdpbGwgY2F1c2UgY2lyY3VsYXJcbiAgICByZWZlcmVuY2VzIHRvIGJsb3cgdGhlIHN0YWNrLlxuICogQHJldHVybiB7Qm9vbGVhbn0gZXF1YWwgbWF0Y2hcbiovXG5mdW5jdGlvbiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLm1lbW9pemUgPSBvcHRpb25zLm1lbW9pemUgPT09IGZhbHNlID8gZmFsc2UgOiBvcHRpb25zLm1lbW9pemUgfHwgbmV3IE1lbW9pemVNYXAoKTtcbiAgdmFyIGNvbXBhcmF0b3IgPSBvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcjtcblxuICAvLyBDaGVjayBpZiBhIG1lbW9pemVkIHJlc3VsdCBleGlzdHMuXG4gIHZhciBtZW1vaXplUmVzdWx0TGVmdCA9IG1lbW9pemVDb21wYXJlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplKTtcbiAgaWYgKG1lbW9pemVSZXN1bHRMZWZ0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIG1lbW9pemVSZXN1bHRMZWZ0O1xuICB9XG4gIHZhciBtZW1vaXplUmVzdWx0UmlnaHQgPSBtZW1vaXplQ29tcGFyZShyaWdodEhhbmRPcGVyYW5kLCBsZWZ0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSk7XG4gIGlmIChtZW1vaXplUmVzdWx0UmlnaHQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVtb2l6ZVJlc3VsdFJpZ2h0O1xuICB9XG5cbiAgLy8gSWYgYSBjb21wYXJhdG9yIGlzIHByZXNlbnQsIHVzZSBpdC5cbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgY29tcGFyYXRvclJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICAvLyBDb21wYXJhdG9ycyBtYXkgcmV0dXJuIG51bGwsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBnbyBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgaWYgKGNvbXBhcmF0b3JSZXN1bHQgPT09IGZhbHNlIHx8IGNvbXBhcmF0b3JSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIGNvbXBhcmF0b3JSZXN1bHQpO1xuICAgICAgcmV0dXJuIGNvbXBhcmF0b3JSZXN1bHQ7XG4gICAgfVxuICAgIC8vIFRvIGFsbG93IGNvbXBhcmF0b3JzIHRvIG92ZXJyaWRlICphbnkqIGJlaGF2aW9yLCB3ZSByYW4gdGhlbSBmaXJzdC4gU2luY2UgaXQgZGlkbid0IGRlY2lkZVxuICAgIC8vIHdoYXQgdG8gZG8sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRvIHJldHVybiB0aGUgYmFzaWMgdGVzdHMgZmlyc3QgYmVmb3JlIHdlIG1vdmUgb24uXG4gICAgdmFyIHNpbXBsZVJlc3VsdCA9IHNpbXBsZUVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHNpbXBsZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgLy8gRG9uJ3QgbWVtb2l6ZSB0aGlzLCBpdCB0YWtlcyBsb25nZXIgdG8gc2V0L3JldHJpZXZlIHRoYW4gdG8ganVzdCBjb21wYXJlLlxuICAgICAgcmV0dXJuIHNpbXBsZVJlc3VsdDtcbiAgICB9XG4gIH1cblxuICB2YXIgbGVmdEhhbmRUeXBlID0gdHlwZShsZWZ0SGFuZE9wZXJhbmQpO1xuICBpZiAobGVmdEhhbmRUeXBlICE9PSB0eXBlKHJpZ2h0SGFuZE9wZXJhbmQpKSB7XG4gICAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgZmFsc2UpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlbXBvcmFyaWx5IHNldCB0aGUgb3BlcmFuZHMgaW4gdGhlIG1lbW9pemUgb2JqZWN0IHRvIHByZXZlbnQgYmxvd2luZyB0aGUgc3RhY2tcbiAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgdHJ1ZSk7XG5cbiAgdmFyIHJlc3VsdCA9IGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kVHlwZSwgb3B0aW9ucyk7XG4gIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kVHlwZSwgb3B0aW9ucykge1xuICBzd2l0Y2ggKGxlZnRIYW5kVHlwZSkge1xuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIC8vIElmIHRoZXNlIHR5cGVzIGFyZSB0aGVpciBpbnN0YW5jZSB0eXBlcyAoZS5nLiBgbmV3IE51bWJlcmApIHRoZW4gcmUtZGVlcEVxdWFsIGFnYWluc3QgdGhlaXIgdmFsdWVzXG4gICAgICByZXR1cm4gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZC52YWx1ZU9mKCksIHJpZ2h0SGFuZE9wZXJhbmQudmFsdWVPZigpKTtcbiAgICBjYXNlICdQcm9taXNlJzpcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICBjYXNlICdXZWFrTWFwJzpcbiAgICBjYXNlICdXZWFrU2V0JzpcbiAgICBjYXNlICdFcnJvcic6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kID09PSByaWdodEhhbmRPcGVyYW5kO1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgcmV0dXJuIHJlZ2V4cEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgY2FzZSAnR2VuZXJhdG9yJzpcbiAgICAgIHJldHVybiBnZW5lcmF0b3JFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICAgIGNhc2UgJ0RhdGFWaWV3JzpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZC5idWZmZXIpLCBuZXcgVWludDhBcnJheShyaWdodEhhbmRPcGVyYW5kLmJ1ZmZlciksIG9wdGlvbnMpO1xuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZCksIG5ldyBVaW50OEFycmF5KHJpZ2h0SGFuZE9wZXJhbmQpLCBvcHRpb25zKTtcbiAgICBjYXNlICdTZXQnOlxuICAgICAgcmV0dXJuIGVudHJpZXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvYmplY3RFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qIVxuICogQ29tcGFyZSB0d28gUmVndWxhciBFeHByZXNzaW9ucyBmb3IgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIHtSZWdFeHB9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtSZWdFeHB9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5cbmZ1bmN0aW9uIHJlZ2V4cEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCkge1xuICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kLnRvU3RyaW5nKCkgPT09IHJpZ2h0SGFuZE9wZXJhbmQudG9TdHJpbmcoKTtcbn1cblxuLyohXG4gKiBDb21wYXJlIHR3byBTZXRzL01hcHMgZm9yIGVxdWFsaXR5LiBGYXN0ZXIgdGhhbiBvdGhlciBlcXVhbGl0eSBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtTZXR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtTZXR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKE9wdGlvbmFsKVxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cblxuZnVuY3Rpb24gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBTZXQjZW50cmllcyBvciBTZXQjQEBpdGVyYXRvciwgc28gd2UgbmVlZCBtYW51YWxseSBwb3B1bGF0ZSB1c2luZyBTZXQjZm9yRWFjaFxuICBpZiAobGVmdEhhbmRPcGVyYW5kLnNpemUgIT09IHJpZ2h0SGFuZE9wZXJhbmQuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGVmdEhhbmRPcGVyYW5kLnNpemUgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgbGVmdEhhbmRJdGVtcyA9IFtdO1xuICB2YXIgcmlnaHRIYW5kSXRlbXMgPSBbXTtcbiAgbGVmdEhhbmRPcGVyYW5kLmZvckVhY2goZnVuY3Rpb24gZ2F0aGVyRW50cmllcyhrZXksIHZhbHVlKSB7XG4gICAgbGVmdEhhbmRJdGVtcy5wdXNoKFsga2V5LCB2YWx1ZSBdKTtcbiAgfSk7XG4gIHJpZ2h0SGFuZE9wZXJhbmQuZm9yRWFjaChmdW5jdGlvbiBnYXRoZXJFbnRyaWVzKGtleSwgdmFsdWUpIHtcbiAgICByaWdodEhhbmRJdGVtcy5wdXNoKFsga2V5LCB2YWx1ZSBdKTtcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kSXRlbXMuc29ydCgpLCByaWdodEhhbmRJdGVtcy5zb3J0KCksIG9wdGlvbnMpO1xufVxuXG4vKiFcbiAqIFNpbXBsZSBlcXVhbGl0eSBmb3IgZmxhdCBpdGVyYWJsZSBvYmplY3RzIHN1Y2ggYXMgQXJyYXlzLCBUeXBlZEFycmF5cyBvciBOb2RlLmpzIGJ1ZmZlcnMuXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZX0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChPcHRpb25hbClcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5cbmZ1bmN0aW9uIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGggPSBsZWZ0SGFuZE9wZXJhbmQubGVuZ3RoO1xuICBpZiAobGVuZ3RoICE9PSByaWdodEhhbmRPcGVyYW5kLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGluZGV4ID0gLTE7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGRlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmRbaW5kZXhdLCByaWdodEhhbmRPcGVyYW5kW2luZGV4XSwgb3B0aW9ucykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiFcbiAqIFNpbXBsZSBlcXVhbGl0eSBmb3IgZ2VuZXJhdG9yIG9iamVjdHMgc3VjaCBhcyB0aG9zZSByZXR1cm5lZCBieSBnZW5lcmF0b3IgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtJdGVyYWJsZX0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAqL1xuXG5mdW5jdGlvbiBnZW5lcmF0b3JFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwoZ2V0R2VuZXJhdG9yRW50cmllcyhsZWZ0SGFuZE9wZXJhbmQpLCBnZXRHZW5lcmF0b3JFbnRyaWVzKHJpZ2h0SGFuZE9wZXJhbmQpLCBvcHRpb25zKTtcbn1cblxuLyohXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgYW4gQEBpdGVyYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBoYXMgYW4gQEBpdGVyYXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gaGFzSXRlcmF0b3JGdW5jdGlvbih0YXJnZXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiB0YXJnZXRbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyohXG4gKiBHZXRzIGFsbCBpdGVyYXRvciBlbnRyaWVzIGZyb20gdGhlIGdpdmVuIE9iamVjdC4gSWYgdGhlIE9iamVjdCBoYXMgbm8gQEBpdGVyYXRvciBmdW5jdGlvbiwgcmV0dXJucyBhbiBlbXB0eSBhcnJheS5cbiAqIFRoaXMgd2lsbCBjb25zdW1lIHRoZSBpdGVyYXRvciAtIHdoaWNoIGNvdWxkIGhhdmUgc2lkZSBlZmZlY3RzIGRlcGVuZGluZyBvbiB0aGUgQEBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIGVudHJpZXMgZnJvbSB0aGUgQEBpdGVyYXRvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBnZXRJdGVyYXRvckVudHJpZXModGFyZ2V0KSB7XG4gIGlmIChoYXNJdGVyYXRvckZ1bmN0aW9uKHRhcmdldCkpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGdldEdlbmVyYXRvckVudHJpZXModGFyZ2V0W1N5bWJvbC5pdGVyYXRvcl0oKSk7XG4gICAgfSBjYXRjaCAoaXRlcmF0b3JFcnJvcikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qIVxuICogR2V0cyBhbGwgZW50cmllcyBmcm9tIGEgR2VuZXJhdG9yLiBUaGlzIHdpbGwgY29uc3VtZSB0aGUgZ2VuZXJhdG9yIC0gd2hpY2ggY291bGQgaGF2ZSBzaWRlIGVmZmVjdHMuXG4gKlxuICogQHBhcmFtIHtHZW5lcmF0b3J9IHRhcmdldFxuICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBlbnRyaWVzIGZyb20gdGhlIEdlbmVyYXRvci5cbiAqL1xuZnVuY3Rpb24gZ2V0R2VuZXJhdG9yRW50cmllcyhnZW5lcmF0b3IpIHtcbiAgdmFyIGdlbmVyYXRvclJlc3VsdCA9IGdlbmVyYXRvci5uZXh0KCk7XG4gIHZhciBhY2N1bXVsYXRvciA9IFsgZ2VuZXJhdG9yUmVzdWx0LnZhbHVlIF07XG4gIHdoaWxlIChnZW5lcmF0b3JSZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBnZW5lcmF0b3JSZXN1bHQgPSBnZW5lcmF0b3IubmV4dCgpO1xuICAgIGFjY3VtdWxhdG9yLnB1c2goZ2VuZXJhdG9yUmVzdWx0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbi8qIVxuICogR2V0cyBhbGwgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBrZXlzIGZyb20gYSB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIGtleXMgZnJvbSB0aGUgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlS2V5cyh0YXJnZXQpIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIHRhcmdldCkge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuXG4vKiFcbiAqIERldGVybWluZXMgaWYgdHdvIG9iamVjdHMgaGF2ZSBtYXRjaGluZyB2YWx1ZXMsIGdpdmVuIGEgc2V0IG9mIGtleXMuIERlZmVycyB0byBkZWVwRXF1YWwgZm9yIHRoZSBlcXVhbGl0eSBjaGVjayBvZlxuICogZWFjaCBrZXkuIElmIGFueSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBlcXVhbCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChlYXJseSkuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge0FycmF5fSBrZXlzIEFuIGFycmF5IG9mIGtleXMgdG8gY29tcGFyZSB0aGUgdmFsdWVzIG9mIGxlZnRIYW5kT3BlcmFuZCBhbmQgcmlnaHRIYW5kT3BlcmFuZCBhZ2FpbnN0XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChPcHRpb25hbClcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5mdW5jdGlvbiBrZXlzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBrZXlzLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtrZXlzW2ldXSwgcmlnaHRIYW5kT3BlcmFuZFtrZXlzW2ldXSwgb3B0aW9ucykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiFcbiAqIFJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBlcXVhbGl0eSBvZiB0d28gT2JqZWN0cy4gT25jZSBiYXNpYyBzYW1lbmVzcyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBpdCB3aWxsIGRlZmVyIHRvIGBkZWVwRXF1YWxgXG4gKiBmb3IgZWFjaCBlbnVtZXJhYmxlIGtleSBpbiB0aGUgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAqL1xuXG5mdW5jdGlvbiBvYmplY3RFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlZnRIYW5kS2V5cyA9IGdldEVudW1lcmFibGVLZXlzKGxlZnRIYW5kT3BlcmFuZCk7XG4gIHZhciByaWdodEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZEtleXMubGVuZ3RoICYmIGxlZnRIYW5kS2V5cy5sZW5ndGggPT09IHJpZ2h0SGFuZEtleXMubGVuZ3RoKSB7XG4gICAgbGVmdEhhbmRLZXlzLnNvcnQoKTtcbiAgICByaWdodEhhbmRLZXlzLnNvcnQoKTtcbiAgICBpZiAoaXRlcmFibGVFcXVhbChsZWZ0SGFuZEtleXMsIHJpZ2h0SGFuZEtleXMpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4ga2V5c0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRLZXlzLCBvcHRpb25zKTtcbiAgfVxuXG4gIHZhciBsZWZ0SGFuZEVudHJpZXMgPSBnZXRJdGVyYXRvckVudHJpZXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEVudHJpZXMgPSBnZXRJdGVyYXRvckVudHJpZXMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZEVudHJpZXMubGVuZ3RoICYmIGxlZnRIYW5kRW50cmllcy5sZW5ndGggPT09IHJpZ2h0SGFuZEVudHJpZXMubGVuZ3RoKSB7XG4gICAgbGVmdEhhbmRFbnRyaWVzLnNvcnQoKTtcbiAgICByaWdodEhhbmRFbnRyaWVzLnNvcnQoKTtcbiAgICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZEVudHJpZXMsIHJpZ2h0SGFuZEVudHJpZXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiZcbiAgICAgIGxlZnRIYW5kRW50cmllcy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHJpZ2h0SGFuZEtleXMubGVuZ3RoID09PSAwICYmXG4gICAgICByaWdodEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiFcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBwcmltaXRpdmUuXG4gKlxuICogVGhpcyBpbnRlbnRpb25hbGx5IHJldHVybnMgdHJ1ZSBmb3IgYWxsIG9iamVjdHMgdGhhdCBjYW4gYmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlLFxuICogaW5jbHVkaW5nIGZ1bmN0aW9ucyBhbmQgc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnO1xufVxuIiwgInZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxuLyohXG4gKiBDaGFpIC0gaXNQcm94eUVuYWJsZWQgaGVscGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmlzUHJveHlFbmFibGVkKClcbiAqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgQ2hhaSdzIHByb3h5IHByb3RlY3Rpb24gZmVhdHVyZSBpcyBlbmFibGVkLiBJZlxuICogcHJveGllcyBhcmUgdW5zdXBwb3J0ZWQgb3IgZGlzYWJsZWQgdmlhIHRoZSB1c2VyJ3MgQ2hhaSBjb25maWcsIHRoZW4gcmV0dXJuXG4gKiBmYWxzZS4gT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZS5cbiAqXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBpc1Byb3h5RW5hYmxlZFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNQcm94eUVuYWJsZWQoKSB7XG4gIHJldHVybiBjb25maWcudXNlUHJveHkgJiZcbiAgICB0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnO1xufTtcbiIsICIvKiFcbiAqIENoYWkgLSBhZGRQcm9wZXJ0eSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIGNoYWkgPSByZXF1aXJlKCcuLi8uLi9jaGFpJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIGlzUHJveHlFbmFibGVkID0gcmVxdWlyZSgnLi9pc1Byb3h5RW5hYmxlZCcpO1xudmFyIHRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyoqXG4gKiAjIyMgLmFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKVxuICpcbiAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC5cbiAqXG4gKiAgICAgdXRpbHMuYWRkUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZm9vJywgZnVuY3Rpb24gKCkge1xuICogICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iaikudG8uYmUuaW5zdGFuY2VvZihGb28pO1xuICogICAgIH0pO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24uYWRkUHJvcGVydHkoJ2ZvbycsIGZuKTtcbiAqXG4gKiBUaGVuIGNhbiBiZSB1c2VkIGFzIGFueSBvdGhlciBhc3NlcnRpb24uXG4gKlxuICogICAgIGV4cGVjdChteUZvbykudG8uYmUuZm9vO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhZGRlZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgcHJvcGVydHkgdG8gYWRkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkUHJvcGVydHlcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICBnZXR0ZXIgPSBnZXR0ZXIgPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uICgpIHt9IDogZ2V0dGVyO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uIHByb3BlcnR5R2V0dGVyKCkge1xuICAgICAgICAvLyBTZXR0aW5nIHRoZSBgc3NmaWAgZmxhZyB0byBgcHJvcGVydHlHZXR0ZXJgIGNhdXNlcyB0aGlzIGZ1bmN0aW9uIHRvXG4gICAgICAgIC8vIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb20gdGhlXG4gICAgICAgIC8vIHN0YWNrIHRyYWNlIG9mIGEgZmFpbGVkIGFzc2VydGlvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZlxuICAgICAgICAvLyB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzbid0IHNldCBhbmQgcHJveHkgcHJvdGVjdGlvbiBpcyBkaXNhYmxlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgICAgIC8vIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXIgYXNzZXJ0aW9uLCBvciB0aGlzIGFzc2VydGlvbiBpcyBiZWluZyBpbnZva2VkXG4gICAgICAgIC8vIGZyb20gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGBzc2ZpYCBmbGFnXG4gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmRcbiAgICAgICAgLy8gY2FzZSwgdGhlIGBzc2ZpYCBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdXRlciBhc3NlcnRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHByb3h5IHByb3RlY3Rpb24gaXMgZW5hYmxlZCwgdGhlbiB0aGUgYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlblxuICAgICAgICAvLyBzZXQgYnkgdGhlIHByb3h5IGdldHRlci5cbiAgICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsICdsb2NrU3NmaScpKSB7XG4gICAgICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIHByb3BlcnR5R2V0dGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHQgPSBnZXR0ZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9XG4gICAgLCBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59O1xuIiwgInZhciBmbkxlbmd0aERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHt9LCAnbGVuZ3RoJyk7XG5cbi8qIVxuICogQ2hhaSAtIGFkZExlbmd0aEd1YXJkIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuYWRkTGVuZ3RoR3VhcmQoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKVxuICpcbiAqIERlZmluZSBgbGVuZ3RoYCBhcyBhIGdldHRlciBvbiB0aGUgZ2l2ZW4gdW5pbnZva2VkIG1ldGhvZCBhc3NlcnRpb24uIFRoZVxuICogZ2V0dGVyIGFjdHMgYXMgYSBndWFyZCBhZ2FpbnN0IGNoYWluaW5nIGBsZW5ndGhgIGRpcmVjdGx5IG9mZiBvZiBhbiB1bmludm9rZWRcbiAqIG1ldGhvZCBhc3NlcnRpb24sIHdoaWNoIGlzIGEgcHJvYmxlbSBiZWNhdXNlIGl0IHJlZmVyZW5jZXMgYGZ1bmN0aW9uYCdzXG4gKiBidWlsdC1pbiBgbGVuZ3RoYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIENoYWkncyBgbGVuZ3RoYCBhc3NlcnRpb24uIFdoZW4gdGhlXG4gKiBnZXR0ZXIgY2F0Y2hlcyB0aGUgdXNlciBtYWtpbmcgdGhpcyBtaXN0YWtlLCBpdCB0aHJvd3MgYW4gZXJyb3Igd2l0aCBhXG4gKiBoZWxwZnVsIG1lc3NhZ2UuXG4gKlxuICogVGhlcmUgYXJlIHR3byB3YXlzIGluIHdoaWNoIHRoaXMgbWlzdGFrZSBjYW4gYmUgbWFkZS4gVGhlIGZpcnN0IHdheSBpcyBieVxuICogY2hhaW5pbmcgdGhlIGBsZW5ndGhgIGFzc2VydGlvbiBkaXJlY3RseSBvZmYgb2YgYW4gdW5pbnZva2VkIGNoYWluYWJsZVxuICogbWV0aG9kLiBJbiB0aGlzIGNhc2UsIENoYWkgc3VnZ2VzdHMgdGhhdCB0aGUgdXNlciB1c2UgYGxlbmd0aE9mYCBpbnN0ZWFkLiBUaGVcbiAqIHNlY29uZCB3YXkgaXMgYnkgY2hhaW5pbmcgdGhlIGBsZW5ndGhgIGFzc2VydGlvbiBkaXJlY3RseSBvZmYgb2YgYW4gdW5pbnZva2VkXG4gKiBub24tY2hhaW5hYmxlIG1ldGhvZC4gTm9uLWNoYWluYWJsZSBtZXRob2RzIG11c3QgYmUgaW52b2tlZCBwcmlvciB0b1xuICogY2hhaW5pbmcuIEluIHRoaXMgY2FzZSwgQ2hhaSBzdWdnZXN0cyB0aGF0IHRoZSB1c2VyIGNvbnN1bHQgdGhlIGRvY3MgZm9yIHRoZVxuICogZ2l2ZW4gYXNzZXJ0aW9uLlxuICpcbiAqIElmIHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eSBvZiBmdW5jdGlvbnMgaXMgdW5jb25maWd1cmFibGUsIHRoZW4gcmV0dXJuIGBmbmBcbiAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCBpbiBFUzYsIHRoZSBmdW5jdGlvbidzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGNvbmZpZ3VyYWJsZSwgc28gb25jZVxuICogc3VwcG9ydCBmb3IgbGVnYWN5IGVudmlyb25tZW50cyBpcyBkcm9wcGVkLCBDaGFpJ3MgYGxlbmd0aGAgcHJvcGVydHkgY2FuXG4gKiByZXBsYWNlIHRoZSBidWlsdC1pbiBmdW5jdGlvbidzIGBsZW5ndGhgIHByb3BlcnR5LCBhbmQgdGhpcyBsZW5ndGggZ3VhcmQgd2lsbFxuICogbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeS4gSW4gdGhlIG1lYW4gdGltZSwgbWFpbnRhaW5pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbFxuICogZW52aXJvbm1lbnRzIGlzIHRoZSBwcmlvcml0eS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtTdHJpbmd9IGFzc2VydGlvbk5hbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNDaGFpbmFibGVcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGFkZExlbmd0aEd1YXJkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRMZW5ndGhHdWFyZCAoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKSB7XG4gIGlmICghZm5MZW5ndGhEZXNjLmNvbmZpZ3VyYWJsZSkgcmV0dXJuIGZuO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2xlbmd0aCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpc0NoYWluYWJsZSkge1xuICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBDaGFpIHByb3BlcnR5OiAnICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBEdWUnICtcbiAgICAgICAgICAnIHRvIGEgY29tcGF0aWJpbGl0eSBpc3N1ZSwgXCJsZW5ndGhcIiBjYW5ub3QgZGlyZWN0bHkgZm9sbG93IFwiJyArXG4gICAgICAgICAgYXNzZXJ0aW9uTmFtZSArICdcIi4gVXNlIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aE9mXCIgaW5zdGVhZC4nKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgQ2hhaSBwcm9wZXJ0eTogJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aC4gU2VlJyArXG4gICAgICAgICcgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnXCIuJyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZm47XG59O1xuIiwgIi8qIVxuICogQ2hhaSAtIGdldFByb3BlcnRpZXMgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5nZXRQcm9wZXJ0aWVzKG9iamVjdClcbiAqXG4gKiBUaGlzIGFsbG93cyB0aGUgcmV0cmlldmFsIG9mIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdCwgZW51bWVyYWJsZSBvciBub3QsXG4gKiBpbmhlcml0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldFByb3BlcnRpZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcblxuICBmdW5jdGlvbiBhZGRQcm9wZXJ0eShwcm9wZXJ0eSkge1xuICAgIGlmIChyZXN1bHQuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xKSB7XG4gICAgICByZXN1bHQucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGFkZFByb3BlcnR5KTtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICJ2YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIGdldFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2dldFByb3BlcnRpZXMnKTtcbnZhciBpc1Byb3h5RW5hYmxlZCA9IHJlcXVpcmUoJy4vaXNQcm94eUVuYWJsZWQnKTtcblxuLyohXG4gKiBDaGFpIC0gcHJveGlmeSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLnByb3hpZnkob2JqZWN0KVxuICpcbiAqIFJldHVybiBhIHByb3h5IG9mIGdpdmVuIG9iamVjdCB0aGF0IHRocm93cyBhbiBlcnJvciB3aGVuIGEgbm9uLWV4aXN0ZW50XG4gKiBwcm9wZXJ0eSBpcyByZWFkLiBCeSBkZWZhdWx0LCB0aGUgcm9vdCBjYXVzZSBpcyBhc3N1bWVkIHRvIGJlIGEgbWlzc3BlbGxlZFxuICogcHJvcGVydHksIGFuZCB0aHVzIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBvZmZlciBhIHJlYXNvbmFibGUgc3VnZ2VzdGlvbiBmcm9tXG4gKiB0aGUgbGlzdCBvZiBleGlzdGluZyBwcm9wZXJ0aWVzLiBIb3dldmVyLCBpZiBhIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUgaXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSByb290IGNhdXNlIGlzIGluc3RlYWQgYSBmYWlsdXJlIHRvIGludm9rZSBhIG5vbi1jaGFpbmFibGVcbiAqIG1ldGhvZCBwcmlvciB0byByZWFkaW5nIHRoZSBub24tZXhpc3RlbnQgcHJvcGVydHkuXG4gKlxuICogSWYgcHJveGllcyBhcmUgdW5zdXBwb3J0ZWQgb3IgZGlzYWJsZWQgdmlhIHRoZSB1c2VyJ3MgQ2hhaSBjb25maWcsIHRoZW5cbiAqIHJldHVybiBvYmplY3Qgd2l0aG91dCBtb2RpZmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IG5vbkNoYWluYWJsZU1ldGhvZE5hbWVcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIHByb3hpZnlcbiAqL1xuXG52YXIgYnVpbHRpbnMgPSBbJ19fZmxhZ3MnLCAnX19tZXRob2RzJywgJ19vYmonLCAnYXNzZXJ0J107XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHJveGlmeShvYmosIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUpIHtcbiAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpKSByZXR1cm4gb2JqO1xuXG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBwcm94eUdldHRlcih0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIGlzIGhlcmUgYmVjYXVzZSB3ZSBzaG91bGQgbm90IHRocm93IGVycm9ycyBvbiBTeW1ib2wgcHJvcGVydGllc1xuICAgICAgLy8gc3VjaCBhcyBgU3ltYm9sLnRvU3RyaW5nVGFnYC5cbiAgICAgIC8vIFRoZSB2YWx1ZXMgZm9yIHdoaWNoIGFuIGVycm9yIHNob3VsZCBiZSB0aHJvd24gY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmdcbiAgICAgIC8vIHRoZSBgY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzYCBzZXR0aW5nLlxuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmXG4gICAgICAgICAgIVJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHkpKSB7XG4gICAgICAgIC8vIFNwZWNpYWwgbWVzc2FnZSBmb3IgaW52YWxpZCBwcm9wZXJ0eSBhY2Nlc3Mgb2Ygbm9uLWNoYWluYWJsZSBtZXRob2RzLlxuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIENoYWkgcHJvcGVydHk6ICcgKyBub25DaGFpbmFibGVNZXRob2ROYW1lICsgJy4nICtcbiAgICAgICAgICAgIHByb3BlcnR5ICsgJy4gU2VlIGRvY3MgZm9yIHByb3BlciB1c2FnZSBvZiBcIicgK1xuICAgICAgICAgICAgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSArICdcIi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyByZWFzb25hYmx5IGNsb3NlIHRvIGFuIGV4aXN0aW5nIENoYWkgcHJvcGVydHksXG4gICAgICAgIC8vIHN1Z2dlc3QgdGhhdCBwcm9wZXJ0eSB0byB0aGUgdXNlci4gT25seSBzdWdnZXN0IHByb3BlcnRpZXMgd2l0aCBhXG4gICAgICAgIC8vIGRpc3RhbmNlIGxlc3MgdGhhbiA0LlxuICAgICAgICB2YXIgc3VnZ2VzdGlvbiA9IG51bGw7XG4gICAgICAgIHZhciBzdWdnZXN0aW9uRGlzdGFuY2UgPSA0O1xuICAgICAgICBnZXRQcm9wZXJ0aWVzKHRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocHJvcCkgJiZcbiAgICAgICAgICAgIGJ1aWx0aW5zLmluZGV4T2YocHJvcCkgPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2YXIgZGlzdCA9IHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKFxuICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbkRpc3RhbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGRpc3QgPCBzdWdnZXN0aW9uRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IHByb3A7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25EaXN0YW5jZSA9IGRpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc3VnZ2VzdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIENoYWkgcHJvcGVydHk6ICcgKyBwcm9wZXJ0eSArXG4gICAgICAgICAgICAnLiBEaWQgeW91IG1lYW4gXCInICsgc3VnZ2VzdGlvbiArICdcIj8nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBDaGFpIHByb3BlcnR5OiAnICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB0aGlzIHByb3h5IGdldHRlciBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLiBGb3IgcHJvcGVydHlcbiAgICAgIC8vIGFzc2VydGlvbnMsIHRoaXMgcHJldmVudHMgdGhlIHByb3h5IGdldHRlciBmcm9tIHNob3dpbmcgdXAgaW4gdGhlIHN0YWNrXG4gICAgICAvLyB0cmFjZSBzaW5jZSBpdCdzIGludm9rZWQgYmVmb3JlIHRoZSBwcm9wZXJ0eSBnZXR0ZXIuIEZvciBtZXRob2QgYW5kXG4gICAgICAvLyBjaGFpbmFibGUgbWV0aG9kIGFzc2VydGlvbnMsIHRoaXMgZmxhZyB3aWxsIGVuZCB1cCBnZXR0aW5nIGNoYW5nZWQgdG9cbiAgICAgIC8vIHRoZSBtZXRob2Qgd3JhcHBlciwgd2hpY2ggaXMgZ29vZCBzaW5jZSB0aGlzIGZyYW1lIHdpbGwgbm8gbG9uZ2VyIGJlIGluXG4gICAgICAvLyB0aGUgc3RhY2sgb25jZSB0aGUgbWV0aG9kIGlzIGludm9rZWQuIE5vdGUgdGhhdCBDaGFpIGJ1aWx0aW4gYXNzZXJ0aW9uXG4gICAgICAvLyBwcm9wZXJ0aWVzIHN1Y2ggYXMgYF9fZmxhZ3NgIGFyZSBza2lwcGVkIHNpbmNlIHRoaXMgaXMgb25seSBtZWFudCB0b1xuICAgICAgLy8gY2FwdHVyZSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgYW4gYXNzZXJ0aW9uLiBUaGlzIHN0ZXAgaXMgYWxzbyBza2lwcGVkXG4gICAgICAvLyBpZiB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzIHNldCwgdGh1cyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBhc3NlcnRpb24gaXNcbiAgICAgIC8vIGJlaW5nIGNhbGxlZCBmcm9tIHdpdGhpbiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhhdCBjYXNlLCB0aGUgYHNzZmlgXG4gICAgICAvLyBmbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBvdXRlciBhc3NlcnRpb24ncyBzdGFydGluZyBwb2ludC5cbiAgICAgIGlmIChidWlsdGlucy5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTEgJiYgIWZsYWcodGFyZ2V0LCAnbG9ja1NzZmknKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgJ3NzZmknLCBwcm94eUdldHRlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiAjIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcClcbiAqIFJldHVybiB0aGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gc3RyaW5ncywgYnV0IG5vIG1vcmUgdGhhbiBjYXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyQVxuICogQHBhcmFtIHtzdHJpbmd9IHN0ckJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJcbiAqIEByZXR1cm4ge251bWJlcn0gbWluKHN0cmluZyBkaXN0YW5jZSBiZXR3ZWVuIHN0ckEgYW5kIHN0ckIsIGNhcClcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcCkge1xuICBpZiAoTWF0aC5hYnMoc3RyQS5sZW5ndGggLSBzdHJCLmxlbmd0aCkgPj0gY2FwKSB7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIHZhciBtZW1vID0gW107XG4gIC8vIGBtZW1vYCBpcyBhIHR3by1kaW1lbnNpb25hbCBhcnJheSBjb250YWluaW5nIGRpc3RhbmNlcy5cbiAgLy8gbWVtb1tpXVtqXSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBzdHJBLnNsaWNlKDAsIGkpIGFuZFxuICAvLyBzdHJCLnNsaWNlKDAsIGopLlxuICBmb3IgKHZhciBpID0gMDsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbWVtb1tpXSA9IEFycmF5KHN0ckIubGVuZ3RoICsgMSkuZmlsbCgwKTtcbiAgICBtZW1vW2ldWzBdID0gaTtcbiAgfVxuICBmb3IgKHZhciBqID0gMDsgaiA8IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICBtZW1vWzBdW2pdID0gajtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0ckEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2ggPSBzdHJBLmNoYXJDb2RlQXQoaSAtIDEpO1xuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChNYXRoLmFicyhpIC0gaikgPj0gY2FwKSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBjYXA7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbWVtb1tpXVtqXSA9IE1hdGgubWluKFxuICAgICAgICBtZW1vW2kgLSAxXVtqXSArIDEsXG4gICAgICAgIG1lbW9baV1baiAtIDFdICsgMSxcbiAgICAgICAgbWVtb1tpIC0gMV1baiAtIDFdICtcbiAgICAgICAgICAoY2ggPT09IHN0ckIuY2hhckNvZGVBdChqIC0gMSkgPyAwIDogMSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbiIsICIvKiFcbiAqIENoYWkgLSBhZGRNZXRob2QgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBhZGRMZW5ndGhHdWFyZCA9IHJlcXVpcmUoJy4vYWRkTGVuZ3RoR3VhcmQnKTtcbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBwcm94aWZ5ID0gcmVxdWlyZSgnLi9wcm94aWZ5Jyk7XG52YXIgdHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKipcbiAqICMjIyAuYWRkTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKVxuICpcbiAqIEFkZHMgYSBtZXRob2QgdG8gdGhlIHByb3RvdHlwZSBvZiBhbiBvYmplY3QuXG4gKlxuICogICAgIHV0aWxzLmFkZE1ldGhvZChjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUsICdmb28nLCBmdW5jdGlvbiAoc3RyKSB7XG4gKiAgICAgICB2YXIgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gKiAgICAgICBuZXcgY2hhaS5Bc3NlcnRpb24ob2JqKS50by5iZS5lcXVhbChzdHIpO1xuICogICAgIH0pO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdmb28nLCBmbik7XG4gKlxuICogVGhlbiBjYW4gYmUgdXNlZCBhcyBhbnkgb3RoZXIgYXNzZXJ0aW9uLlxuICpcbiAqICAgICBleHBlY3QoZm9vU3RyKS50by5iZS5mb28oJ2JhcicpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHRvIHdoaWNoIHRoZSBtZXRob2QgaXMgYWRkZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIG1ldGhvZCB0byBhZGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBuYW1lXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBhZGRNZXRob2RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgdmFyIG1ldGhvZFdyYXBwZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gU2V0dGluZyB0aGUgYHNzZmlgIGZsYWcgdG8gYG1ldGhvZFdyYXBwZXJgIGNhdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHRoZVxuICAgIC8vIHN0YXJ0aW5nIHBvaW50IGZvciByZW1vdmluZyBpbXBsZW1lbnRhdGlvbiBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2ZcbiAgICAvLyBhIGZhaWxlZCBhc3NlcnRpb24uXG4gICAgLy9cbiAgICAvLyBIb3dldmVyLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGlmIHRoZVxuICAgIC8vIGBsb2NrU3NmaWAgZmxhZyBpc24ndCBzZXQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzIHNldCwgdGhlbiBlaXRoZXIgdGhpcyBhc3NlcnRpb24gaGFzIGJlZW5cbiAgICAvLyBvdmVyd3JpdHRlbiBieSBhbm90aGVyIGFzc2VydGlvbiwgb3IgdGhpcyBhc3NlcnRpb24gaXMgYmVpbmcgaW52b2tlZCBmcm9tXG4gICAgLy8gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGBzc2ZpYCBmbGFnIGhhc1xuICAgIC8vIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG92ZXJ3cml0aW5nIGFzc2VydGlvbi4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGVcbiAgICAvLyBgc3NmaWAgZmxhZyBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSB0aGUgb3V0ZXIgYXNzZXJ0aW9uLlxuICAgIGlmICghZmxhZyh0aGlzLCAnbG9ja1NzZmknKSkge1xuICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIG1ldGhvZFdyYXBwZXIpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9O1xuXG4gIGFkZExlbmd0aEd1YXJkKG1ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShtZXRob2RXcmFwcGVyLCBuYW1lKTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlUHJvcGVydHkgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBpc1Byb3h5RW5hYmxlZCA9IHJlcXVpcmUoJy4vaXNQcm94eUVuYWJsZWQnKTtcbnZhciB0cmFuc2ZlckZsYWdzID0gcmVxdWlyZSgnLi90cmFuc2ZlckZsYWdzJyk7XG5cbi8qKlxuICogIyMjIC5vdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGZuKVxuICpcbiAqIE92ZXJ3cml0ZXMgYW4gYWxyZWFkeSBleGlzdGluZyBwcm9wZXJ0eSBnZXR0ZXIgYW5kIHByb3ZpZGVzXG4gKiBhY2Nlc3MgdG8gcHJldmlvdXMgdmFsdWUuIE11c3QgcmV0dXJuIGZ1bmN0aW9uIHRvIHVzZSBhcyBnZXR0ZXIuXG4gKlxuICogICAgIHV0aWxzLm92ZXJ3cml0ZVByb3BlcnR5KGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ29rJywgZnVuY3Rpb24gKF9zdXBlcikge1xuICogICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAqICAgICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9vKSB7XG4gKiAgICAgICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iai5uYW1lKS50by5lcXVhbCgnYmFyJyk7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqXG4gKlxuICogQ2FuIGFsc28gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBgY2hhaS5Bc3NlcnRpb25gLlxuICpcbiAqICAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVQcm9wZXJ0eSgnZm9vJywgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5iZS5vaztcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBvdmVyd3JpdHRlblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgcHJvcGVydHkgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZ2V0dGVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIG5hbWVcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIG92ZXJ3cml0ZVByb3BlcnR5XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlUHJvcGVydHkoY3R4LCBuYW1lLCBnZXR0ZXIpIHtcbiAgdmFyIF9nZXQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN0eCwgbmFtZSlcbiAgICAsIF9zdXBlciA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gIGlmIChfZ2V0ICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBfZ2V0LmdldClcbiAgICBfc3VwZXIgPSBfZ2V0LmdldFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uIG92ZXJ3cml0aW5nUHJvcGVydHlHZXR0ZXIoKSB7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGBzc2ZpYCBmbGFnIHRvIGBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyYCBjYXVzZXMgdGhpc1xuICAgICAgICAvLyBmdW5jdGlvbiB0byBiZSB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIGltcGxlbWVudGF0aW9uIGZyYW1lc1xuICAgICAgICAvLyBmcm9tIHRoZSBzdGFjayB0cmFjZSBvZiBhIGZhaWxlZCBhc3NlcnRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbiBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgaWZcbiAgICAgICAgLy8gdGhlIGBsb2NrU3NmaWAgZmxhZyBpc24ndCBzZXQgYW5kIHByb3h5IHByb3RlY3Rpb24gaXMgZGlzYWJsZWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHRoZSBgbG9ja1NzZmlgIGZsYWcgaXMgc2V0LCB0aGVuIGVpdGhlciB0aGlzIGFzc2VydGlvbiBoYXMgYmVlblxuICAgICAgICAvLyBvdmVyd3JpdHRlbiBieSBhbm90aGVyIGFzc2VydGlvbiwgb3IgdGhpcyBhc3NlcnRpb24gaXMgYmVpbmcgaW52b2tlZFxuICAgICAgICAvLyBmcm9tIGluc2lkZSBvZiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBgc3NmaWAgZmxhZ1xuICAgICAgICAvLyBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSB0aGUgb3ZlcndyaXRpbmcgYXNzZXJ0aW9uLiBJbiB0aGUgc2Vjb25kXG4gICAgICAgIC8vIGNhc2UsIHRoZSBgc3NmaWAgZmxhZyBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSB0aGUgb3V0ZXIgYXNzZXJ0aW9uLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZiBwcm94eSBwcm90ZWN0aW9uIGlzIGVuYWJsZWQsIHRoZW4gdGhlIGBzc2ZpYCBmbGFnIGhhcyBhbHJlYWR5IGJlZW5cbiAgICAgICAgLy8gc2V0IGJ5IHRoZSBwcm94eSBnZXR0ZXIuXG4gICAgICAgIGlmICghaXNQcm94eUVuYWJsZWQoKSAmJiAhZmxhZyh0aGlzLCAnbG9ja1NzZmknKSkge1xuICAgICAgICAgIGZsYWcodGhpcywgJ3NzZmknLCBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGBsb2NrU3NmaWAgZmxhZyB0byBgdHJ1ZWAgcHJldmVudHMgdGhlIG92ZXJ3cml0dGVuXG4gICAgICAgIC8vIGFzc2VydGlvbiBmcm9tIGNoYW5naW5nIHRoZSBgc3NmaWAgZmxhZy4gQnkgdGhpcyBwb2ludCwgdGhlIGBzc2ZpYFxuICAgICAgICAvLyBmbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBjb3JyZWN0IHN0YXJ0aW5nIHBvaW50IGZvciB0aGlzIGFzc2VydGlvbi5cbiAgICAgICAgdmFyIG9yaWdMb2NrU3NmaSA9IGZsYWcodGhpcywgJ2xvY2tTc2ZpJyk7XG4gICAgICAgIGZsYWcodGhpcywgJ2xvY2tTc2ZpJywgdHJ1ZSk7XG4gICAgICAgIHZhciByZXN1bHQgPSBnZXR0ZXIoX3N1cGVyKS5jYWxsKHRoaXMpO1xuICAgICAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIG9yaWdMb2NrU3NmaSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgY2hhaS5Bc3NlcnRpb24oKTtcbiAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgICAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICAgICAgfVxuICAgICwgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufTtcbiIsICIvKiFcbiAqIENoYWkgLSBvdmVyd3JpdGVNZXRob2QgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBhZGRMZW5ndGhHdWFyZCA9IHJlcXVpcmUoJy4vYWRkTGVuZ3RoR3VhcmQnKTtcbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBwcm94aWZ5ID0gcmVxdWlyZSgnLi9wcm94aWZ5Jyk7XG52YXIgdHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKipcbiAqICMjIyAub3ZlcndyaXRlTWV0aG9kKGN0eCwgbmFtZSwgZm4pXG4gKlxuICogT3ZlcndyaXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIG1ldGhvZCBhbmQgcHJvdmlkZXNcbiAqIGFjY2VzcyB0byBwcmV2aW91cyBmdW5jdGlvbi4gTXVzdCByZXR1cm4gZnVuY3Rpb25cbiAqIHRvIGJlIHVzZWQgZm9yIG5hbWUuXG4gKlxuICogICAgIHV0aWxzLm92ZXJ3cml0ZU1ldGhvZChjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUsICdlcXVhbCcsIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3RyKSB7XG4gKiAgICAgICAgIHZhciBvYmogPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKTtcbiAqICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvbykge1xuICogICAgICAgICAgIG5ldyBjaGFpLkFzc2VydGlvbihvYmoudmFsdWUpLnRvLmVxdWFsKHN0cik7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZU1ldGhvZCgnZm9vJywgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5lcXVhbCgnYmFyJyk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN0eCBvYmplY3Qgd2hvc2UgbWV0aG9kIGlzIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiBtZXRob2QgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKSB7XG4gIHZhciBfbWV0aG9kID0gY3R4W25hbWVdXG4gICAgLCBfc3VwZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9O1xuXG4gIGlmIChfbWV0aG9kICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBfbWV0aG9kKVxuICAgIF9zdXBlciA9IF9tZXRob2Q7XG5cbiAgdmFyIG92ZXJ3cml0aW5nTWV0aG9kV3JhcHBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTZXR0aW5nIHRoZSBgc3NmaWAgZmxhZyB0byBgb3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyYCBjYXVzZXMgdGhpc1xuICAgIC8vIGZ1bmN0aW9uIHRvIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb21cbiAgICAvLyB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLlxuICAgIC8vXG4gICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZiB0aGVcbiAgICAvLyBgbG9ja1NzZmlgIGZsYWcgaXNuJ3Qgc2V0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgLy8gb3ZlcndyaXR0ZW4gYnkgYW5vdGhlciBhc3NlcnRpb24sIG9yIHRoaXMgYXNzZXJ0aW9uIGlzIGJlaW5nIGludm9rZWQgZnJvbVxuICAgIC8vIGluc2lkZSBvZiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBgc3NmaWAgZmxhZyBoYXNcbiAgICAvLyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlXG4gICAgLy8gYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG91dGVyIGFzc2VydGlvbi5cbiAgICBpZiAoIWZsYWcodGhpcywgJ2xvY2tTc2ZpJykpIHtcbiAgICAgIGZsYWcodGhpcywgJ3NzZmknLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cblxuICAgIC8vIFNldHRpbmcgdGhlIGBsb2NrU3NmaWAgZmxhZyB0byBgdHJ1ZWAgcHJldmVudHMgdGhlIG92ZXJ3cml0dGVuIGFzc2VydGlvblxuICAgIC8vIGZyb20gY2hhbmdpbmcgdGhlIGBzc2ZpYCBmbGFnLiBCeSB0aGlzIHBvaW50LCB0aGUgYHNzZmlgIGZsYWcgaXMgYWxyZWFkeVxuICAgIC8vIHNldCB0byB0aGUgY29ycmVjdCBzdGFydGluZyBwb2ludCBmb3IgdGhpcyBhc3NlcnRpb24uXG4gICAgdmFyIG9yaWdMb2NrU3NmaSA9IGZsYWcodGhpcywgJ2xvY2tTc2ZpJyk7XG4gICAgZmxhZyh0aGlzLCAnbG9ja1NzZmknLCB0cnVlKTtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIG9yaWdMb2NrU3NmaSk7XG5cbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9XG5cbiAgYWRkTGVuZ3RoR3VhcmQob3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyLCBuYW1lLCBmYWxzZSk7XG4gIGN0eFtuYW1lXSA9IHByb3hpZnkob3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyLCBuYW1lKTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gYWRkQ2hhaW5pbmdNZXRob2QgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qIVxuICogTW9kdWxlIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBhZGRMZW5ndGhHdWFyZCA9IHJlcXVpcmUoJy4vYWRkTGVuZ3RoR3VhcmQnKTtcbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBwcm94aWZ5ID0gcmVxdWlyZSgnLi9wcm94aWZ5Jyk7XG52YXIgdHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKiFcbiAqIE1vZHVsZSB2YXJpYWJsZXNcbiAqL1xuXG4vLyBDaGVjayB3aGV0aGVyIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIGlzIHN1cHBvcnRlZFxudmFyIGNhblNldFByb3RvdHlwZSA9IHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09ICdmdW5jdGlvbic7XG5cbi8vIFdpdGhvdXQgYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgc3VwcG9ydCwgdGhpcyBtb2R1bGUgd2lsbCBuZWVkIHRvIGFkZCBwcm9wZXJ0aWVzIHRvIGEgZnVuY3Rpb24uXG4vLyBIb3dldmVyLCBzb21lIG9mIGZ1bmN0aW9ucycgb3duIHByb3BzIGFyZSBub3QgY29uZmlndXJhYmxlIGFuZCBzaG91bGQgYmUgc2tpcHBlZC5cbnZhciB0ZXN0Rm4gPSBmdW5jdGlvbigpIHt9O1xudmFyIGV4Y2x1ZGVOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3RGbikuZmlsdGVyKGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0ZXN0Rm4sIG5hbWUpO1xuXG4gIC8vIE5vdGU6IFBoYW50b21KUyAxLnggaW5jbHVkZXMgYGNhbGxlZWAgYXMgb25lIG9mIGB0ZXN0Rm5gJ3Mgb3duIHByb3BlcnRpZXMsXG4gIC8vIGJ1dCB0aGVuIHJldHVybnMgYHVuZGVmaW5lZGAgYXMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIGBjYWxsZWVgLiBBcyBhXG4gIC8vIHdvcmthcm91bmQsIHdlIHBlcmZvcm0gYW4gb3RoZXJ3aXNlIHVubmVjZXNzYXJ5IHR5cGUtY2hlY2sgZm9yIGBwcm9wRGVzY2AsXG4gIC8vIGFuZCB0aGVuIGZpbHRlciBpdCBvdXQgaWYgaXQncyBub3QgYW4gb2JqZWN0IGFzIGl0IHNob3VsZCBiZS5cbiAgaWYgKHR5cGVvZiBwcm9wRGVzYyAhPT0gJ29iamVjdCcpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuICFwcm9wRGVzYy5jb25maWd1cmFibGU7XG59KTtcblxuLy8gQ2FjaGUgYEZ1bmN0aW9uYCBwcm9wZXJ0aWVzXG52YXIgY2FsbCAgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCxcbiAgICBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLyoqXG4gKiAjIyMgLmFkZENoYWluYWJsZU1ldGhvZChjdHgsIG5hbWUsIG1ldGhvZCwgY2hhaW5pbmdCZWhhdmlvcilcbiAqXG4gKiBBZGRzIGEgbWV0aG9kIHRvIGFuIG9iamVjdCwgc3VjaCB0aGF0IHRoZSBtZXRob2QgY2FuIGFsc28gYmUgY2hhaW5lZC5cbiAqXG4gKiAgICAgdXRpbHMuYWRkQ2hhaW5hYmxlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2ZvbycsIGZ1bmN0aW9uIChzdHIpIHtcbiAqICAgICAgIHZhciBvYmogPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKTtcbiAqICAgICAgIG5ldyBjaGFpLkFzc2VydGlvbihvYmopLnRvLmJlLmVxdWFsKHN0cik7XG4gKiAgICAgfSk7XG4gKlxuICogQ2FuIGFsc28gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBgY2hhaS5Bc3NlcnRpb25gLlxuICpcbiAqICAgICBjaGFpLkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2ZvbycsIGZuLCBjaGFpbmluZ0JlaGF2aW9yKTtcbiAqXG4gKiBUaGUgcmVzdWx0IGNhbiB0aGVuIGJlIHVzZWQgYXMgYm90aCBhIG1ldGhvZCBhc3NlcnRpb24sIGV4ZWN1dGluZyBib3RoIGBtZXRob2RgIGFuZFxuICogYGNoYWluaW5nQmVoYXZpb3JgLCBvciBhcyBhIGxhbmd1YWdlIGNoYWluLCB3aGljaCBvbmx5IGV4ZWN1dGVzIGBjaGFpbmluZ0JlaGF2aW9yYC5cbiAqXG4gKiAgICAgZXhwZWN0KGZvb1N0cikudG8uYmUuZm9vKCdiYXInKTtcbiAqICAgICBleHBlY3QoZm9vU3RyKS50by5iZS5mb28uZXF1YWwoJ2ZvbycpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHRvIHdoaWNoIHRoZSBtZXRob2QgaXMgYWRkZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIG1ldGhvZCB0byBhZGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBgbmFtZWAsIHdoZW4gY2FsbGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaGFpbmluZ0JlaGF2aW9yIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkQ2hhaW5hYmxlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYWRkQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gIGlmICh0eXBlb2YgY2hhaW5pbmdCZWhhdmlvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNoYWluaW5nQmVoYXZpb3IgPSBmdW5jdGlvbiAoKSB7IH07XG4gIH1cblxuICB2YXIgY2hhaW5hYmxlQmVoYXZpb3IgPSB7XG4gICAgICBtZXRob2Q6IG1ldGhvZFxuICAgICwgY2hhaW5pbmdCZWhhdmlvcjogY2hhaW5pbmdCZWhhdmlvclxuICB9O1xuXG4gIC8vIHNhdmUgdGhlIG1ldGhvZHMgc28gd2UgY2FuIG92ZXJ3cml0ZSB0aGVtIGxhdGVyLCBpZiB3ZSBuZWVkIHRvLlxuICBpZiAoIWN0eC5fX21ldGhvZHMpIHtcbiAgICBjdHguX19tZXRob2RzID0ge307XG4gIH1cbiAgY3R4Ll9fbWV0aG9kc1tuYW1lXSA9IGNoYWluYWJsZUJlaGF2aW9yO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uIGNoYWluYWJsZU1ldGhvZEdldHRlcigpIHtcbiAgICAgICAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBjaGFpbmFibGVNZXRob2RXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGBzc2ZpYCBmbGFnIHRvIGBjaGFpbmFibGVNZXRob2RXcmFwcGVyYCBjYXVzZXMgdGhpc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uIHRvIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAvLyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZlxuICAgICAgICAgIC8vIHRoZSBgbG9ja1NzZmlgIGZsYWcgaXNuJ3Qgc2V0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gdGhpcyBhc3NlcnRpb24gaXMgYmVpbmdcbiAgICAgICAgICAvLyBpbnZva2VkIGZyb20gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBgc3NmaWBcbiAgICAgICAgICAvLyBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdXRlciBhc3NlcnRpb24uXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBOb3RlIHRoYXQgb3ZlcndyaXRpbmcgYSBjaGFpbmFibGUgbWV0aG9kIG1lcmVseSByZXBsYWNlcyB0aGUgc2F2ZWRcbiAgICAgICAgICAvLyBtZXRob2RzIGluIGBjdHguX19tZXRob2RzYCBpbnN0ZWFkIG9mIGNvbXBsZXRlbHkgcmVwbGFjaW5nIHRoZVxuICAgICAgICAgIC8vIG92ZXJ3cml0dGVuIGFzc2VydGlvbi4gVGhlcmVmb3JlLCBhbiBvdmVyd3JpdGluZyBhc3NlcnRpb24gd29uJ3RcbiAgICAgICAgICAvLyBzZXQgdGhlIGBzc2ZpYCBvciBgbG9ja1NzZmlgIGZsYWdzLlxuICAgICAgICAgIGlmICghZmxhZyh0aGlzLCAnbG9ja1NzZmknKSkge1xuICAgICAgICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZXN1bHQgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgICAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIGFkZExlbmd0aEd1YXJkKGNoYWluYWJsZU1ldGhvZFdyYXBwZXIsIG5hbWUsIHRydWUpO1xuXG4gICAgICAgIC8vIFVzZSBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKGNhblNldFByb3RvdHlwZSkge1xuICAgICAgICAgIC8vIEluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgb2JqZWN0IGJ5IHJlcGxhY2luZyB0aGUgYEZ1bmN0aW9uYCBwcm90b3R5cGVcbiAgICAgICAgICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBgY2FsbGAgYW5kIGBhcHBseWAgbWV0aG9kcyBmcm9tIGBGdW5jdGlvbmBcbiAgICAgICAgICBwcm90b3R5cGUuY2FsbCA9IGNhbGw7XG4gICAgICAgICAgcHJvdG90eXBlLmFwcGx5ID0gYXBwbHk7XG4gICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGNoYWluYWJsZU1ldGhvZFdyYXBwZXIsIHByb3RvdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCByZWRlZmluZSBhbGwgcHJvcGVydGllcyAoc2xvdyEpXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBhc3NlcnRlck5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3R4KTtcbiAgICAgICAgICBhc3NlcnRlck5hbWVzLmZvckVhY2goZnVuY3Rpb24gKGFzc2VydGVyTmFtZSkge1xuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVOYW1lcy5pbmRleE9mKGFzc2VydGVyTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdHgsIGFzc2VydGVyTmFtZSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2hhaW5hYmxlTWV0aG9kV3JhcHBlciwgYXNzZXJ0ZXJOYW1lLCBwZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICByZXR1cm4gcHJveGlmeShjaGFpbmFibGVNZXRob2RXcmFwcGVyKTtcbiAgICAgIH1cbiAgICAsIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgY2hhaSA9IHJlcXVpcmUoJy4uLy4uL2NoYWknKTtcbnZhciB0cmFuc2ZlckZsYWdzID0gcmVxdWlyZSgnLi90cmFuc2ZlckZsYWdzJyk7XG5cbi8qKlxuICogIyMjIC5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpXG4gKlxuICogT3ZlcndyaXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIGNoYWluYWJsZSBtZXRob2RcbiAqIGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHByZXZpb3VzIGZ1bmN0aW9uIG9yXG4gKiBwcm9wZXJ0eS4gIE11c3QgcmV0dXJuIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGZvclxuICogbmFtZS5cbiAqXG4gKiAgICAgdXRpbHMub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2xlbmd0aE9mJyxcbiAqICAgICAgIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIH1cbiAqICAgICAsIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIH1cbiAqICAgICApO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKCdmb28nLCBmbiwgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICogICAgIGV4cGVjdChteUZvbykudG8uaGF2ZS5sZW5ndGhPZi5hYm92ZSgzKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4IG9iamVjdCB3aG9zZSBtZXRob2QgLyBwcm9wZXJ0eSBpcyB0byBiZSBvdmVyd3JpdHRlblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgbWV0aG9kIC8gcHJvcGVydHkgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBwcm9wZXJ0eVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gIHZhciBjaGFpbmFibGVCZWhhdmlvciA9IGN0eC5fX21ldGhvZHNbbmFtZV07XG5cbiAgdmFyIF9jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvcjtcbiAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvciA9IGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgIHZhciByZXN1bHQgPSBjaGFpbmluZ0JlaGF2aW9yKF9jaGFpbmluZ0JlaGF2aW9yKS5jYWxsKHRoaXMpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IGNoYWkuQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH07XG5cbiAgdmFyIF9tZXRob2QgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2Q7XG4gIGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZCA9IGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kV3JhcHBlcigpIHtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9tZXRob2QpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgY2hhaS5Bc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gY29tcGFyZUJ5SW5zcGVjdCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGluc3BlY3QgPSByZXF1aXJlKCcuL2luc3BlY3QnKTtcblxuLyoqXG4gKiAjIyMgLmNvbXBhcmVCeUluc3BlY3QobWl4ZWQsIG1peGVkKVxuICpcbiAqIFRvIGJlIHVzZWQgYXMgYSBjb21wYXJlRnVuY3Rpb24gd2l0aCBBcnJheS5wcm90b3R5cGUuc29ydC4gQ29tcGFyZXMgZWxlbWVudHNcbiAqIHVzaW5nIGluc3BlY3QgaW5zdGVhZCBvZiBkZWZhdWx0IGJlaGF2aW9yIG9mIHVzaW5nIHRvU3RyaW5nIHNvIHRoYXQgU3ltYm9sc1xuICogYW5kIG9iamVjdHMgd2l0aCBpcnJlZ3VsYXIvbWlzc2luZyB0b1N0cmluZyBjYW4gc3RpbGwgYmUgc29ydGVkIHdpdGhvdXQgYVxuICogVHlwZUVycm9yLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGZpcnN0IGVsZW1lbnQgdG8gY29tcGFyZVxuICogQHBhcmFtIHtNaXhlZH0gc2Vjb25kIGVsZW1lbnQgdG8gY29tcGFyZVxuICogQHJldHVybnMge051bWJlcn0gLTEgaWYgJ2EnIHNob3VsZCBjb21lIGJlZm9yZSAnYic7IG90aGVyd2lzZSAxXG4gKiBAbmFtZSBjb21wYXJlQnlJbnNwZWN0XG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tcGFyZUJ5SW5zcGVjdChhLCBiKSB7XG4gIHJldHVybiBpbnNwZWN0KGEpIDwgaW5zcGVjdChiKSA/IC0xIDogMTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMob2JqZWN0KVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgZGlyZWN0bHktb3duZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBzeW1ib2xzIG9mIGFuXG4gKiBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc1xuICogcmV0dXJucyBib3RoIGVudW1lcmFibGUgYW5kIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHJldHVybnMge0FycmF5fVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMob2JqKSB7XG4gIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaikuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bSkuZW51bWVyYWJsZTtcbiAgfSk7XG59O1xuIiwgIi8qIVxuICogQ2hhaSAtIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTYgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKiFcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXNcbiAqL1xuXG52YXIgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyA9IHJlcXVpcmUoJy4vZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scycpO1xuXG4vKipcbiAqICMjIyAuZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMob2JqZWN0KVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgZGlyZWN0bHktb3duZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYW4gb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIE9iamVjdC5rZXlzIG9ubHlcbiAqIHJldHVybnMgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcywgbm90IGVudW1lcmFibGUgcHJvcGVydHkgc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5jb25jYXQoZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiAhXG4gKiBDaGFpIC0gY2hlY2tFcnJvciB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmNoZWNrRXJyb3JcbiAqXG4gKiBDaGVja3MgdGhhdCBhbiBlcnJvciBjb25mb3JtcyB0byBhIGdpdmVuIHNldCBvZiBjcml0ZXJpYSBhbmQvb3IgcmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IGl0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuLyoqXG4gKiAjIyMgLmNvbXBhdGlibGVJbnN0YW5jZSh0aHJvd24sIGVycm9yTGlrZSlcbiAqXG4gKiBDaGVja3MgaWYgdHdvIGluc3RhbmNlcyBhcmUgY29tcGF0aWJsZSAoc3RyaWN0IGVxdWFsKS5cbiAqIFJldHVybnMgZmFsc2UgaWYgZXJyb3JMaWtlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBFcnJvciwgYmVjYXVzZSBpbnN0YW5jZXNcbiAqIGNhbiBvbmx5IGJlIGNvbXBhdGlibGUgaWYgdGhleSdyZSBib3RoIGVycm9yIGluc3RhbmNlcy5cbiAqXG4gKiBAbmFtZSBjb21wYXRpYmxlSW5zdGFuY2VcbiAqIEBwYXJhbSB7RXJyb3J9IHRocm93biBlcnJvclxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2Ugb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuXG4vKipcbiAqICMjIyAuY29tcGF0aWJsZUNvbnN0cnVjdG9yKHRocm93biwgZXJyb3JMaWtlKVxuICpcbiAqIENoZWNrcyBpZiB0d28gY29uc3RydWN0b3JzIGFyZSBjb21wYXRpYmxlLlxuICogVGhpcyBmdW5jdGlvbiBjYW4gcmVjZWl2ZSBlaXRoZXIgYW4gZXJyb3IgY29uc3RydWN0b3Igb3JcbiAqIGFuIGVycm9yIGluc3RhbmNlIGFzIHRoZSBgZXJyb3JMaWtlYCBhcmd1bWVudC5cbiAqIENvbnN0cnVjdG9ycyBhcmUgY29tcGF0aWJsZSBpZiB0aGV5J3JlIHRoZSBzYW1lIG9yIGlmIG9uZSBpc1xuICogYW4gaW5zdGFuY2Ugb2YgYW5vdGhlci5cbiAqXG4gKiBAbmFtZSBjb21wYXRpYmxlQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXJyb3J9IHRocm93biBlcnJvclxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2Ugb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgLy8gSWYgYGVycm9yTGlrZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYW55IGVycm9yIHdlIGNvbXBhcmUgdGhlaXIgY29uc3RydWN0b3JzXG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmIChlcnJvckxpa2UucHJvdG90eXBlIGluc3RhbmNlb2YgRXJyb3IgfHwgZXJyb3JMaWtlID09PSBFcnJvcikge1xuICAgIC8vIElmIGBlcnJvckxpa2VgIGlzIGEgY29uc3RydWN0b3IgdGhhdCBpbmhlcml0cyBmcm9tIEVycm9yLCB3ZSBjb21wYXJlIGB0aHJvd25gIHRvIGBlcnJvckxpa2VgIGRpcmVjdGx5XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiAjIyMgLmNvbXBhdGlibGVNZXNzYWdlKHRocm93biwgZXJyTWF0Y2hlcilcbiAqXG4gKiBDaGVja3MgaWYgYW4gZXJyb3IncyBtZXNzYWdlIGlzIGNvbXBhdGlibGUgd2l0aCBhIG1hdGNoZXIgKFN0cmluZyBvciBSZWdFeHApLlxuICogSWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIFN0cmluZyBvciBwYXNzZXMgdGhlIFJlZ0V4cCB0ZXN0LFxuICogaXQgaXMgY29uc2lkZXJlZCBjb21wYXRpYmxlLlxuICpcbiAqIEBuYW1lIGNvbXBhdGlibGVNZXNzYWdlXG4gKiBAcGFyYW0ge0Vycm9yfSB0aHJvd24gZXJyb3JcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gZXJyTWF0Y2hlciB0byBsb29rIGZvciBpbnRvIHRoZSBtZXNzYWdlXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNvbXBhdGlibGVNZXNzYWdlKHRocm93biwgZXJyTWF0Y2hlcikge1xuICB2YXIgY29tcGFyaXNvblN0cmluZyA9IHR5cGVvZiB0aHJvd24gPT09ICdzdHJpbmcnID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChlcnJNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIGVyck1hdGNoZXIudGVzdChjb21wYXJpc29uU3RyaW5nKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyTWF0Y2hlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogIyMjIC5nZXRGdW5jdGlvbk5hbWUoY29uc3RydWN0b3JGbilcbiAqXG4gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24uXG4gKiBUaGlzIGFsc28gaW5jbHVkZXMgYSBwb2x5ZmlsbCBmdW5jdGlvbiBpZiBgY29uc3RydWN0b3JGbi5uYW1lYCBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAbmFtZSBnZXRGdW5jdGlvbk5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yRm5cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciBmdW5jdGlvbk5hbWVNYXRjaCA9IC9cXHMqZnVuY3Rpb24oPzpcXHN8XFxzKlxcL1xcKlteKD86KlxcLyldK1xcKlxcL1xccyopKihbXlxcKFxcL10rKS87XG5mdW5jdGlvbiBnZXRGdW5jdGlvbk5hbWUoY29uc3RydWN0b3JGbikge1xuICB2YXIgbmFtZSA9ICcnO1xuICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yRm4ubmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBIZXJlIHdlIHJ1biBhIHBvbHlmaWxsIGlmIGNvbnN0cnVjdG9yRm4ubmFtZSBpcyBub3QgZGVmaW5lZFxuICAgIHZhciBtYXRjaCA9IFN0cmluZyhjb25zdHJ1Y3RvckZuKS5tYXRjaChmdW5jdGlvbk5hbWVNYXRjaCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5hbWUgPSBjb25zdHJ1Y3RvckZuLm5hbWU7XG4gIH1cblxuICByZXR1cm4gbmFtZTtcbn1cblxuLyoqXG4gKiAjIyMgLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpXG4gKlxuICogR2V0cyB0aGUgY29uc3RydWN0b3IgbmFtZSBmb3IgYW4gRXJyb3IgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IgaXRzZWxmLlxuICpcbiAqIEBuYW1lIGdldENvbnN0cnVjdG9yTmFtZVxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2VcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkge1xuICB2YXIgY29uc3RydWN0b3JOYW1lID0gZXJyb3JMaWtlO1xuICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBjb25zdHJ1Y3Rvck5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZXJyb3JMaWtlLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgYGVycmAgaXMgbm90IGFuIGluc3RhbmNlIG9mIEVycm9yIGl0IGlzIGFuIGVycm9yIGNvbnN0cnVjdG9yIGl0c2VsZiBvciBhbm90aGVyIGZ1bmN0aW9uLlxuICAgIC8vIElmIHdlJ3ZlIGdvdCBhIGNvbW1vbiBmdW5jdGlvbiB3ZSBnZXQgaXRzIG5hbWUsIG90aGVyd2lzZSB3ZSBtYXkgbmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2VcbiAgICAvLyBvZiB0aGUgZXJyb3IganVzdCBpbiBjYXNlIGl0J3MgYSBwb29ybHktY29uc3RydWN0ZWQgZXJyb3IuIFBsZWFzZSBzZWUgY2hhaWpzL2NoYWkvaXNzdWVzLzQ1IHRvIGtub3cgbW9yZS5cbiAgICBjb25zdHJ1Y3Rvck5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZXJyb3JMaWtlKS50cmltKCkgfHxcbiAgICAgICAgZ2V0RnVuY3Rpb25OYW1lKG5ldyBlcnJvckxpa2UoKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cblxuLyoqXG4gKiAjIyMgLmdldE1lc3NhZ2UoZXJyb3JMaWtlKVxuICpcbiAqIEdldHMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSBhbiBlcnJvci5cbiAqIElmIGBlcnJgIGlzIGEgU3RyaW5nIGl0c2VsZiwgd2UgcmV0dXJuIGl0LlxuICogSWYgdGhlIGVycm9yIGhhcyBubyBtZXNzYWdlLCB3ZSByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLlxuICpcbiAqIEBuYW1lIGdldE1lc3NhZ2VcbiAqIEBwYXJhbSB7RXJyb3J8U3RyaW5nfSBlcnJvckxpa2VcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgdmFyIG1zZyA9ICcnO1xuICBpZiAoZXJyb3JMaWtlICYmIGVycm9yTGlrZS5tZXNzYWdlKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yTGlrZSA9PT0gJ3N0cmluZycpIHtcbiAgICBtc2cgPSBlcnJvckxpa2U7XG4gIH1cblxuICByZXR1cm4gbXNnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGF0aWJsZUluc3RhbmNlOiBjb21wYXRpYmxlSW5zdGFuY2UsXG4gIGNvbXBhdGlibGVDb25zdHJ1Y3RvcjogY29tcGF0aWJsZUNvbnN0cnVjdG9yLFxuICBjb21wYXRpYmxlTWVzc2FnZTogY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldE1lc3NhZ2U6IGdldE1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogZ2V0Q29uc3RydWN0b3JOYW1lLFxufTtcbiIsICIvKiFcbiAqIENoYWkgLSBpc05hTiB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE1IFNha3RoaXByaXlhbiBWYWlyYW1hbmkgPHRoZWNoYXJnaW5ndm9sY2Fub0BnbWFpbC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuaXNOYU4odmFsdWUpXG4gKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBOYU4gb3Igbm90LlxuICpcbiAqICAgICB1dGlscy5pc05hTihOYU4pOyAvLyB0cnVlXG4gKlxuICogQHBhcmFtIHtWYWx1ZX0gVGhlIHZhbHVlIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkIGlmIGl0IGlzIE5hTlxuICogQG5hbWUgaXNOYU5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gIC8vIFJlZmVyIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pc25hbi1udW1iZXJcbiAgLy8gc2VjdGlvbidzIE5PVEUuXG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbi8vIElmIEVDTUFTY3JpcHQgNidzIE51bWJlci5pc05hTiBpcyBwcmVzZW50LCBwcmVmZXIgdGhhdC5cbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzTmFOIHx8IGlzTmFOO1xuIiwgInZhciB0eXBlID0gcmVxdWlyZSgndHlwZS1kZXRlY3QnKTtcblxudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcblxuZnVuY3Rpb24gaXNPYmplY3RUeXBlKG9iaikge1xuICB2YXIgb2JqZWN0VHlwZSA9IHR5cGUob2JqKTtcbiAgdmFyIG9iamVjdFR5cGVzID0gWydBcnJheScsICdPYmplY3QnLCAnZnVuY3Rpb24nXTtcblxuICByZXR1cm4gb2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlKSAhPT0gLTE7XG59XG5cbi8qKlxuICogIyMjIC5nZXRPcGVyYXRvcihtZXNzYWdlKVxuICpcbiAqIEV4dHJhY3QgdGhlIG9wZXJhdG9yIGZyb20gZXJyb3IgbWVzc2FnZS5cbiAqIE9wZXJhdG9yIGRlZmluZWQgaXMgYmFzZWQgb24gYmVsb3cgbGlua1xuICogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9hc3NlcnQuaHRtbCNhc3NlcnRfYXNzZXJ0LlxuICpcbiAqIFJldHVybnMgdGhlIGBvcGVyYXRvcmAgb3IgYHVuZGVmaW5lZGAgdmFsdWUgZm9yIGFuIEFzc2VydGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IChjb25zdHJ1Y3RlZCBBc3NlcnRpb24pXG4gKiBAcGFyYW0ge0FyZ3VtZW50c30gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmFzc2VydCBhcmd1bWVudHNcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldE9wZXJhdG9yXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3BlcmF0b3Iob2JqLCBhcmdzKSB7XG4gIHZhciBvcGVyYXRvciA9IGZsYWcob2JqLCAnb3BlcmF0b3InKTtcbiAgdmFyIG5lZ2F0ZSA9IGZsYWcob2JqLCAnbmVnYXRlJyk7XG4gIHZhciBleHBlY3RlZCA9IGFyZ3NbM107XG4gIHZhciBtc2cgPSBuZWdhdGUgPyBhcmdzWzJdIDogYXJnc1sxXTtcblxuICBpZiAob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cblxuICBpZiAodHlwZW9mIG1zZyA9PT0gJ2Z1bmN0aW9uJykgbXNnID0gbXNnKCk7XG5cbiAgbXNnID0gbXNnIHx8ICcnO1xuICBpZiAoIW1zZykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoL1xcc2hhdmVcXHMvLnRlc3QobXNnKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgaXNPYmplY3QgPSBpc09iamVjdFR5cGUoZXhwZWN0ZWQpO1xuICBpZiAoL1xcc25vdFxccy8udGVzdChtc2cpKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0ID8gJ25vdERlZXBTdHJpY3RFcXVhbCcgOiAnbm90U3RyaWN0RXF1YWwnO1xuICB9XG5cbiAgcmV0dXJuIGlzT2JqZWN0ID8gJ2RlZXBTdHJpY3RFcXVhbCcgOiAnc3RyaWN0RXF1YWwnO1xufTtcbiIsICIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExIEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBEZXBlbmRlbmNpZXMgdGhhdCBhcmUgdXNlZCBmb3IgbXVsdGlwbGUgZXhwb3J0cyBhcmUgcmVxdWlyZWQgaGVyZSBvbmx5IG9uY2VcbiAqL1xuXG52YXIgcGF0aHZhbCA9IHJlcXVpcmUoJ3BhdGh2YWwnKTtcblxuLyohXG4gKiB0ZXN0IHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLnRlc3QgPSByZXF1aXJlKCcuL3Rlc3QnKTtcblxuLyohXG4gKiB0eXBlIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLnR5cGUgPSByZXF1aXJlKCd0eXBlLWRldGVjdCcpO1xuXG4vKiFcbiAqIGV4cGVjdFR5cGVzIHV0aWxpdHlcbiAqL1xuZXhwb3J0cy5leHBlY3RUeXBlcyA9IHJlcXVpcmUoJy4vZXhwZWN0VHlwZXMnKTtcblxuLyohXG4gKiBtZXNzYWdlIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLmdldE1lc3NhZ2UgPSByZXF1aXJlKCcuL2dldE1lc3NhZ2UnKTtcblxuLyohXG4gKiBhY3R1YWwgdXRpbGl0eVxuICovXG5cbmV4cG9ydHMuZ2V0QWN0dWFsID0gcmVxdWlyZSgnLi9nZXRBY3R1YWwnKTtcblxuLyohXG4gKiBJbnNwZWN0IHV0aWxcbiAqL1xuXG5leHBvcnRzLmluc3BlY3QgPSByZXF1aXJlKCcuL2luc3BlY3QnKTtcblxuLyohXG4gKiBPYmplY3QgRGlzcGxheSB1dGlsXG4gKi9cblxuZXhwb3J0cy5vYmpEaXNwbGF5ID0gcmVxdWlyZSgnLi9vYmpEaXNwbGF5Jyk7XG5cbi8qIVxuICogRmxhZyB1dGlsaXR5XG4gKi9cblxuZXhwb3J0cy5mbGFnID0gcmVxdWlyZSgnLi9mbGFnJyk7XG5cbi8qIVxuICogRmxhZyB0cmFuc2ZlcnJpbmcgdXRpbGl0eVxuICovXG5cbmV4cG9ydHMudHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKiFcbiAqIERlZXAgZXF1YWwgdXRpbGl0eVxuICovXG5cbmV4cG9ydHMuZXFsID0gcmVxdWlyZSgnZGVlcC1lcWwnKTtcblxuLyohXG4gKiBEZWVwIHBhdGggaW5mb1xuICovXG5cbmV4cG9ydHMuZ2V0UGF0aEluZm8gPSBwYXRodmFsLmdldFBhdGhJbmZvO1xuXG4vKiFcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgZXhpc3RzXG4gKi9cblxuZXhwb3J0cy5oYXNQcm9wZXJ0eSA9IHBhdGh2YWwuaGFzUHJvcGVydHk7XG5cbi8qIVxuICogRnVuY3Rpb24gbmFtZVxuICovXG5cbmV4cG9ydHMuZ2V0TmFtZSA9IHJlcXVpcmUoJ2dldC1mdW5jLW5hbWUnKTtcblxuLyohXG4gKiBhZGQgUHJvcGVydHlcbiAqL1xuXG5leHBvcnRzLmFkZFByb3BlcnR5ID0gcmVxdWlyZSgnLi9hZGRQcm9wZXJ0eScpO1xuXG4vKiFcbiAqIGFkZCBNZXRob2RcbiAqL1xuXG5leHBvcnRzLmFkZE1ldGhvZCA9IHJlcXVpcmUoJy4vYWRkTWV0aG9kJyk7XG5cbi8qIVxuICogb3ZlcndyaXRlIFByb3BlcnR5XG4gKi9cblxuZXhwb3J0cy5vdmVyd3JpdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vb3ZlcndyaXRlUHJvcGVydHknKTtcblxuLyohXG4gKiBvdmVyd3JpdGUgTWV0aG9kXG4gKi9cblxuZXhwb3J0cy5vdmVyd3JpdGVNZXRob2QgPSByZXF1aXJlKCcuL292ZXJ3cml0ZU1ldGhvZCcpO1xuXG4vKiFcbiAqIEFkZCBhIGNoYWluYWJsZSBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmFkZENoYWluYWJsZU1ldGhvZCA9IHJlcXVpcmUoJy4vYWRkQ2hhaW5hYmxlTWV0aG9kJyk7XG5cbi8qIVxuICogT3ZlcndyaXRlIGNoYWluYWJsZSBtZXRob2RcbiAqL1xuXG5leHBvcnRzLm92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCA9IHJlcXVpcmUoJy4vb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kJyk7XG5cbi8qIVxuICogQ29tcGFyZSBieSBpbnNwZWN0IG1ldGhvZFxuICovXG5cbmV4cG9ydHMuY29tcGFyZUJ5SW5zcGVjdCA9IHJlcXVpcmUoJy4vY29tcGFyZUJ5SW5zcGVjdCcpO1xuXG4vKiFcbiAqIEdldCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBzeW1ib2xzIG1ldGhvZFxuICovXG5cbmV4cG9ydHMuZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyA9IHJlcXVpcmUoJy4vZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scycpO1xuXG4vKiFcbiAqIEdldCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG1ldGhvZFxuICovXG5cbmV4cG9ydHMuZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2dldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzJyk7XG5cbi8qIVxuICogQ2hlY2tzIGVycm9yIGFnYWluc3QgYSBnaXZlbiBzZXQgb2YgY3JpdGVyaWFcbiAqL1xuXG5leHBvcnRzLmNoZWNrRXJyb3IgPSByZXF1aXJlKCdjaGVjay1lcnJvcicpO1xuXG4vKiFcbiAqIFByb3hpZnkgdXRpbFxuICovXG5cbmV4cG9ydHMucHJveGlmeSA9IHJlcXVpcmUoJy4vcHJveGlmeScpO1xuXG4vKiFcbiAqIGFkZExlbmd0aEd1YXJkIHV0aWxcbiAqL1xuXG5leHBvcnRzLmFkZExlbmd0aEd1YXJkID0gcmVxdWlyZSgnLi9hZGRMZW5ndGhHdWFyZCcpO1xuXG4vKiFcbiAqIGlzUHJveHlFbmFibGVkIGhlbHBlclxuICovXG5cbmV4cG9ydHMuaXNQcm94eUVuYWJsZWQgPSByZXF1aXJlKCcuL2lzUHJveHlFbmFibGVkJyk7XG5cbi8qIVxuICogaXNOYU4gbWV0aG9kXG4gKi9cblxuZXhwb3J0cy5pc05hTiA9IHJlcXVpcmUoJy4vaXNOYU4nKTtcblxuLyohXG4gKiBnZXRPcGVyYXRvciBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmdldE9wZXJhdG9yID0gcmVxdWlyZSgnLi9nZXRPcGVyYXRvcicpOyIsICIvKiFcbiAqIGNoYWlcbiAqIGh0dHA6Ly9jaGFpanMuY29tXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKF9jaGFpLCB1dGlsKSB7XG4gIC8qIVxuICAgKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICAgKi9cblxuICB2YXIgQXNzZXJ0aW9uRXJyb3IgPSBfY2hhaS5Bc3NlcnRpb25FcnJvclxuICAgICwgZmxhZyA9IHV0aWwuZmxhZztcblxuICAvKiFcbiAgICogTW9kdWxlIGV4cG9ydC5cbiAgICovXG5cbiAgX2NoYWkuQXNzZXJ0aW9uID0gQXNzZXJ0aW9uO1xuXG4gIC8qIVxuICAgKiBBc3NlcnRpb24gQ29uc3RydWN0b3JcbiAgICpcbiAgICogQ3JlYXRlcyBvYmplY3QgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBgQXNzZXJ0aW9uYCBvYmplY3RzIGNvbnRhaW4gbWV0YWRhdGEgaW4gdGhlIGZvcm0gb2YgZmxhZ3MuIFRocmVlIGZsYWdzIGNhblxuICAgKiBiZSBhc3NpZ25lZCBkdXJpbmcgaW5zdGFudGlhdGlvbiBieSBwYXNzaW5nIGFyZ3VtZW50cyB0byB0aGlzIGNvbnN0cnVjdG9yOlxuICAgKlxuICAgKiAtIGBvYmplY3RgOiBUaGlzIGZsYWcgY29udGFpbnMgdGhlIHRhcmdldCBvZiB0aGUgYXNzZXJ0aW9uLiBGb3IgZXhhbXBsZSwgaW5cbiAgICogICB0aGUgYXNzZXJ0aW9uIGBleHBlY3QobnVtS2l0dGVucykudG8uZXF1YWwoNyk7YCwgdGhlIGBvYmplY3RgIGZsYWcgd2lsbFxuICAgKiAgIGNvbnRhaW4gYG51bUtpdHRlbnNgIHNvIHRoYXQgdGhlIGBlcXVhbGAgYXNzZXJ0aW9uIGNhbiByZWZlcmVuY2UgaXQgd2hlblxuICAgKiAgIG5lZWRlZC5cbiAgICpcbiAgICogLSBgbWVzc2FnZWA6IFRoaXMgZmxhZyBjb250YWlucyBhbiBvcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZVxuICAgKiAgIHByZXBlbmRlZCB0byB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0J3MgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlcnRpb24gd2hlbiBpdFxuICAgKiAgIGZhaWxzLlxuICAgKlxuICAgKiAtIGBzc2ZpYDogVGhpcyBmbGFnIHN0YW5kcyBmb3IgXCJzdGFydCBzdGFjayBmdW5jdGlvbiBpbmRpY2F0b3JcIi4gSXRcbiAgICogICBjb250YWlucyBhIGZ1bmN0aW9uIHJlZmVyZW5jZSB0aGF0IHNlcnZlcyBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAqICAgcmVtb3ZpbmcgZnJhbWVzIGZyb20gdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBlcnJvciB0aGF0J3MgY3JlYXRlZCBieSB0aGVcbiAgICogICBhc3NlcnRpb24gd2hlbiBpdCBmYWlscy4gVGhlIGdvYWwgaXMgdG8gcHJvdmlkZSBhIGNsZWFuZXIgc3RhY2sgdHJhY2UgdG9cbiAgICogICBlbmQgdXNlcnMgYnkgcmVtb3ZpbmcgQ2hhaSdzIGludGVybmFsIGZ1bmN0aW9ucy4gTm90ZSB0aGF0IGl0IG9ubHkgd29ya3NcbiAgICogICBpbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IGBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZWAsIGFuZCBvbmx5IHdoZW5cbiAgICogICBgQ2hhaS5jb25maWcuaW5jbHVkZVN0YWNrYCBoYXNuJ3QgYmVlbiBzZXQgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogLSBgbG9ja1NzZmlgOiBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGBzc2ZpYCBmbGFnXG4gICAqICAgc2hvdWxkIHJldGFpbiBpdHMgY3VycmVudCB2YWx1ZSwgZXZlbiBhcyBhc3NlcnRpb25zIGFyZSBjaGFpbmVkIG9mZiBvZlxuICAgKiAgIHRoaXMgb2JqZWN0LiBUaGlzIGlzIHVzdWFsbHkgc2V0IHRvIGB0cnVlYCB3aGVuIGNyZWF0aW5nIGEgbmV3IGFzc2VydGlvblxuICAgKiAgIGZyb20gd2l0aGluIGFub3RoZXIgYXNzZXJ0aW9uLiBJdCdzIGFsc28gdGVtcG9yYXJpbHkgc2V0IHRvIGB0cnVlYCBiZWZvcmVcbiAgICogICBhbiBvdmVyd3JpdHRlbiBhc3NlcnRpb24gZ2V0cyBjYWxsZWQgYnkgdGhlIG92ZXJ3cml0aW5nIGFzc2VydGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqIHRhcmdldCBvZiB0aGUgYXNzZXJ0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgKG9wdGlvbmFsKSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzc2ZpIChvcHRpb25hbCkgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIHN0YWNrIGZyYW1lc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxvY2tTc2ZpIChvcHRpb25hbCkgd2hldGhlciBvciBub3QgdGhlIHNzZmkgZmxhZyBpcyBsb2NrZWRcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGZ1bmN0aW9uIEFzc2VydGlvbiAob2JqLCBtc2csIHNzZmksIGxvY2tTc2ZpKSB7XG4gICAgZmxhZyh0aGlzLCAnc3NmaScsIHNzZmkgfHwgQXNzZXJ0aW9uKTtcbiAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIGxvY2tTc2ZpKTtcbiAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBvYmopO1xuICAgIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuXG4gICAgcmV0dXJuIHV0aWwucHJveGlmeSh0aGlzKTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3NlcnRpb24sICdpbmNsdWRlU3RhY2snLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzZXJ0aW9uLmluY2x1ZGVTdGFjayBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrIGluc3RlYWQuJyk7XG4gICAgICByZXR1cm4gY29uZmlnLmluY2x1ZGVTdGFjaztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzZXJ0aW9uLmluY2x1ZGVTdGFjayBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrIGluc3RlYWQuJyk7XG4gICAgICBjb25maWcuaW5jbHVkZVN0YWNrID0gdmFsdWU7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXNzZXJ0aW9uLCAnc2hvd0RpZmYnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzZXJ0aW9uLnNob3dEaWZmIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5zaG93RGlmZiBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuIGNvbmZpZy5zaG93RGlmZjtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzZXJ0aW9uLnNob3dEaWZmIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5zaG93RGlmZiBpbnN0ZWFkLicpO1xuICAgICAgY29uZmlnLnNob3dEaWZmID0gdmFsdWU7XG4gICAgfVxuICB9KTtcblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgICB1dGlsLmFkZFByb3BlcnR5KHRoaXMucHJvdG90eXBlLCBuYW1lLCBmbik7XG4gIH07XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCA9IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICAgIHV0aWwuYWRkTWV0aG9kKHRoaXMucHJvdG90eXBlLCBuYW1lLCBmbik7XG4gIH07XG5cbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCA9IGZ1bmN0aW9uIChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIHV0aWwuYWRkQ2hhaW5hYmxlTWV0aG9kKHRoaXMucHJvdG90eXBlLCBuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcik7XG4gIH07XG5cbiAgQXNzZXJ0aW9uLm92ZXJ3cml0ZVByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgdXRpbC5vdmVyd3JpdGVQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xuICB9O1xuXG4gIEFzc2VydGlvbi5vdmVyd3JpdGVNZXRob2QgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgICB1dGlsLm92ZXJ3cml0ZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xuICB9O1xuXG4gIEFzc2VydGlvbi5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QgPSBmdW5jdGlvbiAobmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgICB1dGlsLm92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmFzc2VydChleHByZXNzaW9uLCBtZXNzYWdlLCBuZWdhdGVNZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBzaG93RGlmZilcbiAgICpcbiAgICogRXhlY3V0ZXMgYW4gZXhwcmVzc2lvbiBhbmQgY2hlY2sgZXhwZWN0YXRpb25zLiBUaHJvd3MgQXNzZXJ0aW9uRXJyb3IgZm9yIHJlcG9ydGluZyBpZiB0ZXN0IGRvZXNuJ3QgcGFzcy5cbiAgICpcbiAgICogQG5hbWUgYXNzZXJ0XG4gICAqIEBwYXJhbSB7UGhpbG9zb3BoaWNhbH0gZXhwcmVzc2lvbiB0byBiZSB0ZXN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1lc3NhZ2Ugb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBleHByZXNzaW9uIGZhaWxzXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBuZWdhdGVkTWVzc2FnZSBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbmVnYXRlZE1lc3NhZ2UgdG8gZGlzcGxheSBpZiBuZWdhdGVkIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWQgdmFsdWUgKHJlbWVtYmVyIHRvIGNoZWNrIGZvciBuZWdhdGlvbilcbiAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsIChvcHRpb25hbCkgd2lsbCBkZWZhdWx0IHRvIGB0aGlzLm9iamBcbiAgICogQHBhcmFtIHtCb29sZWFufSBzaG93RGlmZiAob3B0aW9uYWwpIHdoZW4gc2V0IHRvIGB0cnVlYCwgYXNzZXJ0IHdpbGwgZGlzcGxheSBhIGRpZmYgaW4gYWRkaXRpb24gdG8gdGhlIG1lc3NhZ2UgaWYgZXhwcmVzc2lvbiBmYWlsc1xuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgQXNzZXJ0aW9uLnByb3RvdHlwZS5hc3NlcnQgPSBmdW5jdGlvbiAoZXhwciwgbXNnLCBuZWdhdGVNc2csIGV4cGVjdGVkLCBfYWN0dWFsLCBzaG93RGlmZikge1xuICAgIHZhciBvayA9IHV0aWwudGVzdCh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChmYWxzZSAhPT0gc2hvd0RpZmYpIHNob3dEaWZmID0gdHJ1ZTtcbiAgICBpZiAodW5kZWZpbmVkID09PSBleHBlY3RlZCAmJiB1bmRlZmluZWQgPT09IF9hY3R1YWwpIHNob3dEaWZmID0gZmFsc2U7XG4gICAgaWYgKHRydWUgIT09IGNvbmZpZy5zaG93RGlmZikgc2hvd0RpZmYgPSBmYWxzZTtcblxuICAgIGlmICghb2spIHtcbiAgICAgIG1zZyA9IHV0aWwuZ2V0TWVzc2FnZSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdmFyIGFjdHVhbCA9IHV0aWwuZ2V0QWN0dWFsKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB2YXIgYXNzZXJ0aW9uRXJyb3JPYmplY3RQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgIGFjdHVhbDogYWN0dWFsXG4gICAgICAgICwgZXhwZWN0ZWQ6IGV4cGVjdGVkXG4gICAgICAgICwgc2hvd0RpZmY6IHNob3dEaWZmXG4gICAgICB9O1xuXG4gICAgICB2YXIgb3BlcmF0b3IgPSB1dGlsLmdldE9wZXJhdG9yKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAob3BlcmF0b3IpIHtcbiAgICAgICAgYXNzZXJ0aW9uRXJyb3JPYmplY3RQcm9wZXJ0aWVzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgbXNnLFxuICAgICAgICBhc3NlcnRpb25FcnJvck9iamVjdFByb3BlcnRpZXMsXG4gICAgICAgIChjb25maWcuaW5jbHVkZVN0YWNrKSA/IHRoaXMuYXNzZXJ0IDogZmxhZyh0aGlzLCAnc3NmaScpKTtcbiAgICB9XG4gIH07XG5cbiAgLyohXG4gICAqICMjIyAuX29ialxuICAgKlxuICAgKiBRdWljayByZWZlcmVuY2UgdG8gc3RvcmVkIGBhY3R1YWxgIHZhbHVlIGZvciBwbHVnaW4gZGV2ZWxvcGVycy5cbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3NlcnRpb24ucHJvdG90eXBlLCAnX29iaicsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZsYWcodGhpcywgJ29iamVjdCcpO1xuICAgICAgfVxuICAgICwgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIGZsYWcodGhpcywgJ29iamVjdCcsIHZhbCk7XG4gICAgICB9XG4gIH0pO1xufTtcbiIsICIvKiFcbiAqIGNoYWlcbiAqIGh0dHA6Ly9jaGFpanMuY29tXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2hhaSwgXykge1xuICB2YXIgQXNzZXJ0aW9uID0gY2hhaS5Bc3NlcnRpb25cbiAgICAsIEFzc2VydGlvbkVycm9yID0gY2hhaS5Bc3NlcnRpb25FcnJvclxuICAgICwgZmxhZyA9IF8uZmxhZztcblxuICAvKipcbiAgICogIyMjIExhbmd1YWdlIENoYWluc1xuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGFyZSBwcm92aWRlZCBhcyBjaGFpbmFibGUgZ2V0dGVycyB0byBpbXByb3ZlIHRoZSByZWFkYWJpbGl0eVxuICAgKiBvZiB5b3VyIGFzc2VydGlvbnMuXG4gICAqXG4gICAqICoqQ2hhaW5zKipcbiAgICpcbiAgICogLSB0b1xuICAgKiAtIGJlXG4gICAqIC0gYmVlblxuICAgKiAtIGlzXG4gICAqIC0gdGhhdFxuICAgKiAtIHdoaWNoXG4gICAqIC0gYW5kXG4gICAqIC0gaGFzXG4gICAqIC0gaGF2ZVxuICAgKiAtIHdpdGhcbiAgICogLSBhdFxuICAgKiAtIG9mXG4gICAqIC0gc2FtZVxuICAgKiAtIGJ1dFxuICAgKiAtIGRvZXNcbiAgICogLSBzdGlsbFxuICAgKiAtIGFsc29cbiAgICpcbiAgICogQG5hbWUgbGFuZ3VhZ2UgY2hhaW5zXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIFsgJ3RvJywgJ2JlJywgJ2JlZW4nLCAnaXMnXG4gICwgJ2FuZCcsICdoYXMnLCAnaGF2ZScsICd3aXRoJ1xuICAsICd0aGF0JywgJ3doaWNoJywgJ2F0JywgJ29mJ1xuICAsICdzYW1lJywgJ2J1dCcsICdkb2VzJywgJ3N0aWxsJywgXCJhbHNvXCIgXS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFpbikge1xuICAgIEFzc2VydGlvbi5hZGRQcm9wZXJ0eShjaGFpbik7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdFxuICAgKlxuICAgKiBOZWdhdGVzIGFsbCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbi5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7fSkudG8ubm90LnRocm93KCk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uYmUuYW4oJ2FycmF5JykudGhhdC5kb2VzLm5vdC5pbmNsdWRlKDMpO1xuICAgKlxuICAgKiBKdXN0IGJlY2F1c2UgeW91IGNhbiBuZWdhdGUgYW55IGFzc2VydGlvbiB3aXRoIGAubm90YCBkb2Vzbid0IG1lYW4geW91XG4gICAqIHNob3VsZC4gV2l0aCBncmVhdCBwb3dlciBjb21lcyBncmVhdCByZXNwb25zaWJpbGl0eS4gSXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCB0aGF0IHRoZSBvbmUgZXhwZWN0ZWQgb3V0cHV0IHdhcyBwcm9kdWNlZCwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nXG4gICAqIHRoYXQgb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIG91dHB1dHMgd2Fzbid0IHByb2R1Y2VkLiBTZWUgaW5kaXZpZHVhbFxuICAgKiBhc3NlcnRpb25zIGZvciBzcGVjaWZpYyBndWlkYW5jZS5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5ub3QuZXF1YWwoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBAbmFtZSBub3RcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdub3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnbmVnYXRlJywgdHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlZXBcbiAgICpcbiAgICogQ2F1c2VzIGFsbCBgLmVxdWFsYCwgYC5pbmNsdWRlYCwgYC5tZW1iZXJzYCwgYC5rZXlzYCwgYW5kIGAucHJvcGVydHlgXG4gICAqIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5IGluc3RlYWQgb2Ygc3RyaWN0XG4gICAqIChgPT09YCkgZXF1YWxpdHkuIFNlZSB0aGUgYGRlZXAtZXFsYCBwcm9qZWN0IHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXBcbiAgICogZXF1YWxpdHkgYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGVxdWFscyBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uZGVlcC5lcXVhbCh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmVxdWFsKHthOiAxfSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBpbmNsdWRlcyBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KFt7YTogMX1dKS50by5kZWVwLmluY2x1ZGUoe2E6IDF9KTtcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8ubm90LmluY2x1ZGUoe2E6IDF9KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBpbmNsdWRlcyBgeDoge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5kZWVwLmluY2x1ZGUoe3g6IHthOiAxfX0pO1xuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5ub3QuaW5jbHVkZSh7eDoge2E6IDF9fSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBoYXMgbWVtYmVyIGB7YTogMX1gXG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLmhhdmUuZGVlcC5tZW1iZXJzKFt7YTogMX1dKTtcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8ubm90LmhhdmUubWVtYmVycyhbe2E6IDF9XSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgc2V0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIGtleSBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5oYXZlLmRlZXAua2V5cyhbe2E6IDF9XSk7XG4gICAqICAgICBleHBlY3QobmV3IFNldChbe2E6IDF9XSkpLnRvLm5vdC5oYXZlLmtleXMoW3thOiAxfV0pO1xuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGhhcyBwcm9wZXJ0eSBgeDoge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5oYXZlLmRlZXAucHJvcGVydHkoJ3gnLCB7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdkZWVwJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ2RlZXAnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAubmVzdGVkXG4gICAqXG4gICAqIEVuYWJsZXMgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBpbiBhbGwgYC5wcm9wZXJ0eWAgYW5kIGAuaW5jbHVkZWBcbiAgICogYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4uXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IHtiOiBbJ3gnLCAneSddfX0pLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KCdhLmJbMV0nKTtcbiAgICogICAgIGV4cGVjdCh7YToge2I6IFsneCcsICd5J119fSkudG8ubmVzdGVkLmluY2x1ZGUoeydhLmJbMV0nOiAneSd9KTtcbiAgICpcbiAgICogSWYgYC5gIG9yIGBbXWAgYXJlIHBhcnQgb2YgYW4gYWN0dWFsIHByb3BlcnR5IG5hbWUsIHRoZXkgY2FuIGJlIGVzY2FwZWQgYnlcbiAgICogYWRkaW5nIHR3byBiYWNrc2xhc2hlcyBiZWZvcmUgdGhlbS5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7Jy5hJzogeydbYl0nOiAneCd9fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ1xcXFwuYS5cXFxcW2JcXFxcXScpO1xuICAgKiAgICAgZXhwZWN0KHsnLmEnOiB7J1tiXSc6ICd4J319KS50by5uZXN0ZWQuaW5jbHVkZSh7J1xcXFwuYS5cXFxcW2JcXFxcXSc6ICd4J30pO1xuICAgKlxuICAgKiBgLm5lc3RlZGAgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggYC5vd25gLlxuICAgKlxuICAgKiBAbmFtZSBuZXN0ZWRcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCduZXN0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnbmVzdGVkJywgdHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLm93blxuICAgKlxuICAgKiBDYXVzZXMgYWxsIGAucHJvcGVydHlgIGFuZCBgLmluY2x1ZGVgIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluXG4gICAqIHRvIGlnbm9yZSBpbmhlcml0ZWQgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLm93bi5wcm9wZXJ0eSgnYScpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmhhdmUub3duLnByb3BlcnR5KCdiJyk7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5vd24uaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZSh7YjogMn0pLmJ1dC5ub3Qub3duLmluY2x1ZGUoe2I6IDJ9KTtcbiAgICpcbiAgICogYC5vd25gIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGAubmVzdGVkYC5cbiAgICpcbiAgICogQG5hbWUgb3duXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnb3duJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ293bicsIHRydWUpO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5vcmRlcmVkXG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5tZW1iZXJzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byByZXF1aXJlIHRoYXRcbiAgICogbWVtYmVycyBiZSBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmhhdmUub3JkZXJlZC5tZW1iZXJzKFsxLCAyXSlcbiAgICogICAgICAgLmJ1dC5ub3QuaGF2ZS5vcmRlcmVkLm1lbWJlcnMoWzIsIDFdKTtcbiAgICpcbiAgICogV2hlbiBgLmluY2x1ZGVgIGFuZCBgLm9yZGVyZWRgIGFyZSBjb21iaW5lZCwgdGhlIG9yZGVyaW5nIGJlZ2lucyBhdCB0aGVcbiAgICogc3RhcnQgb2YgYm90aCBhcnJheXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhbMSwgMl0pXG4gICAqICAgICAgIC5idXQubm90LmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKFsyLCAzXSk7XG4gICAqXG4gICAqIEBuYW1lIG9yZGVyZWRcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdvcmRlcmVkJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ29yZGVyZWQnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuYW55XG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5rZXlzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byBvbmx5IHJlcXVpcmUgdGhhdFxuICAgKiB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlbiBrZXlzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZlxuICAgKiBgLmFsbGAsIHdoaWNoIHJlcXVpcmVzIHRoYXQgdGhlIHRhcmdldCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLm5vdC5oYXZlLmFueS5rZXlzKCdjJywgJ2QnKTtcbiAgICpcbiAgICogU2VlIHRoZSBgLmtleXNgIGRvYyBmb3IgZ3VpZGFuY2Ugb24gd2hlbiB0byB1c2UgYC5hbnlgIG9yIGAuYWxsYC5cbiAgICpcbiAgICogQG5hbWUgYW55XG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnYW55JywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ2FueScsIHRydWUpO1xuICAgIGZsYWcodGhpcywgJ2FsbCcsIGZhbHNlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuYWxsXG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5rZXlzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byByZXF1aXJlIHRoYXQgdGhlXG4gICAqIHRhcmdldCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cy4gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgYC5hbnlgLCB3aGljaFxuICAgKiBvbmx5IHJlcXVpcmVzIHRoYXQgdGhlIHRhcmdldCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW4ga2V5cy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoJ2EnLCAnYicpO1xuICAgKlxuICAgKiBOb3RlIHRoYXQgYC5hbGxgIGlzIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5laXRoZXIgYC5hbGxgIG5vciBgLmFueWAgYXJlXG4gICAqIGFkZGVkIGVhcmxpZXIgaW4gdGhlIGNoYWluLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYWRkIGAuYWxsYCBhbnl3YXlcbiAgICogYmVjYXVzZSBpdCBpbXByb3ZlcyByZWFkYWJpbGl0eS5cbiAgICpcbiAgICogU2VlIHRoZSBgLmtleXNgIGRvYyBmb3IgZ3VpZGFuY2Ugb24gd2hlbiB0byB1c2UgYC5hbnlgIG9yIGAuYWxsYC5cbiAgICpcbiAgICogQG5hbWUgYWxsXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnYWxsJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ2FsbCcsIHRydWUpO1xuICAgIGZsYWcodGhpcywgJ2FueScsIGZhbHNlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuYSh0eXBlWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQncyB0eXBlIGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBzdHJpbmcgYHR5cGVgLiBUeXBlc1xuICAgKiBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gU2VlIHRoZSBgdHlwZS1kZXRlY3RgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGVcbiAgICogdHlwZSBkZXRlY3Rpb24gYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL3R5cGUtZGV0ZWN0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmJlLmFuKCdvYmplY3QnKTtcbiAgICogICAgIGV4cGVjdChudWxsKS50by5iZS5hKCdudWxsJyk7XG4gICAqICAgICBleHBlY3QodW5kZWZpbmVkKS50by5iZS5hbigndW5kZWZpbmVkJyk7XG4gICAqICAgICBleHBlY3QobmV3IEVycm9yKS50by5iZS5hbignZXJyb3InKTtcbiAgICogICAgIGV4cGVjdChQcm9taXNlLnJlc29sdmUoKSkudG8uYmUuYSgncHJvbWlzZScpO1xuICAgKiAgICAgZXhwZWN0KG5ldyBGbG9hdDMyQXJyYXkpLnRvLmJlLmEoJ2Zsb2F0MzJhcnJheScpO1xuICAgKiAgICAgZXhwZWN0KFN5bWJvbCgpKS50by5iZS5hKCdzeW1ib2wnKTtcbiAgICpcbiAgICogYC5hYCBzdXBwb3J0cyBvYmplY3RzIHRoYXQgaGF2ZSBhIGN1c3RvbSB0eXBlIHNldCB2aWEgYFN5bWJvbC50b1N0cmluZ1RhZ2AuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7XG4gICAqICAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnbXlDdXN0b21UeXBlJ1xuICAgKiAgICAgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChteU9iaikudG8uYmUuYSgnbXlDdXN0b21UeXBlJykuYnV0Lm5vdC5hbignb2JqZWN0Jyk7XG4gICAqXG4gICAqIEl0J3Mgb2Z0ZW4gYmVzdCB0byB1c2UgYC5hYCB0byBjaGVjayBhIHRhcmdldCdzIHR5cGUgYmVmb3JlIG1ha2luZyBtb3JlXG4gICAqIGFzc2VydGlvbnMgb24gdGhlIHNhbWUgdGFyZ2V0LiBUaGF0IHdheSwgeW91IGF2b2lkIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZnJvbVxuICAgKiBhbnkgYXNzZXJ0aW9uIHRoYXQgZG9lcyBkaWZmZXJlbnQgdGhpbmdzIGJhc2VkIG9uIHRoZSB0YXJnZXQncyB0eXBlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uYmUuYW4oJ2FycmF5JykudGhhdC5pbmNsdWRlcygyKTtcbiAgICogICAgIGV4cGVjdChbXSkudG8uYmUuYW4oJ2FycmF5JykudGhhdC5pcy5lbXB0eTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5hYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgdGhlIGV4cGVjdGVkIHR5cGUsIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IGl0XG4gICAqIGlzbid0IG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdHlwZXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmJlLmEoJ3N0cmluZycpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuYmUuYW4oJ2FycmF5Jyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmFgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSB0b1xuICAgKiBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZFxuICAgKiBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5hKCdzdHJpbmcnLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmEoJ3N0cmluZycpO1xuICAgKlxuICAgKiBgLmFgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBsYW5ndWFnZSBjaGFpbiB0byBpbXByb3ZlIHRoZSByZWFkYWJpbGl0eSBvZlxuICAgKiB5b3VyIGFzc2VydGlvbnMuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5oYXZlLmEucHJvcGVydHkoJ2InKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuYWAuXG4gICAqXG4gICAqIEBuYW1lIGFcbiAgICogQGFsaWFzIGFuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhbiAodHlwZSwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgYXJ0aWNsZSA9IH5bICdhJywgJ2UnLCAnaScsICdvJywgJ3UnIF0uaW5kZXhPZih0eXBlLmNoYXJBdCgwKSkgPyAnYW4gJyA6ICdhICc7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdHlwZSA9PT0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSAnICsgYXJ0aWNsZSArIHR5cGVcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlICcgKyBhcnRpY2xlICsgdHlwZVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCdhbicsIGFuKTtcbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnYScsIGFuKTtcblxuICAvKipcbiAgICogIyMjIC5pbmNsdWRlKHZhbFssIG1zZ10pXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIHN0cmluZywgYC5pbmNsdWRlYCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHN0cmluZyBgdmFsYFxuICAgKiBpcyBhIHN1YnN0cmluZyBvZiB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5pbmNsdWRlKCdmb28nKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGFuIGFycmF5LCBgLmluY2x1ZGVgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYHZhbGAgaXMgYVxuICAgKiBtZW1iZXIgb2YgdGhlIHRhcmdldC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUoMik7XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhbiBvYmplY3QsIGAuaW5jbHVkZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3RcbiAgICogYHZhbGAncyBwcm9wZXJ0aWVzIGFyZSBhIHN1YnNldCBvZiB0aGUgdGFyZ2V0J3MgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMiwgYzogM30pLnRvLmluY2x1ZGUoe2E6IDEsIGI6IDJ9KTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgU2V0IG9yIFdlYWtTZXQsIGAuaW5jbHVkZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBgdmFsYCBpcyBhXG4gICAqIG1lbWJlciBvZiB0aGUgdGFyZ2V0LiBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobSBpcyB1c2VkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDJdKSkudG8uaW5jbHVkZSgyKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgTWFwLCBgLmluY2x1ZGVgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYHZhbGAgaXMgb25lIG9mXG4gICAqIHRoZSB2YWx1ZXMgb2YgdGhlIHRhcmdldC4gU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG0gaXMgdXNlZC5cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl1dKSkudG8uaW5jbHVkZSgyKTtcbiAgICpcbiAgICogQmVjYXVzZSBgLmluY2x1ZGVgIGRvZXMgZGlmZmVyZW50IHRoaW5ncyBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgdHlwZSwgaXQnc1xuICAgKiBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIHRhcmdldCdzIHR5cGUgYmVmb3JlIHVzaW5nIGAuaW5jbHVkZWAuIFNlZSB0aGUgYC5hYFxuICAgKiBkb2MgZm9yIGluZm8gb24gdGVzdGluZyBhIHRhcmdldCdzIHR5cGUuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5iZS5hbignYXJyYXknKS50aGF0LmluY2x1ZGVzKDIpO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzdHJpY3QgKGA9PT1gKSBlcXVhbGl0eSBpcyB1c2VkIHRvIGNvbXBhcmUgYXJyYXkgbWVtYmVycyBhbmRcbiAgICogb2JqZWN0IHByb3BlcnRpZXMuIEFkZCBgLmRlZXBgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5XG4gICAqIGluc3RlYWQgKFdlYWtTZXQgdGFyZ2V0cyBhcmUgbm90IHN1cHBvcnRlZCkuIFNlZSB0aGUgYGRlZXAtZXFsYCBwcm9qZWN0XG4gICAqIHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaW5jbHVkZXMgYHthOiAxfWBcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8uZGVlcC5pbmNsdWRlKHthOiAxfSk7XG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLm5vdC5pbmNsdWRlKHthOiAxfSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaW5jbHVkZXMgYHg6IHthOiAxfWBcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uZGVlcC5pbmNsdWRlKHt4OiB7YTogMX19KTtcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8ubm90LmluY2x1ZGUoe3g6IHthOiAxfX0pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHRhcmdldCdzIHByb3BlcnRpZXMgYXJlIHNlYXJjaGVkIHdoZW4gd29ya2luZyB3aXRoXG4gICAqIG9iamVjdHMuIFRoaXMgaW5jbHVkZXMgcHJvcGVydGllcyB0aGF0IGFyZSBpbmhlcml0ZWQgYW5kL29yIG5vbi1lbnVtZXJhYmxlLlxuICAgKiBBZGQgYC5vd25gIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGV4Y2x1ZGUgdGhlIHRhcmdldCdzIGluaGVyaXRlZFxuICAgKiBwcm9wZXJ0aWVzIGZyb20gdGhlIHNlYXJjaC5cbiAgICpcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5vd24uaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZSh7YjogMn0pLmJ1dC5ub3Qub3duLmluY2x1ZGUoe2I6IDJ9KTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGEgdGFyZ2V0IG9iamVjdCBpcyBhbHdheXMgb25seSBzZWFyY2hlZCBmb3IgYHZhbGAncyBvd25cbiAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBgLmRlZXBgIGFuZCBgLm93bmAgY2FuIGJlIGNvbWJpbmVkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogMn19KS50by5kZWVwLm93bi5pbmNsdWRlKHthOiB7YjogMn19KTtcbiAgICpcbiAgICogQWRkIGAubmVzdGVkYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBlbmFibGUgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiB3aGVuXG4gICAqIHJlZmVyZW5jaW5nIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5uZXN0ZWQuaW5jbHVkZSh7J2EuYlsxXSc6ICd5J30pO1xuICAgKlxuICAgKiBJZiBgLmAgb3IgYFtdYCBhcmUgcGFydCBvZiBhbiBhY3R1YWwgcHJvcGVydHkgbmFtZSwgdGhleSBjYW4gYmUgZXNjYXBlZCBieVxuICAgKiBhZGRpbmcgdHdvIGJhY2tzbGFzaGVzIGJlZm9yZSB0aGVtLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHsnLmEnOiB7J1tiXSc6IDJ9fSkudG8ubmVzdGVkLmluY2x1ZGUoeydcXFxcLmEuXFxcXFtiXFxcXF0nOiAyfSk7XG4gICAqXG4gICAqIGAuZGVlcGAgYW5kIGAubmVzdGVkYCBjYW4gYmUgY29tYmluZWQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IHtiOiBbe2M6IDN9XX19KS50by5kZWVwLm5lc3RlZC5pbmNsdWRlKHsnYS5iWzBdJzoge2M6IDN9fSk7XG4gICAqXG4gICAqIGAub3duYCBhbmQgYC5uZXN0ZWRgIGNhbm5vdCBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5pbmNsdWRlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8ubm90LmluY2x1ZGUoJ3RhY28nKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLm5vdC5pbmNsdWRlKDQpO1xuICAgKlxuICAgKiBIb3dldmVyLCBpdCdzIGRhbmdlcm91cyB0byBuZWdhdGUgYC5pbmNsdWRlYCB3aGVuIHRoZSB0YXJnZXQgaXMgYW4gb2JqZWN0LlxuICAgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9ucyBieSBhc3NlcnRpbmcgdGhhdCB0aGVcbiAgICogdGFyZ2V0IG9iamVjdCBkb2Vzbid0IGhhdmUgYWxsIG9mIGB2YWxgJ3Mga2V5L3ZhbHVlIHBhaXJzIGJ1dCBtYXkgb3IgbWF5XG4gICAqIG5vdCBoYXZlIHNvbWUgb2YgdGhlbS4gSXQncyBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzXG4gICAqIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBvYmplY3QgaXNuJ3QgZXZlbiBleHBlY3RlZCB0byBoYXZlIGB2YWxgJ3Mga2V5cywgaXQnc1xuICAgKiBvZnRlbiBiZXN0IHRvIGFzc2VydCBleGFjdGx5IHRoYXQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2M6IDN9KS50by5ub3QuaGF2ZS5hbnkua2V5cygnYScsICdiJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2M6IDN9KS50by5ub3QuaW5jbHVkZSh7YTogMSwgYjogMn0pOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IG9iamVjdCBpcyBleHBlY3RlZCB0byBoYXZlIGB2YWxgJ3Mga2V5cywgaXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCB0aGF0IGVhY2ggb2YgdGhlIHByb3BlcnRpZXMgaGFzIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyIHRoYW5cbiAgICogYXNzZXJ0aW5nIHRoYXQgZWFjaCBwcm9wZXJ0eSBkb2Vzbid0IGhhdmUgb25lIG9mIG1hbnkgdW5leHBlY3RlZCB2YWx1ZXMuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDMsIGI6IDR9KS50by5pbmNsdWRlKHthOiAzLCBiOiA0fSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDMsIGI6IDR9KS50by5ub3QuaW5jbHVkZSh7YTogMSwgYjogMn0pOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5pbmNsdWRlYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlKDQsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10sICdub29vIHdoeSBmYWlsPz8nKS50by5pbmNsdWRlKDQpO1xuICAgKlxuICAgKiBgLmluY2x1ZGVgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBsYW5ndWFnZSBjaGFpbiwgY2F1c2luZyBhbGwgYC5tZW1iZXJzYCBhbmRcbiAgICogYC5rZXlzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byByZXF1aXJlIHRoZSB0YXJnZXQgdG8gYmUgYVxuICAgKiBzdXBlcnNldCBvZiB0aGUgZXhwZWN0ZWQgc2V0LCByYXRoZXIgdGhhbiBhbiBpZGVudGljYWwgc2V0LiBOb3RlIHRoYXRcbiAgICogYC5tZW1iZXJzYCBpZ25vcmVzIGR1cGxpY2F0ZXMgaW4gdGhlIHN1YnNldCB3aGVuIGAuaW5jbHVkZWAgaXMgYWRkZWQuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0J3Mga2V5cyBhcmUgYSBzdXBlcnNldCBvZiBbJ2EnLCAnYiddIGJ1dCBub3QgaWRlbnRpY2FsXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDIsIGM6IDN9KS50by5pbmNsdWRlLmFsbC5rZXlzKCdhJywgJ2InKTtcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMiwgYzogM30pLnRvLm5vdC5oYXZlLmFsbC5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBpcyBhIHN1cGVyc2V0IG9mIFsxLCAyXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaW5jbHVkZS5tZW1iZXJzKFsxLCAyXSk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5ub3QuaGF2ZS5tZW1iZXJzKFsxLCAyXSk7XG4gICAqXG4gICAqICAgICAvLyBEdXBsaWNhdGVzIGluIHRoZSBzdWJzZXQgYXJlIGlnbm9yZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUubWVtYmVycyhbMSwgMiwgMiwgMl0pO1xuICAgKlxuICAgKiBOb3RlIHRoYXQgYWRkaW5nIGAuYW55YCBlYXJsaWVyIGluIHRoZSBjaGFpbiBjYXVzZXMgdGhlIGAua2V5c2AgYXNzZXJ0aW9uXG4gICAqIHRvIGlnbm9yZSBgLmluY2x1ZGVgLlxuICAgKlxuICAgKiAgICAgLy8gQm90aCBhc3NlcnRpb25zIGFyZSBpZGVudGljYWxcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmluY2x1ZGUuYW55LmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5hbnkua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAuaW5jbHVkZXNgLCBgLmNvbnRhaW5gLCBhbmQgYC5jb250YWluc2AgY2FuIGJlIHVzZWRcbiAgICogaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5pbmNsdWRlYC5cbiAgICpcbiAgICogQG5hbWUgaW5jbHVkZVxuICAgKiBAYWxpYXMgY29udGFpblxuICAgKiBAYWxpYXMgaW5jbHVkZXNcbiAgICogQGFsaWFzIGNvbnRhaW5zXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gU2FtZVZhbHVlWmVybyhhLCBiKSB7XG4gICAgcmV0dXJuIChfLmlzTmFOKGEpICYmIF8uaXNOYU4oYikpIHx8IGEgPT09IGI7XG4gIH1cblxuICBmdW5jdGlvbiBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvciAoKSB7XG4gICAgZmxhZyh0aGlzLCAnY29udGFpbnMnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluY2x1ZGUgKHZhbCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG5cbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBuZWdhdGUgPSBmbGFnKHRoaXMsICduZWdhdGUnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIGlzRGVlcCA9IGZsYWcodGhpcywgJ2RlZXAnKVxuICAgICAgLCBkZXNjcmlwdG9yID0gaXNEZWVwID8gJ2RlZXAgJyA6ICcnO1xuXG4gICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuXG4gICAgdmFyIGluY2x1ZGVkID0gZmFsc2U7XG5cbiAgICBzd2l0Y2ggKG9ialR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd3ZWFrc2V0JzpcbiAgICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICAgIGZsYWdNc2cgKyAndW5hYmxlIHRvIHVzZSAuZGVlcC5pbmNsdWRlIHdpdGggV2Vha1NldCcsXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBzc2ZpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluY2x1ZGVkID0gb2JqLmhhcyh2YWwpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbWFwJzpcbiAgICAgICAgdmFyIGlzRXFsID0gaXNEZWVwID8gXy5lcWwgOiBTYW1lVmFsdWVaZXJvO1xuICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIGluY2x1ZGVkID0gaW5jbHVkZWQgfHwgaXNFcWwoaXRlbSwgdmFsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzZXQnOlxuICAgICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgICAgb2JqLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGluY2x1ZGVkID0gaW5jbHVkZWQgfHwgXy5lcWwoaXRlbSwgdmFsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IG9iai5oYXModmFsKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgICAgaW5jbHVkZWQgPSBvYmouc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIF8uZXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IG9iai5pbmRleE9mKHZhbCkgIT09IC0xO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBUaGlzIGJsb2NrIGlzIGZvciBhc3NlcnRpbmcgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAgICAgIC8vIGBfLmV4cGVjdFR5cGVzYCBpc24ndCB1c2VkIGhlcmUgYmVjYXVzZSBgLmluY2x1ZGVgIHNob3VsZCB3b3JrIHdpdGhcbiAgICAgICAgLy8gb2JqZWN0cyB3aXRoIGEgY3VzdG9tIGBAQHRvU3RyaW5nVGFnYC5cbiAgICAgICAgaWYgKHZhbCAhPT0gT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgICBmbGFnTXNnICsgJ3RoZSBnaXZlbiBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMgKCdcbiAgICAgICAgICAgICsgb2JqVHlwZSArICcgYW5kICdcbiAgICAgICAgICAgICsgXy50eXBlKHZhbCkudG9Mb3dlckNhc2UoKSArICcpJ1xuICAgICAgICAgICAgKyAnIGlzIGludmFsaWQgZm9yIHRoaXMgYXNzZXJ0aW9uLiAnXG4gICAgICAgICAgICArICdZb3UgY2FuIHVzZSBhbiBhcnJheSwgYSBtYXAsIGFuIG9iamVjdCwgYSBzZXQsIGEgc3RyaW5nLCAnXG4gICAgICAgICAgICArICdvciBhIHdlYWtzZXQgaW5zdGVhZCBvZiBhICdcbiAgICAgICAgICAgICsgXy50eXBlKHZhbCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzZmlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb3BzID0gT2JqZWN0LmtleXModmFsKVxuICAgICAgICAgICwgZmlyc3RFcnIgPSBudWxsXG4gICAgICAgICAgLCBudW1FcnJzID0gMDtcblxuICAgICAgICBwcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgdmFyIHByb3BBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKG9iaik7XG4gICAgICAgICAgXy50cmFuc2ZlckZsYWdzKHRoaXMsIHByb3BBc3NlcnRpb24sIHRydWUpO1xuICAgICAgICAgIGZsYWcocHJvcEFzc2VydGlvbiwgJ2xvY2tTc2ZpJywgdHJ1ZSk7XG5cbiAgICAgICAgICBpZiAoIW5lZ2F0ZSB8fCBwcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHByb3BBc3NlcnRpb24ucHJvcGVydHkocHJvcCwgdmFsW3Byb3BdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFfLmNoZWNrRXJyb3IuY29tcGF0aWJsZUNvbnN0cnVjdG9yKGVyciwgQXNzZXJ0aW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdEVyciA9PT0gbnVsbCkgZmlyc3RFcnIgPSBlcnI7XG4gICAgICAgICAgICBudW1FcnJzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICAvLyBXaGVuIHZhbGlkYXRpbmcgLm5vdC5pbmNsdWRlIHdpdGggbXVsdGlwbGUgcHJvcGVydGllcywgd2Ugb25seSB3YW50XG4gICAgICAgIC8vIHRvIHRocm93IGFuIGFzc2VydGlvbiBlcnJvciBpZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgYXJlIGluY2x1ZGVkLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIHRocm93IHRoZSBmaXJzdCBwcm9wZXJ0eSBhc3NlcnRpb24gZXJyb3IgdGhhdCB3ZVxuICAgICAgICAvLyBlbmNvdW50ZXJlZC5cbiAgICAgICAgaWYgKG5lZ2F0ZSAmJiBwcm9wcy5sZW5ndGggPiAxICYmIG51bUVycnMgPT09IHByb3BzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IGZpcnN0RXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBc3NlcnQgaW5jbHVzaW9uIGluIGNvbGxlY3Rpb24gb3Igc3Vic3RyaW5nIGluIGEgc3RyaW5nLlxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaW5jbHVkZWRcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gJyArIGRlc2NyaXB0b3IgKyAnaW5jbHVkZSAnICsgXy5pbnNwZWN0KHZhbClcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90ICcgKyBkZXNjcmlwdG9yICsgJ2luY2x1ZGUgJyArIF8uaW5zcGVjdCh2YWwpKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2luY2x1ZGUnLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2NvbnRhaW4nLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2NvbnRhaW5zJywgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuICBBc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCdpbmNsdWRlcycsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcblxuICAvKipcbiAgICogIyMjIC5va1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIHRydXRoeSB2YWx1ZSAoY29uc2lkZXJlZCBgdHJ1ZWAgaW4gYm9vbGVhbiBjb250ZXh0KS5cbiAgICogSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBvclxuICAgKiBkZWVwbHkgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlKS50by5iZS50cnVlOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHRydWUpLnRvLmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5va2AuXG4gICAqXG4gICAqICAgICBleHBlY3QoMCkudG8uZXF1YWwoMCk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMCkudG8ubm90LmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSkudG8uYmUuZmFsc2U7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoZmFsc2UpLnRvLm5vdC5iZS5vazsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QobnVsbCkudG8uYmUubnVsbDsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChudWxsKS50by5ub3QuYmUub2s7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8uYmUudW5kZWZpbmVkOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8ubm90LmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLm9rO1xuICAgKlxuICAgKiBAbmFtZSBva1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ29rJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB0cnV0aHknXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5Jyk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLnRydWVcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QodHJ1ZSkudG8uYmUudHJ1ZTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC50cnVlYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhbiBub3RcbiAgICogZXF1YWwgdG8gYHRydWVgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZhbHNlKS50by5iZS5mYWxzZTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChmYWxzZSkudG8ubm90LmJlLnRydWU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5iZS50cnVlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLnRydWU7XG4gICAqXG4gICAqIEBuYW1lIHRydWVcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCd0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICB0cnVlID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB0cnVlJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzZSdcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyBmYWxzZSA6IHRydWVcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5mYWxzZVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBzdHJpY3RseSAoYD09PWApIGVxdWFsIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoZmFsc2UpLnRvLmJlLmZhbHNlO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmZhbHNlYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlKS50by5iZS50cnVlOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHRydWUpLnRvLm5vdC5iZS5mYWxzZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLmZhbHNlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZmFsc2U7XG4gICAqXG4gICAqIEBuYW1lIGZhbHNlXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGZhbHNlID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzZSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZSdcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyB0cnVlIDogZmFsc2VcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5udWxsXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0cmljdGx5IChgPT09YCkgZXF1YWwgdG8gYG51bGxgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG51bGwpLnRvLmJlLm51bGw7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubnVsbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyIHRoYW4gbm90XG4gICAqIGVxdWFsIHRvIGBudWxsYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUubnVsbDsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5udWxsO1xuICAgKlxuICAgKiBAbmFtZSBudWxsXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbnVsbCA9PT0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgbnVsbCdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIG51bGwnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAudW5kZWZpbmVkXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0cmljdGx5IChgPT09YCkgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICBleHBlY3QodW5kZWZpbmVkKS50by5iZS51bmRlZmluZWQ7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAudW5kZWZpbmVkYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLnVuZGVmaW5lZDsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS51bmRlZmluZWQ7XG4gICAqXG4gICAqIEBuYW1lIHVuZGVmaW5lZFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ3VuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdW5kZWZpbmVkID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWQnXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSB1bmRlZmluZWQnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuTmFOXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGV4YWN0bHkgYE5hTmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoTmFOKS50by5iZS5OYU47XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuTmFOYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhbiBub3RcbiAgICogZXF1YWwgdG8gYE5hTmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmVxdWFsKCdmb28nKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8ubm90LmJlLk5hTjsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5OYU47XG4gICAqXG4gICAqIEBuYW1lIE5hTlxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ05hTicsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgXy5pc05hTihmbGFnKHRoaXMsICdvYmplY3QnKSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBOYU4nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIE5hTidcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5leGlzdFxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBub3Qgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBlaXRoZXIgYG51bGxgIG9yXG4gICAqIGB1bmRlZmluZWRgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0b1xuICAgKiBpdHMgZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uZXhpc3Q7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KDApLnRvLmVxdWFsKDApOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDApLnRvLmV4aXN0OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5leGlzdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QobnVsbCkudG8uYmUubnVsbDsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChudWxsKS50by5ub3QuZXhpc3Q7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8uYmUudW5kZWZpbmVkOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8ubm90LmV4aXN0OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChudWxsLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uZXhpc3Q7XG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmV4aXN0c2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5leGlzdGAuXG4gICAqXG4gICAqIEBuYW1lIGV4aXN0XG4gICAqIEBhbGlhcyBleGlzdHNcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0RXhpc3QgKCkge1xuICAgIHZhciB2YWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKTtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGV4aXN0J1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZXhpc3QnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZXhpc3QnLCBhc3NlcnRFeGlzdCk7XG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZXhpc3RzJywgYXNzZXJ0RXhpc3QpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmVtcHR5XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIHN0cmluZyBvciBhcnJheSwgYC5lbXB0eWAgYXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQnc1xuICAgKiBgbGVuZ3RoYCBwcm9wZXJ0eSBpcyBzdHJpY3RseSAoYD09PWApIGVxdWFsIHRvIGAwYC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbXSkudG8uYmUuZW1wdHk7XG4gICAqICAgICBleHBlY3QoJycpLnRvLmJlLmVtcHR5O1xuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBtYXAgb3Igc2V0LCBgLmVtcHR5YCBhc3NlcnRzIHRoYXQgdGhlIHRhcmdldCdzIGBzaXplYFxuICAgKiBwcm9wZXJ0eSBpcyBzdHJpY3RseSBlcXVhbCB0byBgMGAuXG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IFNldCgpKS50by5iZS5lbXB0eTtcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKCkpLnRvLmJlLmVtcHR5O1xuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBgLmVtcHR5YCBhc3NlcnRzIHRoYXQgdGhlIHRhcmdldFxuICAgKiBkb2Vzbid0IGhhdmUgYW55IG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIFByb3BlcnRpZXMgd2l0aCBTeW1ib2wtYmFzZWRcbiAgICoga2V5cyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgY291bnQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe30pLnRvLmJlLmVtcHR5O1xuICAgKlxuICAgKiBCZWNhdXNlIGAuZW1wdHlgIGRvZXMgZGlmZmVyZW50IHRoaW5ncyBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgdHlwZSwgaXQnc1xuICAgKiBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIHRhcmdldCdzIHR5cGUgYmVmb3JlIHVzaW5nIGAuZW1wdHlgLiBTZWUgdGhlIGAuYWBcbiAgICogZG9jIGZvciBpbmZvIG9uIHRlc3RpbmcgYSB0YXJnZXQncyB0eXBlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFtdKS50by5iZS5hbignYXJyYXknKS50aGF0LmlzLmVtcHR5O1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmVtcHR5YC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgY29udGFpbnMgaXRzIGV4cGVjdGVkIG51bWJlciBvZiB2YWx1ZXMsXG4gICAqIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IGl0J3Mgbm90IGVtcHR5LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLm5vdC5iZS5lbXB0eTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IFNldChbMSwgMiwgM10pKS50by5oYXZlLnByb3BlcnR5KCdzaXplJywgMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QobmV3IFNldChbMSwgMiwgM10pKS50by5ub3QuYmUuZW1wdHk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHthOiAxfSkpLnRvLmhhdmUubGVuZ3RoT2YoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuYmUuZW1wdHk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmVtcHR5O1xuICAgKlxuICAgKiBAbmFtZSBlbXB0eVxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2VtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgaXRlbXNDb3VudDtcblxuICAgIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgOiAnJztcblxuICAgIHN3aXRjaCAoXy50eXBlKHZhbCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgaXRlbXNDb3VudCA9IHZhbC5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWFwJzpcbiAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgIGl0ZW1zQ291bnQgPSB2YWwuc2l6ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3ZWFrbWFwJzpcbiAgICAgIGNhc2UgJ3dlYWtzZXQnOlxuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArICcuZW1wdHkgd2FzIHBhc3NlZCBhIHdlYWsgY29sbGVjdGlvbicsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHNzZmlcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgdmFyIG1zZyA9IGZsYWdNc2cgKyAnLmVtcHR5IHdhcyBwYXNzZWQgYSBmdW5jdGlvbiAnICsgXy5nZXROYW1lKHZhbCk7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtc2cudHJpbSgpLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHZhbCAhPT0gT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgICBmbGFnTXNnICsgJy5lbXB0eSB3YXMgcGFzc2VkIG5vbi1zdHJpbmcgcHJpbWl0aXZlICcgKyBfLmluc3BlY3QodmFsKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzZmlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW1zQ291bnQgPSBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aDtcbiAgICB9XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgMCA9PT0gaXRlbXNDb3VudFxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBlbXB0eSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIGVtcHR5J1xuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmFyZ3VtZW50c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiB0ZXN0ICgpIHtcbiAgICogICAgICAgZXhwZWN0KGFyZ3VtZW50cykudG8uYmUuYXJndW1lbnRzO1xuICAgKiAgICAgfVxuICAgKlxuICAgKiAgICAgdGVzdCgpO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmFyZ3VtZW50c2AuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW5cbiAgICogYmVzdCB0byBhc3NlcnQgd2hpY2ggdHlwZSB0aGUgdGFyZ2V0IGlzIGV4cGVjdGVkIHRvIGJlLCByYXRoZXIgdGhhblxuICAgKiBhc3NlcnRpbmcgdGhhdCBpdFx1MjAxOXMgbm90IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uYmUuYSgnc3RyaW5nJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLm5vdC5iZS5hcmd1bWVudHM7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHt9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYXJndW1lbnRzO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5Bcmd1bWVudHNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuYXJndW1lbnRzYC5cbiAgICpcbiAgICogQG5hbWUgYXJndW1lbnRzXG4gICAqIEBhbGlhcyBBcmd1bWVudHNcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gY2hlY2tBcmd1bWVudHMgKCkge1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCB0eXBlID0gXy50eXBlKG9iaik7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICdBcmd1bWVudHMnID09PSB0eXBlXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGFyZ3VtZW50cyBidXQgZ290ICcgKyB0eXBlXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhcmd1bWVudHMnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnYXJndW1lbnRzJywgY2hlY2tBcmd1bWVudHMpO1xuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ0FyZ3VtZW50cycsIGNoZWNrQXJndW1lbnRzKTtcblxuICAvKipcbiAgICogIyMjIC5lcXVhbCh2YWxbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBzdHJpY3RseSAoYD09PWApIGVxdWFsIHRvIHRoZSBnaXZlbiBgdmFsYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTtcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uZXF1YWwoJ2ZvbycpO1xuICAgKlxuICAgKiBBZGQgYC5kZWVwYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byB1c2UgZGVlcCBlcXVhbGl0eSBpbnN0ZWFkLiBTZWUgdGhlXG4gICAqIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBlcXVhbHMgYHthOiAxfWBcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmRlZXAuZXF1YWwoe2E6IDF9KTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLm5vdC5lcXVhbCh7YTogMX0pO1xuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgZXF1YWxzIGBbMSwgMl1gXG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5kZWVwLmVxdWFsKFsxLCAyXSk7XG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5ub3QuZXF1YWwoWzEsIDJdKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5lcXVhbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW5cbiAgICogYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyIHRoYW5cbiAgICogbm90IGVxdWFsIHRvIG9uZSBvZiBjb3VudGxlc3MgdW5leHBlY3RlZCB2YWx1ZXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmVxdWFsKDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5lcXVhbGAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDIsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uZXF1YWwoMik7XG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAuZXF1YWxzYCBhbmQgYGVxYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmVxdWFsYC5cbiAgICpcbiAgICogQG5hbWUgZXF1YWxcbiAgICogQGFsaWFzIGVxdWFsc1xuICAgKiBAYWxpYXMgZXFcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRFcXVhbCAodmFsLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgaWYgKGZsYWcodGhpcywgJ2RlZXAnKSkge1xuICAgICAgdmFyIHByZXZMb2NrU3NmaSA9IGZsYWcodGhpcywgJ2xvY2tTc2ZpJyk7XG4gICAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIHRydWUpO1xuICAgICAgdGhpcy5lcWwodmFsKTtcbiAgICAgIGZsYWcodGhpcywgJ2xvY2tTc2ZpJywgcHJldkxvY2tTc2ZpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgdmFsID09PSBvYmpcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfSdcbiAgICAgICAgLCB2YWxcbiAgICAgICAgLCB0aGlzLl9vYmpcbiAgICAgICAgLCB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxdWFsJywgYXNzZXJ0RXF1YWwpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdlcXVhbHMnLCBhc3NlcnRFcXVhbCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxJywgYXNzZXJ0RXF1YWwpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmVxbChvYmpbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBkZWVwbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGBvYmpgLiBTZWUgdGhlXG4gICAqIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgaXMgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBlcXVhbCB0byB7YTogMX1cbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YTogMX0pLmJ1dC5ub3QuZXF1YWwoe2E6IDF9KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBpcyBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGVxdWFsIHRvIFsxLCAyXVxuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uZXFsKFsxLCAyXSkuYnV0Lm5vdC5lcXVhbChbMSwgMl0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmVxbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGRlZXBseSBlcXVhbCB0byBpdHMgZXhwZWN0ZWQgdmFsdWUsIHJhdGhlclxuICAgKiB0aGFuIG5vdCBkZWVwbHkgZXF1YWwgdG8gb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIHZhbHVlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YTogMX0pOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmVxbCh7YjogMn0pOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5lcWxgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlXG4gICAqIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YjogMn0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5lcWwoe2I6IDJ9KTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuZXFsc2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5lcWxgLlxuICAgKlxuICAgKiBUaGUgYC5kZWVwLmVxdWFsYCBhc3NlcnRpb24gaXMgYWxtb3N0IGlkZW50aWNhbCB0byBgLmVxbGAgYnV0IHdpdGggb25lXG4gICAqIGRpZmZlcmVuY2U6IGAuZGVlcC5lcXVhbGAgY2F1c2VzIGRlZXAgZXF1YWxpdHkgY29tcGFyaXNvbnMgdG8gYWxzbyBiZSB1c2VkXG4gICAqIGZvciBhbnkgb3RoZXIgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4uXG4gICAqXG4gICAqIEBuYW1lIGVxbFxuICAgKiBAYWxpYXMgZXFsc1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBfLmVxbChvYmosIGZsYWcodGhpcywgJ29iamVjdCcpKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgI3tleHB9J1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZGVlcGx5IGVxdWFsICN7ZXhwfSdcbiAgICAgICwgb2JqXG4gICAgICAsIHRoaXMuX29ialxuICAgICAgLCB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxbCcsIGFzc2VydEVxbCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxbHMnLCBhc3NlcnRFcWwpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmFib3ZlKG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LlxuICAgKiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0byBpdHMgZXhwZWN0ZWRcbiAgICogdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uZXF1YWwoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYWJvdmUoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgXG4gICAqIG9yIGBzaXplYCBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG51bWJlciBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmFib3ZlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmFib3ZlYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYWJvdmUoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5hYm92ZSgyKTtcbiAgICpcbiAgICogVGhlIGFsaWFzZXMgYC5ndGAgYW5kIGAuZ3JlYXRlclRoYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAuYWJvdmVgLlxuICAgKlxuICAgKiBAbmFtZSBhYm92ZVxuICAgKiBAYWxpYXMgZ3RcbiAgICogQGFsaWFzIGdyZWF0ZXJUaGFuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRBYm92ZSAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZXJyb3JNZXNzYWdlXG4gICAgICAsIHNob3VsZFRocm93ID0gdHJ1ZTtcblxuICAgIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSAnbWFwJyAmJiBvYmpUeXBlICE9PSAnc2V0Jykge1xuICAgICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkoJ2xlbmd0aCcpO1xuICAgIH1cblxuICAgIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgPT09ICdkYXRlJyAmJiBuVHlwZSAhPT0gJ2RhdGUnKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBhYm92ZSBtdXN0IGJlIGEgZGF0ZSc7XG4gICAgfSBlbHNlIGlmIChuVHlwZSAhPT0gJ251bWJlcicgJiYgKGRvTGVuZ3RoIHx8IG9ialR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBhYm92ZSBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gJ2RhdGUnICYmIG9ialR5cGUgIT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHByaW50T2JqID0gKG9ialR5cGUgPT09ICdzdHJpbmcnKSA/IFwiJ1wiICsgb2JqICsgXCInXCIgOiBvYmo7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAnZXhwZWN0ZWQgJyArIHByaW50T2JqICsgJyB0byBiZSBhIG51bWJlciBvciBhIGRhdGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICB9XG5cbiAgICBpZiAoZG9MZW5ndGgpIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gJ2xlbmd0aCdcbiAgICAgICAgLCBpdGVtc0NvdW50O1xuICAgICAgaWYgKG9ialR5cGUgPT09ICdtYXAnIHx8IG9ialR5cGUgPT09ICdzZXQnKSB7XG4gICAgICAgIGRlc2NyaXB0b3IgPSAnc2l6ZSc7XG4gICAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgaXRlbXNDb3VudCA+IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIGFib3ZlICN7ZXhwfSBidXQgZ290ICN7YWN0fSdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyBhYm92ZSAje2V4cH0nXG4gICAgICAgICwgblxuICAgICAgICAsIGl0ZW1zQ291bnRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA+IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhYm92ZSAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbW9zdCAje2V4cH0nXG4gICAgICAgICwgblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdhYm92ZScsIGFzc2VydEFib3ZlKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZ3QnLCBhc3NlcnRBYm92ZSk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2dyZWF0ZXJUaGFuJywgYXNzZXJ0QWJvdmUpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmxlYXN0KG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlblxuICAgKiBudW1iZXIgb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0b1xuICAgKiBpdHMgZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uZXF1YWwoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYXQubGVhc3QoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLmF0LmxlYXN0KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubGVuZ3RoT2ZgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQncyBgbGVuZ3RoYFxuICAgKiBvciBgc2l6ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIgYG5gLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mLmF0LmxlYXN0KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmF0LmxlYXN0KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5sZWFzdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLmF0LmxlYXN0KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5sZWFzdGAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmF0LmxlYXN0KDIsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYXQubGVhc3QoMik7XG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAuZ3RlYCBhbmQgYC5ncmVhdGVyVGhhbk9yRXF1YWxgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAubGVhc3RgLlxuICAgKlxuICAgKiBAbmFtZSBsZWFzdFxuICAgKiBAYWxpYXMgZ3RlXG4gICAqIEBhbGlhcyBncmVhdGVyVGhhbk9yRXF1YWxcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydExlYXN0IChuLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZG9MZW5ndGggPSBmbGFnKHRoaXMsICdkb0xlbmd0aCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgbXNnUHJlZml4ID0gKChmbGFnTXNnKSA/IGZsYWdNc2cgKyAnOiAnIDogJycpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopLnRvTG93ZXJDYXNlKClcbiAgICAgICwgblR5cGUgPSBfLnR5cGUobikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBlcnJvck1lc3NhZ2VcbiAgICAgICwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuXG4gICAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09ICdtYXAnICYmIG9ialR5cGUgIT09ICdzZXQnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIG5UeXBlICE9PSAnZGF0ZScpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlJztcbiAgICB9IGVsc2UgaWYgKG5UeXBlICE9PSAnbnVtYmVyJyAmJiAoZG9MZW5ndGggfHwgb2JqVHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBudW1iZXInO1xuICAgIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSAnZGF0ZScgJiYgb2JqVHlwZSAhPT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgcHJpbnRPYmogPSAob2JqVHlwZSA9PT0gJ3N0cmluZycpID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICdleHBlY3RlZCAnICsgcHJpbnRPYmogKyAnIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIGlmIChkb0xlbmd0aCkge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSAnbGVuZ3RoJ1xuICAgICAgICAsIGl0ZW1zQ291bnQ7XG4gICAgICBpZiAob2JqVHlwZSA9PT0gJ21hcCcgfHwgb2JqVHlwZSA9PT0gJ3NldCcpIHtcbiAgICAgICAgZGVzY3JpcHRvciA9ICdzaXplJztcbiAgICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgICB9XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBpdGVtc0NvdW50ID49IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIGF0IGxlYXN0ICN7ZXhwfSBidXQgZ290ICN7YWN0fSdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIGJlbG93ICN7ZXhwfSdcbiAgICAgICAgLCBuXG4gICAgICAgICwgaXRlbXNDb3VudFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgb2JqID49IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBsZWFzdCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYmVsb3cgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbGVhc3QnLCBhc3NlcnRMZWFzdCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2d0ZScsIGFzc2VydExlYXN0KTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZ3JlYXRlclRoYW5PckVxdWFsJywgYXNzZXJ0TGVhc3QpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmJlbG93KG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgbGVzcyB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LlxuICAgKiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0byBpdHMgZXhwZWN0ZWRcbiAgICogdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYmVsb3coMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgXG4gICAqIG9yIGBzaXplYCBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIG51bWJlciBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YuYmVsb3coNCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGgoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmJlbG93KDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5iZWxvd2AuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uZXF1YWwoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8ubm90LmJlLmJlbG93KDEpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5iZWxvd2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLmJlbG93KDEsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgyLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYmVsb3coMSk7XG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAubHRgIGFuZCBgLmxlc3NUaGFuYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aFxuICAgKiBgLmJlbG93YC5cbiAgICpcbiAgICogQG5hbWUgYmVsb3dcbiAgICogQGFsaWFzIGx0XG4gICAqIEBhbGlhcyBsZXNzVGhhblxuICAgKiBAcGFyYW0ge051bWJlcn0gblxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0QmVsb3cgKG4sIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBkb0xlbmd0aCA9IGZsYWcodGhpcywgJ2RvTGVuZ3RoJylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBtc2dQcmVmaXggPSAoKGZsYWdNc2cpID8gZmxhZ01zZyArICc6ICcgOiAnJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKVxuICAgICAgLCBvYmpUeXBlID0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBuVHlwZSA9IF8udHlwZShuKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIGVycm9yTWVzc2FnZVxuICAgICAgLCBzaG91bGRUaHJvdyA9IHRydWU7XG5cbiAgICBpZiAoZG9MZW5ndGggJiYgb2JqVHlwZSAhPT0gJ21hcCcgJiYgb2JqVHlwZSAhPT0gJ3NldCcpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KCdsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlID09PSAnZGF0ZScgJiYgblR5cGUgIT09ICdkYXRlJykpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICd0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIGRhdGUnO1xuICAgIH0gZWxzZSBpZiAoblR5cGUgIT09ICdudW1iZXInICYmIChkb0xlbmd0aCB8fCBvYmpUeXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICd0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIG51bWJlcic7XG4gICAgfSBlbHNlIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgIT09ICdkYXRlJyAmJiBvYmpUeXBlICE9PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBwcmludE9iaiA9IChvYmpUeXBlID09PSAnc3RyaW5nJykgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ2V4cGVjdGVkICcgKyBwcmludE9iaiArICcgdG8gYmUgYSBudW1iZXIgb3IgYSBkYXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvdWxkVGhyb3cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHVuZGVmaW5lZCwgc3NmaSk7XG4gICAgfVxuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9ICdsZW5ndGgnXG4gICAgICAgICwgaXRlbXNDb3VudDtcbiAgICAgIGlmIChvYmpUeXBlID09PSAnbWFwJyB8fCBvYmpUeXBlID09PSAnc2V0Jykge1xuICAgICAgICBkZXNjcmlwdG9yID0gJ3NpemUnO1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGl0ZW1zQ291bnQgPCBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyBiZWxvdyAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgYSAnICsgZGVzY3JpcHRvciArICcgYmVsb3cgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICAgLCBpdGVtc0NvdW50XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBvYmogPCBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYmVsb3cgI3tleHB9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IGxlYXN0ICN7ZXhwfSdcbiAgICAgICAgLCBuXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2JlbG93JywgYXNzZXJ0QmVsb3cpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdsdCcsIGFzc2VydEJlbG93KTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbGVzc1RoYW4nLCBhc3NlcnRCZWxvdyk7XG5cbiAgLyoqXG4gICAqICMjIyAubW9zdChuWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXIgb3IgYSBkYXRlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAqIG9yIGRhdGUgYG5gIHJlc3BlY3RpdmVseS4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzXG4gICAqIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmF0Lm1vc3QoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmF0Lm1vc3QoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgXG4gICAqIG9yIGBzaXplYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlciBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YuYXQubW9zdCg0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi5hdC5tb3N0KDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5tb3N0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5ub3QuYmUuYXQubW9zdCgxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubW9zdGAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLmF0Lm1vc3QoMSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5hdC5tb3N0KDEpO1xuICAgKlxuICAgKiBUaGUgYWxpYXNlcyBgLmx0ZWAgYW5kIGAubGVzc1RoYW5PckVxdWFsYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aFxuICAgKiBgLm1vc3RgLlxuICAgKlxuICAgKiBAbmFtZSBtb3N0XG4gICAqIEBhbGlhcyBsdGVcbiAgICogQGFsaWFzIGxlc3NUaGFuT3JFcXVhbFxuICAgKiBAcGFyYW0ge051bWJlcn0gblxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0TW9zdCAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZXJyb3JNZXNzYWdlXG4gICAgICAsIHNob3VsZFRocm93ID0gdHJ1ZTtcblxuICAgIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSAnbWFwJyAmJiBvYmpUeXBlICE9PSAnc2V0Jykge1xuICAgICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkoJ2xlbmd0aCcpO1xuICAgIH1cblxuICAgIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgPT09ICdkYXRlJyAmJiBuVHlwZSAhPT0gJ2RhdGUnKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBtb3N0IG11c3QgYmUgYSBkYXRlJztcbiAgICB9IGVsc2UgaWYgKG5UeXBlICE9PSAnbnVtYmVyJyAmJiAoZG9MZW5ndGggfHwgb2JqVHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIG51bWJlcic7XG4gICAgfSBlbHNlIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgIT09ICdkYXRlJyAmJiBvYmpUeXBlICE9PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBwcmludE9iaiA9IChvYmpUeXBlID09PSAnc3RyaW5nJykgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ2V4cGVjdGVkICcgKyBwcmludE9iaiArICcgdG8gYmUgYSBudW1iZXIgb3IgYSBkYXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvdWxkVGhyb3cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHVuZGVmaW5lZCwgc3NmaSk7XG4gICAgfVxuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9ICdsZW5ndGgnXG4gICAgICAgICwgaXRlbXNDb3VudDtcbiAgICAgIGlmIChvYmpUeXBlID09PSAnbWFwJyB8fCBvYmpUeXBlID09PSAnc2V0Jykge1xuICAgICAgICBkZXNjcmlwdG9yID0gJ3NpemUnO1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGl0ZW1zQ291bnQgPD0gblxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSAnICsgZGVzY3JpcHRvciArICcgYXQgbW9zdCAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyBhYm92ZSAje2V4cH0nXG4gICAgICAgICwgblxuICAgICAgICAsIGl0ZW1zQ291bnRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA8PSBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbW9zdCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbW9zdCcsIGFzc2VydE1vc3QpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdsdGUnLCBhc3NlcnRNb3N0KTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbGVzc1RoYW5PckVxdWFsJywgYXNzZXJ0TW9zdCk7XG5cbiAgLyoqXG4gICAqICMjIyAud2l0aGluKHN0YXJ0LCBmaW5pc2hbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlblxuICAgKiBudW1iZXIgb3IgZGF0ZSBgc3RhcnRgLCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIgb3IgZGF0ZSBgZmluaXNoYCByZXNwZWN0aXZlbHkuXG4gICAqIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZFxuICAgKiB2YWx1ZS5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5iZS53aXRoaW4oMSwgMyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLndpdGhpbigyLCAzKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUud2l0aGluKDEsIDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubGVuZ3RoT2ZgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQncyBgbGVuZ3RoYFxuICAgKiBvciBgc2l6ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIgYHN0YXJ0YCwgYW5kIGxlc3NcbiAgICogdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyIGBmaW5pc2hgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mLndpdGhpbigyLCA0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi53aXRoaW4oMiwgNCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLndpdGhpbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLndpdGhpbigyLCA0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAud2l0aGluYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNCkudG8uYmUud2l0aGluKDEsIDMsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCg0LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUud2l0aGluKDEsIDMpO1xuICAgKlxuICAgKiBAbmFtZSB3aXRoaW5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IGxvd2VyIGJvdW5kIGluY2x1c2l2ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZmluaXNoIHVwcGVyIGJvdW5kIGluY2x1c2l2ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnd2l0aGluJywgZnVuY3Rpb24gKHN0YXJ0LCBmaW5pc2gsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBkb0xlbmd0aCA9IGZsYWcodGhpcywgJ2RvTGVuZ3RoJylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBtc2dQcmVmaXggPSAoKGZsYWdNc2cpID8gZmxhZ01zZyArICc6ICcgOiAnJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKVxuICAgICAgLCBvYmpUeXBlID0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBzdGFydFR5cGUgPSBfLnR5cGUoc3RhcnQpLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZmluaXNoVHlwZSA9IF8udHlwZShmaW5pc2gpLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZXJyb3JNZXNzYWdlXG4gICAgICAsIHNob3VsZFRocm93ID0gdHJ1ZVxuICAgICAgLCByYW5nZSA9IChzdGFydFR5cGUgPT09ICdkYXRlJyAmJiBmaW5pc2hUeXBlID09PSAnZGF0ZScpXG4gICAgICAgICAgPyBzdGFydC50b0lTT1N0cmluZygpICsgJy4uJyArIGZpbmlzaC50b0lTT1N0cmluZygpXG4gICAgICAgICAgOiBzdGFydCArICcuLicgKyBmaW5pc2g7XG5cbiAgICBpZiAoZG9MZW5ndGggJiYgb2JqVHlwZSAhPT0gJ21hcCcgJiYgb2JqVHlwZSAhPT0gJ3NldCcpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KCdsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlID09PSAnZGF0ZScgJiYgKHN0YXJ0VHlwZSAhPT0gJ2RhdGUnIHx8IGZpbmlzaFR5cGUgIT09ICdkYXRlJykpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50cyB0byB3aXRoaW4gbXVzdCBiZSBkYXRlcyc7XG4gICAgfSBlbHNlIGlmICgoc3RhcnRUeXBlICE9PSAnbnVtYmVyJyB8fCBmaW5pc2hUeXBlICE9PSAnbnVtYmVyJykgJiYgKGRvTGVuZ3RoIHx8IG9ialR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudHMgdG8gd2l0aGluIG11c3QgYmUgbnVtYmVycyc7XG4gICAgfSBlbHNlIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgIT09ICdkYXRlJyAmJiBvYmpUeXBlICE9PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBwcmludE9iaiA9IChvYmpUeXBlID09PSAnc3RyaW5nJykgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ2V4cGVjdGVkICcgKyBwcmludE9iaiArICcgdG8gYmUgYSBudW1iZXIgb3IgYSBkYXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvdWxkVGhyb3cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHVuZGVmaW5lZCwgc3NmaSk7XG4gICAgfVxuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9ICdsZW5ndGgnXG4gICAgICAgICwgaXRlbXNDb3VudDtcbiAgICAgIGlmIChvYmpUeXBlID09PSAnbWFwJyB8fCBvYmpUeXBlID09PSAnc2V0Jykge1xuICAgICAgICBkZXNjcmlwdG9yID0gJ3NpemUnO1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGl0ZW1zQ291bnQgPj0gc3RhcnQgJiYgaXRlbXNDb3VudCA8PSBmaW5pc2hcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIHdpdGhpbiAnICsgcmFuZ2VcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyB3aXRoaW4gJyArIHJhbmdlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBvYmogPj0gc3RhcnQgJiYgb2JqIDw9IGZpbmlzaFxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIHdpdGhpbiAnICsgcmFuZ2VcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgd2l0aGluICcgKyByYW5nZVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmluc3RhbmNlb2YoY29uc3RydWN0b3JbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gYGNvbnN0cnVjdG9yYC5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7IH1cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgQ2F0KCkpLnRvLmJlLmFuLmluc3RhbmNlb2YoQ2F0KTtcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmJlLmFuLmluc3RhbmNlb2YoQXJyYXkpO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmluc3RhbmNlb2ZgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmJlLmFuLmluc3RhbmNlb2YoQXJyYXkpO1xuICAgKlxuICAgKiBgLmluc3RhbmNlb2ZgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5hbi5pbnN0YW5jZW9mKEFycmF5LCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmFuLmluc3RhbmNlb2YoQXJyYXkpO1xuICAgKlxuICAgKiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gRVM1LCBgLmluc3RhbmNlb2ZgIG1heSBub3QgYWx3YXlzIHdvcmsgYXMgZXhwZWN0ZWRcbiAgICogd2hlbiB1c2luZyBhIHRyYW5zcGlsZXIgc3VjaCBhcyBCYWJlbCBvciBUeXBlU2NyaXB0LiBJbiBwYXJ0aWN1bGFyLCBpdCBtYXlcbiAgICogcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiBzdWJjbGFzc2luZyBidWlsdC1pbiBvYmplY3Qgc3VjaCBhc1xuICAgKiBgQXJyYXlgLCBgRXJyb3JgLCBhbmQgYE1hcGAuIFNlZSB5b3VyIHRyYW5zcGlsZXIncyBkb2NzIGZvciBkZXRhaWxzOlxuICAgKlxuICAgKiAtIChbQmFiZWxdKGh0dHBzOi8vYmFiZWxqcy5pby9kb2NzL3VzYWdlL2NhdmVhdHMvI2NsYXNzZXMpKVxuICAgKiAtIChbVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3dpa2kvQnJlYWtpbmctQ2hhbmdlcyNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmspKVxuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5pbnN0YW5jZU9mYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmluc3RhbmNlb2ZgLlxuICAgKlxuICAgKiBAbmFtZSBpbnN0YW5jZW9mXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAYWxpYXMgaW5zdGFuY2VPZlxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRJbnN0YW5jZU9mIChjb25zdHJ1Y3RvciwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG5cbiAgICB2YXIgdGFyZ2V0ID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICB2YXIgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICB2YXIgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaXNJbnN0YW5jZU9mID0gdGFyZ2V0IGluc3RhbmNlb2YgY29uc3RydWN0b3I7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgOiAnJztcbiAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIGZsYWdNc2cgKyAnVGhlIGluc3RhbmNlb2YgYXNzZXJ0aW9uIG5lZWRzIGEgY29uc3RydWN0b3IgYnV0ICdcbiAgICAgICAgICAgICsgXy50eXBlKGNvbnN0cnVjdG9yKSArICcgd2FzIGdpdmVuLicsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHNzZmlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IF8uZ2V0TmFtZShjb25zdHJ1Y3Rvcik7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIG5hbWUgPSAnYW4gdW5uYW1lZCBjb25zdHJ1Y3Rvcic7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGlzSW5zdGFuY2VPZlxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhbiBpbnN0YW5jZSBvZiAnICsgbmFtZVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYW4gaW5zdGFuY2Ugb2YgJyArIG5hbWVcbiAgICApO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2luc3RhbmNlb2YnLCBhc3NlcnRJbnN0YW5jZU9mKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaW5zdGFuY2VPZicsIGFzc2VydEluc3RhbmNlT2YpO1xuXG4gIC8qKlxuICAgKiAjIyMgLnByb3BlcnR5KG5hbWVbLCB2YWxbLCBtc2ddXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaGFzIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGBuYW1lYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUucHJvcGVydHkoJ2EnKTtcbiAgICpcbiAgICogV2hlbiBgdmFsYCBpcyBwcm92aWRlZCwgYC5wcm9wZXJ0eWAgYWxzbyBhc3NlcnRzIHRoYXQgdGhlIHByb3BlcnR5J3MgdmFsdWVcbiAgICogaXMgZXF1YWwgdG8gdGhlIGdpdmVuIGB2YWxgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScsIDEpO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzdHJpY3QgKGA9PT1gKSBlcXVhbGl0eSBpcyB1c2VkLiBBZGQgYC5kZWVwYCBlYXJsaWVyIGluIHRoZVxuICAgKiBjaGFpbiB0byB1c2UgZGVlcCBlcXVhbGl0eSBpbnN0ZWFkLiBTZWUgdGhlIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvclxuICAgKiBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBoYXMgcHJvcGVydHkgYHg6IHthOiAxfWBcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uaGF2ZS5kZWVwLnByb3BlcnR5KCd4Jywge2E6IDF9KTtcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8ubm90LmhhdmUucHJvcGVydHkoJ3gnLCB7YTogMX0pO1xuICAgKlxuICAgKiBUaGUgdGFyZ2V0J3MgZW51bWVyYWJsZSBhbmQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgYWx3YXlzIGluY2x1ZGVkXG4gICAqIGluIHRoZSBzZWFyY2guIEJ5IGRlZmF1bHQsIGJvdGggb3duIGFuZCBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgaW5jbHVkZWQuXG4gICAqIEFkZCBgLm93bmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gZXhjbHVkZSBpbmhlcml0ZWQgcHJvcGVydGllcyBmcm9tIHRoZVxuICAgKiBzZWFyY2guXG4gICAqXG4gICAqICAgICBPYmplY3QucHJvdG90eXBlLmIgPSAyO1xuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd24ucHJvcGVydHkoJ2EnKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duLnByb3BlcnR5KCdhJywgMSk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdiJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5vd24ucHJvcGVydHkoJ2InKTtcbiAgICpcbiAgICogYC5kZWVwYCBhbmQgYC5vd25gIGNhbiBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqXG4gICAqIEFkZCBgLm5lc3RlZGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gZW5hYmxlIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gd2hlblxuICAgKiByZWZlcmVuY2luZyBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YToge2I6IFsneCcsICd5J119fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ2EuYlsxXScpO1xuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5oYXZlLm5lc3RlZC5wcm9wZXJ0eSgnYS5iWzFdJywgJ3knKTtcbiAgICpcbiAgICogSWYgYC5gIG9yIGBbXWAgYXJlIHBhcnQgb2YgYW4gYWN0dWFsIHByb3BlcnR5IG5hbWUsIHRoZXkgY2FuIGJlIGVzY2FwZWQgYnlcbiAgICogYWRkaW5nIHR3byBiYWNrc2xhc2hlcyBiZWZvcmUgdGhlbS5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7Jy5hJzogeydbYl0nOiAneCd9fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ1xcXFwuYS5cXFxcW2JcXFxcXScpO1xuICAgKlxuICAgKiBgLmRlZXBgIGFuZCBgLm5lc3RlZGAgY2FuIGJlIGNvbWJpbmVkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogW3tjOiAzfV19fSlcbiAgICogICAgICAgLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkoJ2EuYlswXScsIHtjOiAzfSk7XG4gICAqXG4gICAqIGAub3duYCBhbmQgYC5uZXN0ZWRgIGNhbm5vdCBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5wcm9wZXJ0eWAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKlxuICAgKiBIb3dldmVyLCBpdCdzIGRhbmdlcm91cyB0byBuZWdhdGUgYC5wcm9wZXJ0eWAgd2hlbiBwcm92aWRpbmcgYHZhbGAuIFRoZVxuICAgKiBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zIGJ5IGFzc2VydGluZyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgZWl0aGVyIGRvZXNuJ3QgaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBgbmFtZWAsIG9yIHRoYXQgaXRcbiAgICogZG9lcyBoYXZlIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGBuYW1lYCBidXQgaXRzIHZhbHVlIGlzbid0IGVxdWFsIHRvXG4gICAqIHRoZSBnaXZlbiBgdmFsYC4gSXQncyBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzXG4gICAqIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpc24ndCBleHBlY3RlZCB0byBoYXZlIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5XG4gICAqIGBuYW1lYCwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCBleGFjdGx5IHRoYXQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYScpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHtiOiAyfSkudG8ubm90LmhhdmUucHJvcGVydHkoJ2EnLCAxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBoYXZlIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGBuYW1lYCxcbiAgICogaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSBwcm9wZXJ0eSBoYXMgaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXJcbiAgICogdGhhbiBhc3NlcnRpbmcgdGhhdCBpdCBkb2Vzbid0IGhhdmUgb25lIG9mIG1hbnkgdW5leHBlY3RlZCB2YWx1ZXMuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDN9KS50by5oYXZlLnByb3BlcnR5KCdhJywgMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDN9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYScsIDEpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5wcm9wZXJ0eWAgY2hhbmdlcyB0aGUgdGFyZ2V0IG9mIGFueSBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpblxuICAgKiB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGZyb20gdGhlIG9yaWdpbmFsIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdhJykudGhhdC5pcy5hKCdudW1iZXInKTtcbiAgICpcbiAgICogYC5wcm9wZXJ0eWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgYHZhbGAsIG9ubHkgdXNlIHRoZVxuICAgKiBzZWNvbmQgZm9ybS5cbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdhJywgMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUucHJvcGVydHkoJ2EnLCAyKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLnByb3BlcnR5KCdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUucHJvcGVydHkoJ2InLCB1bmRlZmluZWQsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogVGhlIGFib3ZlIGFzc2VydGlvbiBpc24ndCB0aGUgc2FtZSB0aGluZyBhcyBub3QgcHJvdmlkaW5nIGB2YWxgLiBJbnN0ZWFkLFxuICAgKiBpdCdzIGFzc2VydGluZyB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IGhhcyBhIGBiYCBwcm9wZXJ0eSB0aGF0J3MgZXF1YWwgdG9cbiAgICogYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIFRoZSBhc3NlcnRpb25zIGAub3duUHJvcGVydHlgIGFuZCBgLmhhdmVPd25Qcm9wZXJ0eWAgY2FuIGJlIHVzZWRcbiAgICogaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5vd24ucHJvcGVydHlgLlxuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWwgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQHJldHVybnMgdmFsdWUgb2YgcHJvcGVydHkgZm9yIGNoYWluaW5nXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydFByb3BlcnR5IChuYW1lLCB2YWwsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuXG4gICAgdmFyIGlzTmVzdGVkID0gZmxhZyh0aGlzLCAnbmVzdGVkJylcbiAgICAgICwgaXNPd24gPSBmbGFnKHRoaXMsICdvd24nKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgbmFtZVR5cGUgPSB0eXBlb2YgbmFtZTtcblxuICAgIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgOiAnJztcblxuICAgIGlmIChpc05lc3RlZCkge1xuICAgICAgaWYgKG5hbWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArICd0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZyB3aGVuIHVzaW5nIG5lc3RlZCBzeW50YXgnLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuYW1lVHlwZSAhPT0gJ3N0cmluZycgJiYgbmFtZVR5cGUgIT09ICdudW1iZXInICYmIG5hbWVUeXBlICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArICd0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZywgbnVtYmVyLCBvciBzeW1ib2wnLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTmVzdGVkICYmIGlzT3duKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgIGZsYWdNc2cgKyAnVGhlIFwibmVzdGVkXCIgYW5kIFwib3duXCIgZmxhZ3MgY2Fubm90IGJlIGNvbWJpbmVkLicsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgIGZsYWdNc2cgKyAnVGFyZ2V0IGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGlzRGVlcCA9IGZsYWcodGhpcywgJ2RlZXAnKVxuICAgICAgLCBuZWdhdGUgPSBmbGFnKHRoaXMsICduZWdhdGUnKVxuICAgICAgLCBwYXRoSW5mbyA9IGlzTmVzdGVkID8gXy5nZXRQYXRoSW5mbyhvYmosIG5hbWUpIDogbnVsbFxuICAgICAgLCB2YWx1ZSA9IGlzTmVzdGVkID8gcGF0aEluZm8udmFsdWUgOiBvYmpbbmFtZV07XG5cbiAgICB2YXIgZGVzY3JpcHRvciA9ICcnO1xuICAgIGlmIChpc0RlZXApIGRlc2NyaXB0b3IgKz0gJ2RlZXAgJztcbiAgICBpZiAoaXNPd24pIGRlc2NyaXB0b3IgKz0gJ293biAnO1xuICAgIGlmIChpc05lc3RlZCkgZGVzY3JpcHRvciArPSAnbmVzdGVkICc7XG4gICAgZGVzY3JpcHRvciArPSAncHJvcGVydHkgJztcblxuICAgIHZhciBoYXNQcm9wZXJ0eTtcbiAgICBpZiAoaXNPd24pIGhhc1Byb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgbmFtZSk7XG4gICAgZWxzZSBpZiAoaXNOZXN0ZWQpIGhhc1Byb3BlcnR5ID0gcGF0aEluZm8uZXhpc3RzO1xuICAgIGVsc2UgaGFzUHJvcGVydHkgPSBfLmhhc1Byb3BlcnR5KG9iaiwgbmFtZSk7XG5cbiAgICAvLyBXaGVuIHBlcmZvcm1pbmcgYSBuZWdhdGVkIGFzc2VydGlvbiBmb3IgYm90aCBuYW1lIGFuZCB2YWwsIG1lcmVseSBoYXZpbmdcbiAgICAvLyBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUgaXNuJ3QgZW5vdWdoIHRvIGNhdXNlIHRoZSBhc3NlcnRpb24gdG9cbiAgICAvLyBmYWlsLiBJdCBtdXN0IGJvdGggaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUsIGFuZCB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGF0IHByb3BlcnR5IG11c3QgZXF1YWwgdGhlIGdpdmVuIHZhbC4gVGhlcmVmb3JlLCBza2lwIHRoaXMgYXNzZXJ0aW9uIGluXG4gICAgLy8gZmF2b3Igb2YgdGhlIG5leHQuXG4gICAgaWYgKCFuZWdhdGUgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgaGFzUHJvcGVydHlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlICcgKyBkZXNjcmlwdG9yICsgXy5pbnNwZWN0KG5hbWUpXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgJyArIGRlc2NyaXB0b3IgKyBfLmluc3BlY3QobmFtZSkpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgaGFzUHJvcGVydHkgJiYgKGlzRGVlcCA/IF8uZXFsKHZhbCwgdmFsdWUpIDogdmFsID09PSB2YWx1ZSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlICcgKyBkZXNjcmlwdG9yICsgXy5pbnNwZWN0KG5hbWUpICsgJyBvZiAje2V4cH0sIGJ1dCBnb3QgI3thY3R9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlICcgKyBkZXNjcmlwdG9yICsgXy5pbnNwZWN0KG5hbWUpICsgJyBvZiAje2FjdH0nXG4gICAgICAgICwgdmFsXG4gICAgICAgICwgdmFsdWVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZmxhZyh0aGlzLCAnb2JqZWN0JywgdmFsdWUpO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgncHJvcGVydHknLCBhc3NlcnRQcm9wZXJ0eSk7XG5cbiAgZnVuY3Rpb24gYXNzZXJ0T3duUHJvcGVydHkgKG5hbWUsIHZhbHVlLCBtc2cpIHtcbiAgICBmbGFnKHRoaXMsICdvd24nLCB0cnVlKTtcbiAgICBhc3NlcnRQcm9wZXJ0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnb3duUHJvcGVydHknLCBhc3NlcnRPd25Qcm9wZXJ0eSk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2hhdmVPd25Qcm9wZXJ0eScsIGFzc2VydE93blByb3BlcnR5KTtcblxuICAvKipcbiAgICogIyMjIC5vd25Qcm9wZXJ0eURlc2NyaXB0b3IobmFtZVssIGRlc2NyaXB0b3JbLCBtc2ddXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaGFzIGl0cyBvd24gcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBrZXlcbiAgICogYG5hbWVgLiBFbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSBpbmNsdWRlZCBpbiB0aGVcbiAgICogc2VhcmNoLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnKTtcbiAgICpcbiAgICogV2hlbiBgZGVzY3JpcHRvcmAgaXMgcHJvdmlkZWQsIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYCBhbHNvIGFzc2VydHMgdGhhdFxuICAgKiB0aGUgcHJvcGVydHkncyBkZXNjcmlwdG9yIGlzIGRlZXBseSBlcXVhbCB0byB0aGUgZ2l2ZW4gYGRlc2NyaXB0b3JgLiBTZWVcbiAgICogdGhlIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJywge1xuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAqICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgKiAgICAgICB2YWx1ZTogMSxcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm93blByb3BlcnR5RGVzY3JpcHRvcmAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2InKTtcbiAgICpcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYCB3aGVuIHByb3ZpZGluZ1xuICAgKiBhIGBkZXNjcmlwdG9yYC4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnMgYnlcbiAgICogYXNzZXJ0aW5nIHRoYXQgdGhlIHRhcmdldCBlaXRoZXIgZG9lc24ndCBoYXZlIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoXG4gICAqIHRoZSBnaXZlbiBrZXkgYG5hbWVgLCBvciB0aGF0IGl0IGRvZXMgaGF2ZSBhIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCB0aGVcbiAgICogZ2l2ZW4ga2V5IGBuYW1lYCBidXQgaXRcdTIwMTlzIG5vdCBkZWVwbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGBkZXNjcmlwdG9yYC4gSXQnc1xuICAgKiBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhblxuICAgKiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpc24ndCBleHBlY3RlZCB0byBoYXZlIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlblxuICAgKiBrZXkgYG5hbWVgLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5ub3QuaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnKTtcbiAgICpcbiAgICogICAgIC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHtiOiAyfSkudG8ubm90LmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJywge1xuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAqICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgKiAgICAgICB2YWx1ZTogMSxcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW5cbiAgICoga2V5IGBuYW1lYCwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSBwcm9wZXJ0eSBoYXMgaXRzIGV4cGVjdGVkXG4gICAqIGRlc2NyaXB0b3IsIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSBvbmUgb2YgbWFueVxuICAgKiB1bmV4cGVjdGVkIGRlc2NyaXB0b3JzLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogM30pLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJywge1xuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAqICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgKiAgICAgICB2YWx1ZTogMyxcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDN9KS50by5ub3QuaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAxLFxuICAgKiAgICAgfSk7XG4gICAqXG4gICAqIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYCBjaGFuZ2VzIHRoZSB0YXJnZXQgb2YgYW55IGFzc2VydGlvbnMgdGhhdCBmb2xsb3dcbiAgICogaW4gdGhlIGNoYWluIHRvIGJlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmcm9tIHRoZSBvcmlnaW5hbFxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnKVxuICAgKiAgICAgICAudGhhdC5oYXMucHJvcGVydHkoJ2VudW1lcmFibGUnLCB0cnVlKTtcbiAgICpcbiAgICogYC5vd25Qcm9wZXJ0eURlc2NyaXB0b3JgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYVxuICAgKiBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc29cbiAgICogYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nXG4gICAqIGBkZXNjcmlwdG9yYCwgb25seSB1c2UgdGhlIHNlY29uZCBmb3JtLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJywge1xuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAqICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgKiAgICAgICB2YWx1ZTogMixcbiAgICogICAgIH0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAyLFxuICAgKiAgICAgfSk7XG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0pXG4gICAqICAgICAgIC50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYicsIHVuZGVmaW5lZCwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiBUaGUgYWJvdmUgYXNzZXJ0aW9uIGlzbid0IHRoZSBzYW1lIHRoaW5nIGFzIG5vdCBwcm92aWRpbmcgYGRlc2NyaXB0b3JgLlxuICAgKiBJbnN0ZWFkLCBpdCdzIGFzc2VydGluZyB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IGhhcyBhIGBiYCBwcm9wZXJ0eVxuICAgKiBkZXNjcmlwdG9yIHRoYXQncyBkZWVwbHkgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYC5cbiAgICpcbiAgICogQG5hbWUgb3duUHJvcGVydHlEZXNjcmlwdG9yXG4gICAqIEBhbGlhcyBoYXZlT3duUHJvcGVydHlEZXNjcmlwdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZXNjcmlwdG9yIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydE93blByb3BlcnR5RGVzY3JpcHRvciAobmFtZSwgZGVzY3JpcHRvciwgbXNnKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgbXNnID0gZGVzY3JpcHRvcjtcbiAgICAgIGRlc2NyaXB0b3IgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgdmFyIGFjdHVhbERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdChvYmopLCBuYW1lKTtcbiAgICBpZiAoYWN0dWFsRGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBfLmVxbChkZXNjcmlwdG9yLCBhY3R1YWxEZXNjcmlwdG9yKVxuICAgICAgICAsICdleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yICcgKyBfLmluc3BlY3QobmFtZSkgKyAnIG9uICN7dGhpc30gdG8gbWF0Y2ggJyArIF8uaW5zcGVjdChkZXNjcmlwdG9yKSArICcsIGdvdCAnICsgXy5pbnNwZWN0KGFjdHVhbERlc2NyaXB0b3IpXG4gICAgICAgICwgJ2V4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgJyArIF8uaW5zcGVjdChuYW1lKSArICcgb24gI3t0aGlzfSB0byBub3QgbWF0Y2ggJyArIF8uaW5zcGVjdChkZXNjcmlwdG9yKVxuICAgICAgICAsIGRlc2NyaXB0b3JcbiAgICAgICAgLCBhY3R1YWxEZXNjcmlwdG9yXG4gICAgICAgICwgdHJ1ZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgYWN0dWFsRGVzY3JpcHRvclxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yICcgKyBfLmluc3BlY3QobmFtZSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhbiBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgJyArIF8uaW5zcGVjdChuYW1lKVxuICAgICAgKTtcbiAgICB9XG4gICAgZmxhZyh0aGlzLCAnb2JqZWN0JywgYWN0dWFsRGVzY3JpcHRvcik7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdvd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdoYXZlT3duUHJvcGVydHlEZXNjcmlwdG9yJywgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcblxuICAvKipcbiAgICogIyMjIC5sZW5ndGhPZihuWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQncyBgbGVuZ3RoYCBvciBgc2l6ZWAgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlclxuICAgKiBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDIsIDNdKSkudG8uaGF2ZS5sZW5ndGhPZigzKTtcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSkpLnRvLmhhdmUubGVuZ3RoT2YoMyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubGVuZ3RoT2ZgLiBIb3dldmVyLCBpdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZFxuICAgKiB2YWx1ZSwgcmF0aGVyIHRoYW4gbm90IGVxdWFsIHRvIG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuaGF2ZS5sZW5ndGhPZig0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubGVuZ3RoT2ZgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUubGVuZ3RoT2YoMik7XG4gICAqXG4gICAqIGAubGVuZ3RoT2ZgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBsYW5ndWFnZSBjaGFpbiwgY2F1c2luZyBhbGwgYC5hYm92ZWAsXG4gICAqIGAuYmVsb3dgLCBgLmxlYXN0YCwgYC5tb3N0YCwgYW5kIGAud2l0aGluYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZVxuICAgKiBjaGFpbiB0byB1c2UgdGhlIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGFzIHRoZSB0YXJnZXQuIEhvd2V2ZXIsIGl0J3NcbiAgICogb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0J3MgYGxlbmd0aGAgcHJvcGVydHkgaXMgZXF1YWwgdG8gaXRzXG4gICAqIGV4cGVjdGVkIGxlbmd0aCwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXRzIGBsZW5ndGhgIHByb3BlcnR5IGZhbGxzXG4gICAqIHdpdGhpbiBzb21lIHJhbmdlIG9mIHZhbHVlcy5cbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmFib3ZlKDIpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi5iZWxvdyg0KTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYXQubGVhc3QoMyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmF0Lm1vc3QoMyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLndpdGhpbigyLDQpO1xuICAgKlxuICAgKiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCB0aGUgYWxpYXMgYC5sZW5ndGhgIGNhbid0IGJlIGNoYWluZWQgZGlyZWN0bHlcbiAgICogb2ZmIG9mIGFuIHVuaW52b2tlZCBtZXRob2Qgc3VjaCBhcyBgLmFgLiBUaGVyZWZvcmUsIGAubGVuZ3RoYCBjYW4ndCBiZSB1c2VkXG4gICAqIGludGVyY2hhbmdlYWJseSB3aXRoIGAubGVuZ3RoT2ZgIGluIGV2ZXJ5IHNpdHVhdGlvbi4gSXQncyByZWNvbW1lbmRlZCB0b1xuICAgKiBhbHdheXMgdXNlIGAubGVuZ3RoT2ZgIGluc3RlYWQgb2YgYC5sZW5ndGhgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5hLmxlbmd0aCgzKTsgLy8gaW5jb21wYXRpYmxlOyB0aHJvd3MgZXJyb3JcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUuYS5sZW5ndGhPZigzKTsgIC8vIHBhc3NlcyBhcyBleHBlY3RlZFxuICAgKlxuICAgKiBAbmFtZSBsZW5ndGhPZlxuICAgKiBAYWxpYXMgbGVuZ3RoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRMZW5ndGhDaGFpbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnZG9MZW5ndGgnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydExlbmd0aCAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKVxuICAgICAgLCBkZXNjcmlwdG9yID0gJ2xlbmd0aCdcbiAgICAgICwgaXRlbXNDb3VudDtcblxuICAgIHN3aXRjaCAob2JqVHlwZSkge1xuICAgICAgY2FzZSAnbWFwJzpcbiAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgIGRlc2NyaXB0b3IgPSAnc2l6ZSc7XG4gICAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgIH1cblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBpdGVtc0NvdW50ID09IG5cbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyBvZiAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIG9mICN7YWN0fSdcbiAgICAgICwgblxuICAgICAgLCBpdGVtc0NvdW50XG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2xlbmd0aCcsIGFzc2VydExlbmd0aCwgYXNzZXJ0TGVuZ3RoQ2hhaW4pO1xuICBBc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCdsZW5ndGhPZicsIGFzc2VydExlbmd0aCwgYXNzZXJ0TGVuZ3RoQ2hhaW4pO1xuXG4gIC8qKlxuICAgKiAjIyMgLm1hdGNoKHJlWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIGByZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLm1hdGNoKC9eZm9vLyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubWF0Y2hgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5ub3QubWF0Y2goL3RhY28vKTtcbiAgICpcbiAgICogYC5tYXRjaGAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5tYXRjaCgvdGFjby8sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJywgJ25vb28gd2h5IGZhaWw/PycpLnRvLm1hdGNoKC90YWNvLyk7XG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLm1hdGNoZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAubWF0Y2hgLlxuICAgKlxuICAgKiBAbmFtZSBtYXRjaFxuICAgKiBAYWxpYXMgbWF0Y2hlc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICBmdW5jdGlvbiBhc3NlcnRNYXRjaChyZSwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICByZS5leGVjKG9iailcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbWF0Y2ggJyArIHJlXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IG5vdCB0byBtYXRjaCAnICsgcmVcbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbWF0Y2gnLCBhc3NlcnRNYXRjaCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ21hdGNoZXMnLCBhc3NlcnRNYXRjaCk7XG5cbiAgLyoqXG4gICAqICMjIyAuc3RyaW5nKHN0clssIG1zZ10pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IHN0cmluZyBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nIGBzdHJgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5oYXZlLnN0cmluZygnYmFyJyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuc3RyaW5nYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8ubm90LmhhdmUuc3RyaW5nKCd0YWNvJyk7XG4gICAqXG4gICAqIGAuc3RyaW5nYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLmhhdmUuc3RyaW5nKCd0YWNvJywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KCdmb29iYXInLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5zdHJpbmcoJ3RhY28nKTtcbiAgICpcbiAgICogQG5hbWUgc3RyaW5nXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3N0cmluZycsIGZ1bmN0aW9uIChzdHIsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ3N0cmluZycpO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIH5vYmouaW5kZXhPZihzdHIpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGNvbnRhaW4gJyArIF8uaW5zcGVjdChzdHIpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluICcgKyBfLmluc3BlY3Qoc3RyKVxuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmtleXMoa2V5MVssIGtleTJbLCAuLi5dXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0LCBhcnJheSwgbWFwLCBvciBzZXQgaGFzIHRoZSBnaXZlbiBrZXlzLiBPbmx5XG4gICAqIHRoZSB0YXJnZXQncyBvd24gaW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2guXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhbiBvYmplY3Qgb3IgYXJyYXksIGtleXMgY2FuIGJlIHByb3ZpZGVkIGFzIG9uZSBvciBtb3JlXG4gICAqIHN0cmluZyBhcmd1bWVudHMsIGEgc2luZ2xlIGFycmF5IGFyZ3VtZW50LCBvciBhIHNpbmdsZSBvYmplY3QgYXJndW1lbnQuIEluXG4gICAqIHRoZSBsYXR0ZXIgY2FzZSwgb25seSB0aGUga2V5cyBpbiB0aGUgZ2l2ZW4gb2JqZWN0IG1hdHRlcjsgdGhlIHZhbHVlcyBhcmVcbiAgICogaWdub3JlZC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KFsneCcsICd5J10pLnRvLmhhdmUuYWxsLmtleXMoMCwgMSk7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmFsbC5rZXlzKFsnYScsICdiJ10pO1xuICAgKiAgICAgZXhwZWN0KFsneCcsICd5J10pLnRvLmhhdmUuYWxsLmtleXMoWzAsIDFdKTtcbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoe2E6IDQsIGI6IDV9KTsgLy8gaWdub3JlIDQgYW5kIDVcbiAgICogICAgIGV4cGVjdChbJ3gnLCAneSddKS50by5oYXZlLmFsbC5rZXlzKHswOiA0LCAxOiA1fSk7IC8vIGlnbm9yZSA0IGFuZCA1XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIG1hcCBvciBzZXQsIGVhY2gga2V5IG11c3QgYmUgcHJvdmlkZWQgYXMgYSBzZXBhcmF0ZVxuICAgKiBhcmd1bWVudC5cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl1dKSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3QobmV3IFNldChbJ2EnLCAnYiddKSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEJlY2F1c2UgYC5rZXlzYCBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIHRhcmdldCdzIHR5cGUsIGl0J3NcbiAgICogaW1wb3J0YW50IHRvIGNoZWNrIHRoZSB0YXJnZXQncyB0eXBlIGJlZm9yZSB1c2luZyBgLmtleXNgLiBTZWUgdGhlIGAuYWAgZG9jXG4gICAqIGZvciBpbmZvIG9uIHRlc3RpbmcgYSB0YXJnZXQncyB0eXBlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uYmUuYW4oJ29iamVjdCcpLnRoYXQuaGFzLmFsbC5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgc3RyaWN0IChgPT09YCkgZXF1YWxpdHkgaXMgdXNlZCB0byBjb21wYXJlIGtleXMgb2YgbWFwcyBhbmRcbiAgICogc2V0cy4gQWRkIGAuZGVlcGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gdXNlIGRlZXAgZXF1YWxpdHkgaW5zdGVhZC4gU2VlXG4gICAqIHRoZSBgZGVlcC1lcWxgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcCBlcXVhbGl0eSBhbGdvcml0aG06XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgc2V0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIGtleSBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5oYXZlLmFsbC5kZWVwLmtleXMoW3thOiAxfV0pO1xuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5ub3QuaGF2ZS5hbGwua2V5cyhbe2E6IDF9XSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSB0YXJnZXQgbXVzdCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cyBhbmQgbm8gbW9yZS4gQWRkXG4gICAqIGAuYW55YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBvbmx5IHJlcXVpcmUgdGhhdCB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3RcbiAgICogb25lIG9mIHRoZSBnaXZlbiBrZXlzLiBBbHNvLCBhZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZVxuICAgKiBgLmtleXNgLiBJdCdzIG9mdGVuIGJlc3QgdG8gYWRkIGAuYW55YCB3aGVuIG5lZ2F0aW5nIGAua2V5c2AsIGFuZCB0byB1c2VcbiAgICogYC5hbGxgIHdoZW4gYXNzZXJ0aW5nIGAua2V5c2Agd2l0aG91dCBuZWdhdGlvbi5cbiAgICpcbiAgICogV2hlbiBuZWdhdGluZyBgLmtleXNgLCBgLmFueWAgaXMgcHJlZmVycmVkIGJlY2F1c2UgYC5ub3QuYW55LmtleXNgIGFzc2VydHNcbiAgICogZXhhY3RseSB3aGF0J3MgZXhwZWN0ZWQgb2YgdGhlIG91dHB1dCwgd2hlcmVhcyBgLm5vdC5hbGwua2V5c2AgY3JlYXRlc1xuICAgKiB1bmNlcnRhaW4gZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgZG9lc24ndCBoYXZlIGFueSBvZiB0aGUgZ2l2ZW4ga2V5c1xuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8ubm90LmhhdmUuYW55LmtleXMoJ2MnLCAnZCcpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkOyBhc3NlcnRzIHRoYXQgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBhbGwgb2YgdGhlIGdpdmVuXG4gICAqICAgICAvLyBrZXlzIGJ1dCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNvbWUgb2YgdGhlbVxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8ubm90LmhhdmUuYWxsLmtleXMoJ2MnLCAnZCcpO1xuICAgKlxuICAgKiBXaGVuIGFzc2VydGluZyBgLmtleXNgIHdpdGhvdXQgbmVnYXRpb24sIGAuYWxsYCBpcyBwcmVmZXJyZWQgYmVjYXVzZVxuICAgKiBgLmFsbC5rZXlzYCBhc3NlcnRzIGV4YWN0bHkgd2hhdCdzIGV4cGVjdGVkIG9mIHRoZSBvdXRwdXQsIHdoZXJlYXNcbiAgICogYC5hbnkua2V5c2AgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgaGFzIGFsbCB0aGUgZ2l2ZW4ga2V5c1xuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW5cbiAgICogICAgIC8vIGtleXMgYnV0IG1heSBvciBtYXkgbm90IGhhdmUgbW9yZSBvZiB0aGVtXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmFueS5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGAuYWxsYCBpcyB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBuZWl0aGVyIGAuYWxsYCBub3IgYC5hbnlgIGFwcGVhclxuICAgKiBlYXJsaWVyIGluIHRoZSBjaGFpbi4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFkZCBgLmFsbGAgYW55d2F5IGJlY2F1c2VcbiAgICogaXQgaW1wcm92ZXMgcmVhZGFiaWxpdHkuXG4gICAqXG4gICAqICAgICAvLyBCb3RoIGFzc2VydGlvbnMgYXJlIGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmtleXMoJ2EnLCAnYicpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAuaW5jbHVkZWAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gcmVxdWlyZSB0aGF0IHRoZSB0YXJnZXQncyBrZXlzIGJlIGFcbiAgICogc3VwZXJzZXQgb2YgdGhlIGV4cGVjdGVkIGtleXMsIHJhdGhlciB0aGFuIGlkZW50aWNhbCBzZXRzLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCdzIGtleXMgYXJlIGEgc3VwZXJzZXQgb2YgWydhJywgJ2InXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyLCBjOiAzfSkudG8uaW5jbHVkZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDIsIGM6IDN9KS50by5ub3QuaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEhvd2V2ZXIsIGlmIGAuYW55YCBhbmQgYC5pbmNsdWRlYCBhcmUgY29tYmluZWQsIG9ubHkgdGhlIGAuYW55YCB0YWtlc1xuICAgKiBlZmZlY3QuIFRoZSBgLmluY2x1ZGVgIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLlxuICAgKlxuICAgKiAgICAgLy8gQm90aCBhc3NlcnRpb25zIGFyZSBpZGVudGljYWxcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUuYW55LmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZS5hbnkua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5rZXkoJ2InKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAua2V5YCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmtleXNgLlxuICAgKlxuICAgKiBAbmFtZSBrZXlzXG4gICAqIEBhbGlhcyBrZXlcbiAgICogQHBhcmFtIHsuLi5TdHJpbmd8QXJyYXl8T2JqZWN0fSBrZXlzXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEtleXMgKGtleXMpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopXG4gICAgICAsIGtleXNUeXBlID0gXy50eXBlKGtleXMpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgaXNEZWVwID0gZmxhZyh0aGlzLCAnZGVlcCcpXG4gICAgICAsIHN0clxuICAgICAgLCBkZWVwU3RyID0gJydcbiAgICAgICwgYWN0dWFsXG4gICAgICAsIG9rID0gdHJ1ZVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpO1xuXG4gICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgIHZhciBtaXhlZEFyZ3NNc2cgPSBmbGFnTXNnICsgJ3doZW4gdGVzdGluZyBrZXlzIGFnYWluc3QgYW4gb2JqZWN0IG9yIGFuIGFycmF5IHlvdSBtdXN0IGdpdmUgYSBzaW5nbGUgQXJyYXl8T2JqZWN0fFN0cmluZyBhcmd1bWVudCBvciBtdWx0aXBsZSBTdHJpbmcgYXJndW1lbnRzJztcblxuICAgIGlmIChvYmpUeXBlID09PSAnTWFwJyB8fCBvYmpUeXBlID09PSAnU2V0Jykge1xuICAgICAgZGVlcFN0ciA9IGlzRGVlcCA/ICdkZWVwbHkgJyA6ICcnO1xuICAgICAgYWN0dWFsID0gW107XG5cbiAgICAgIC8vIE1hcCBhbmQgU2V0ICcua2V5cycgYXJlbid0IHN1cHBvcnRlZCBpbiBJRSAxMS4gVGhlcmVmb3JlLCB1c2UgLmZvckVhY2guXG4gICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAodmFsLCBrZXkpIHsgYWN0dWFsLnB1c2goa2V5KSB9KTtcblxuICAgICAgaWYgKGtleXNUeXBlICE9PSAnQXJyYXknKSB7XG4gICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhY3R1YWwgPSBfLmdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaik7XG5cbiAgICAgIHN3aXRjaCAoa2V5c1R5cGUpIHtcbiAgICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1peGVkQXJnc01zZywgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobWl4ZWRBcmdzTXNnLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlzID0gT2JqZWN0LmtleXMoa2V5cyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc3RyaW5naWZ5IG5vbi1TeW1ib2xzIGJlY2F1c2UgU3ltYm9scyB3b3VsZCBiZWNvbWUgXCJTeW1ib2woKVwiXG4gICAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N5bWJvbCcgPyB2YWwgOiBTdHJpbmcodmFsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihmbGFnTXNnICsgJ2tleXMgcmVxdWlyZWQnLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIHZhciBsZW4gPSBrZXlzLmxlbmd0aFxuICAgICAgLCBhbnkgPSBmbGFnKHRoaXMsICdhbnknKVxuICAgICAgLCBhbGwgPSBmbGFnKHRoaXMsICdhbGwnKVxuICAgICAgLCBleHBlY3RlZCA9IGtleXM7XG5cbiAgICBpZiAoIWFueSAmJiAhYWxsKSB7XG4gICAgICBhbGwgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhhcyBhbnlcbiAgICBpZiAoYW55KSB7XG4gICAgICBvayA9IGV4cGVjdGVkLnNvbWUoZnVuY3Rpb24oZXhwZWN0ZWRLZXkpIHtcbiAgICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBfLmVxbChleHBlY3RlZEtleSwgYWN0dWFsS2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkS2V5ID09PSBhY3R1YWxLZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhhcyBhbGxcbiAgICBpZiAoYWxsKSB7XG4gICAgICBvayA9IGV4cGVjdGVkLmV2ZXJ5KGZ1bmN0aW9uKGV4cGVjdGVkS2V5KSB7XG4gICAgICAgIHJldHVybiBhY3R1YWwuc29tZShmdW5jdGlvbihhY3R1YWxLZXkpIHtcbiAgICAgICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgICAgICByZXR1cm4gXy5lcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZEtleSA9PT0gYWN0dWFsS2V5O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFmbGFnKHRoaXMsICdjb250YWlucycpKSB7XG4gICAgICAgIG9rID0gb2sgJiYga2V5cy5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBLZXkgc3RyaW5nXG4gICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgIGtleXMgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIF8uaW5zcGVjdChrZXkpO1xuICAgICAgfSk7XG4gICAgICB2YXIgbGFzdCA9IGtleXMucG9wKCk7XG4gICAgICBpZiAoYWxsKSB7XG4gICAgICAgIHN0ciA9IGtleXMuam9pbignLCAnKSArICcsIGFuZCAnICsgbGFzdDtcbiAgICAgIH1cbiAgICAgIGlmIChhbnkpIHtcbiAgICAgICAgc3RyID0ga2V5cy5qb2luKCcsICcpICsgJywgb3IgJyArIGxhc3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IF8uaW5zcGVjdChrZXlzWzBdKTtcbiAgICB9XG5cbiAgICAvLyBGb3JtXG4gICAgc3RyID0gKGxlbiA+IDEgPyAna2V5cyAnIDogJ2tleSAnKSArIHN0cjtcblxuICAgIC8vIEhhdmUgLyBpbmNsdWRlXG4gICAgc3RyID0gKGZsYWcodGhpcywgJ2NvbnRhaW5zJykgPyAnY29udGFpbiAnIDogJ2hhdmUgJykgKyBzdHI7XG5cbiAgICAvLyBBc3NlcnRpb25cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgb2tcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gJyArIGRlZXBTdHIgKyBzdHJcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90ICcgKyBkZWVwU3RyICsgc3RyXG4gICAgICAsIGV4cGVjdGVkLnNsaWNlKDApLnNvcnQoXy5jb21wYXJlQnlJbnNwZWN0KVxuICAgICAgLCBhY3R1YWwuc29ydChfLmNvbXBhcmVCeUluc3BlY3QpXG4gICAgICAsIHRydWVcbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgna2V5cycsIGFzc2VydEtleXMpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdrZXknLCBhc3NlcnRLZXlzKTtcblxuICAvKipcbiAgICogIyMjIC50aHJvdyhbZXJyb3JMaWtlXSwgW2Vyck1zZ01hdGNoZXJdLCBbbXNnXSlcbiAgICpcbiAgICogV2hlbiBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBgLnRocm93YCBpbnZva2VzIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kXG4gICAqIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgc2FsbW9uIScpOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdygpO1xuICAgKlxuICAgKiBXaGVuIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgYW5kIGl0J3MgYW4gZXJyb3IgY29uc3RydWN0b3IsIGAudGhyb3dgXG4gICAqIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBhbmQgYXNzZXJ0cyB0aGF0IGFuIGVycm9yIGlzIHRocm93biB0aGF0J3MgYW5cbiAgICogaW5zdGFuY2Ugb2YgdGhhdCBlcnJvciBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBhbmQgaXQncyBhbiBlcnJvciBpbnN0YW5jZSwgYC50aHJvd2AgaW52b2tlc1xuICAgKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGFuZCBhc3NlcnRzIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duIHRoYXQncyBzdHJpY3RseVxuICAgKiAoYD09PWApIGVxdWFsIHRvIHRoYXQgZXJyb3IgaW5zdGFuY2UuXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7XG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IGVycjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coZXJyKTtcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGFuZCBpdCdzIGEgc3RyaW5nLCBgLnRocm93YCBpbnZva2VzIHRoZVxuICAgKiB0YXJnZXQgZnVuY3Rpb24gYW5kIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24gd2l0aCBhIG1lc3NhZ2UgdGhhdFxuICAgKiBjb250YWlucyB0aGF0IHN0cmluZy5cbiAgICpcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KCdzYWxtb24nKTtcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGFuZCBpdCdzIGEgcmVndWxhciBleHByZXNzaW9uLCBgLnRocm93YFxuICAgKiBpbnZva2VzIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24gd2l0aCBhXG4gICAqIG1lc3NhZ2UgdGhhdCBtYXRjaGVzIHRoYXQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiAgICAgdmFyIGJhZEZuID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIHNhbG1vbiEnKTsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coL3NhbG1vbi8pO1xuICAgKlxuICAgKiBXaGVuIHR3byBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBhbmQgdGhlIGZpcnN0IGlzIGFuIGVycm9yIGluc3RhbmNlIG9yXG4gICAqIGNvbnN0cnVjdG9yLCBhbmQgdGhlIHNlY29uZCBpcyBhIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24sIGAudGhyb3dgXG4gICAqIGludm9rZXMgdGhlIGZ1bmN0aW9uIGFuZCBhc3NlcnRzIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duIHRoYXQgZnVsZmlsbHMgYm90aFxuICAgKiBjb25kaXRpb25zIGFzIGRlc2NyaWJlZCBhYm92ZS5cbiAgICpcbiAgICogICAgIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIHNhbG1vbiEnKTtcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgZXJyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICdzYWxtb24nKTtcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coVHlwZUVycm9yLCAvc2FsbW9uLyk7XG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KGVyciwgJ3NhbG1vbicpO1xuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhlcnIsIC9zYWxtb24vKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC50aHJvd2AuXG4gICAqXG4gICAqICAgICB2YXIgZ29vZEZuID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QoZ29vZEZuKS50by5ub3QudGhyb3coKTtcbiAgICpcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAudGhyb3dgIHdoZW4gcHJvdmlkaW5nIGFueSBhcmd1bWVudHMuXG4gICAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zIGJ5IGFzc2VydGluZyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgZWl0aGVyIGRvZXNuJ3QgdGhyb3cgYW4gZXJyb3IsIG9yIHRoYXQgaXQgdGhyb3dzIGFuIGVycm9yIGJ1dCBvZiBhXG4gICAqIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhlIGdpdmVuIHR5cGUsIG9yIHRoYXQgaXQgdGhyb3dzIGFuIGVycm9yIG9mIHRoZSBnaXZlblxuICAgKiB0eXBlIGJ1dCB3aXRoIGEgbWVzc2FnZSB0aGF0IGRvZXNuJ3QgaW5jbHVkZSB0aGUgZ2l2ZW4gc3RyaW5nLiBJdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuXG4gICAqIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzbid0IGV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIHZhciBnb29kRm4gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChnb29kRm4pLnRvLm5vdC50aHJvdygpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGdvb2RGbikudG8ubm90LnRocm93KFJlZmVyZW5jZUVycm9yLCAneCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIHRoYXQgdGhlIGVycm9yIGlzIG9mIGl0cyBleHBlY3RlZCB0eXBlLCBhbmQgaGFzIGEgbWVzc2FnZSB0aGF0IGluY2x1ZGVzIGFuXG4gICAqIGV4cGVjdGVkIHN0cmluZywgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55XG4gICAqIHVuZXhwZWN0ZWQgdHlwZXMsIGFuZCBkb2Vzbid0IGhhdmUgYSBtZXNzYWdlIHRoYXQgaW5jbHVkZXMgc29tZSBzdHJpbmcuXG4gICAqXG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgc2FsbW9uIScpOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICdzYWxtb24nKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8ubm90LnRocm93KFJlZmVyZW5jZUVycm9yLCAneCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC50aHJvd2AgY2hhbmdlcyB0aGUgdGFyZ2V0IG9mIGFueSBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0b1xuICAgKiBiZSB0aGUgZXJyb3Igb2JqZWN0IHRoYXQncyB0aHJvd24uXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7XG4gICAqICAgICBlcnIuY29kZSA9IDQyO1xuICAgKiAgICAgdmFyIGJhZEZuID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBlcnI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KFR5cGVFcnJvcikud2l0aC5wcm9wZXJ0eSgnY29kZScsIDQyKTtcbiAgICpcbiAgICogYC50aHJvd2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzIHVzZVxuICAgKiB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgZ29vZEZuID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QoZ29vZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICd4JywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KGdvb2RGbiwgJ25vb28gd2h5IGZhaWw/PycpLnRvLnRocm93KCk7XG4gICAqXG4gICAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBFUzUsIGAudGhyb3dgIG1heSBub3QgYWx3YXlzIHdvcmsgYXMgZXhwZWN0ZWQgd2hlblxuICAgKiB1c2luZyBhIHRyYW5zcGlsZXIgc3VjaCBhcyBCYWJlbCBvciBUeXBlU2NyaXB0LiBJbiBwYXJ0aWN1bGFyLCBpdCBtYXlcbiAgICogcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiBzdWJjbGFzc2luZyB0aGUgYnVpbHQtaW4gYEVycm9yYCBvYmplY3QgYW5kXG4gICAqIHRoZW4gcGFzc2luZyB0aGUgc3ViY2xhc3NlZCBjb25zdHJ1Y3RvciB0byBgLnRocm93YC4gU2VlIHlvdXIgdHJhbnNwaWxlcidzXG4gICAqIGRvY3MgZm9yIGRldGFpbHM6XG4gICAqXG4gICAqIC0gKFtCYWJlbF0oaHR0cHM6Ly9iYWJlbGpzLmlvL2RvY3MvdXNhZ2UvY2F2ZWF0cy8jY2xhc3NlcykpXG4gICAqIC0gKFtUeXBlU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29yaykpXG4gICAqXG4gICAqIEJld2FyZSBvZiBzb21lIGNvbW1vbiBtaXN0YWtlcyB3aGVuIHVzaW5nIHRoZSBgdGhyb3dgIGFzc2VydGlvbi4gT25lIGNvbW1vblxuICAgKiBtaXN0YWtlIGlzIHRvIGFjY2lkZW50YWxseSBpbnZva2UgdGhlIGZ1bmN0aW9uIHlvdXJzZWxmIGluc3RlYWQgb2YgbGV0dGluZ1xuICAgKiB0aGUgYHRocm93YCBhc3NlcnRpb24gaW52b2tlIHRoZSBmdW5jdGlvbiBmb3IgeW91LiBGb3IgZXhhbXBsZSwgd2hlblxuICAgKiB0ZXN0aW5nIGlmIGEgZnVuY3Rpb24gbmFtZWQgYGZuYCB0aHJvd3MsIHByb3ZpZGUgYGZuYCBpbnN0ZWFkIG9mIGBmbigpYCBhc1xuICAgKiB0aGUgdGFyZ2V0IGZvciB0aGUgYXNzZXJ0aW9uLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZuKS50by50aHJvdygpOyAgICAgLy8gR29vZCEgVGVzdHMgYGZuYCBhcyBkZXNpcmVkXG4gICAqICAgICBleHBlY3QoZm4oKSkudG8udGhyb3coKTsgICAvLyBCYWQhIFRlc3RzIHJlc3VsdCBvZiBgZm4oKWAsIG5vdCBgZm5gXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIGFzc2VydCB0aGF0IHlvdXIgZnVuY3Rpb24gYGZuYCB0aHJvd3Mgd2hlbiBwYXNzZWQgY2VydGFpblxuICAgKiBhcmd1bWVudHMsIHRoZW4gd3JhcCBhIGNhbGwgdG8gYGZuYCBpbnNpZGUgb2YgYW5vdGhlciBmdW5jdGlvbi5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7IGZuKDQyKTsgfSkudG8udGhyb3coKTsgIC8vIEZ1bmN0aW9uIGV4cHJlc3Npb25cbiAgICogICAgIGV4cGVjdCgoKSA9PiBmbig0MikpLnRvLnRocm93KCk7ICAgICAgICAgICAgIC8vIEVTNiBhcnJvdyBmdW5jdGlvblxuICAgKlxuICAgKiBBbm90aGVyIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHByb3ZpZGUgYW4gb2JqZWN0IG1ldGhvZCAob3IgYW55IHN0YW5kLWFsb25lXG4gICAqIGZ1bmN0aW9uIHRoYXQgcmVsaWVzIG9uIGB0aGlzYCkgYXMgdGhlIHRhcmdldCBvZiB0aGUgYXNzZXJ0aW9uLiBEb2luZyBzbyBpc1xuICAgKiBwcm9ibGVtYXRpYyBiZWNhdXNlIHRoZSBgdGhpc2AgY29udGV4dCB3aWxsIGJlIGxvc3Qgd2hlbiB0aGUgZnVuY3Rpb24gaXNcbiAgICogaW52b2tlZCBieSBgLnRocm93YDsgdGhlcmUncyBubyB3YXkgZm9yIGl0IHRvIGtub3cgd2hhdCBgdGhpc2AgaXMgc3VwcG9zZWRcbiAgICogdG8gYmUuIFRoZXJlIGFyZSB0d28gd2F5cyBhcm91bmQgdGhpcyBwcm9ibGVtLiBPbmUgc29sdXRpb24gaXMgdG8gd3JhcCB0aGVcbiAgICogbWV0aG9kIG9yIGZ1bmN0aW9uIGNhbGwgaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24uIEFub3RoZXIgc29sdXRpb24gaXMgdG9cbiAgICogdXNlIGBiaW5kYC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7IGNhdC5tZW93KCk7IH0pLnRvLnRocm93KCk7ICAvLyBGdW5jdGlvbiBleHByZXNzaW9uXG4gICAqICAgICBleHBlY3QoKCkgPT4gY2F0Lm1lb3coKSkudG8udGhyb3coKTsgICAgICAgICAgICAgLy8gRVM2IGFycm93IGZ1bmN0aW9uXG4gICAqICAgICBleHBlY3QoY2F0Lm1lb3cuYmluZChjYXQpKS50by50aHJvdygpOyAgICAgICAgICAgLy8gQmluZFxuICAgKlxuICAgKiBGaW5hbGx5LCBpdCdzIHdvcnRoIG1lbnRpb25pbmcgdGhhdCBpdCdzIGEgYmVzdCBwcmFjdGljZSBpbiBKYXZhU2NyaXB0IHRvXG4gICAqIG9ubHkgdGhyb3cgYEVycm9yYCBhbmQgZGVyaXZhdGl2ZXMgb2YgYEVycm9yYCBzdWNoIGFzIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAqIGBUeXBlRXJyb3JgLCBhbmQgdXNlci1kZWZpbmVkIG9iamVjdHMgdGhhdCBleHRlbmQgYEVycm9yYC4gTm8gb3RoZXIgdHlwZSBvZlxuICAgKiB2YWx1ZSB3aWxsIGdlbmVyYXRlIGEgc3RhY2sgdHJhY2Ugd2hlbiBpbml0aWFsaXplZC4gV2l0aCB0aGF0IHNhaWQsIHRoZVxuICAgKiBgdGhyb3dgIGFzc2VydGlvbiBkb2VzIHRlY2huaWNhbGx5IHN1cHBvcnQgYW55IHR5cGUgb2YgdmFsdWUgYmVpbmcgdGhyb3duLFxuICAgKiBub3QganVzdCBgRXJyb3JgIGFuZCBpdHMgZGVyaXZhdGl2ZXMuXG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAudGhyb3dzYCBhbmQgYC5UaHJvd2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGhcbiAgICogYC50aHJvd2AuXG4gICAqXG4gICAqIEBuYW1lIHRocm93XG4gICAqIEBhbGlhcyB0aHJvd3NcbiAgICogQGFsaWFzIFRocm93XG4gICAqIEBwYXJhbSB7RXJyb3J8RXJyb3JDb25zdHJ1Y3Rvcn0gZXJyb3JMaWtlXG4gICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gZXJyTXNnTWF0Y2hlciBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0Vycm9yX3R5cGVzXG4gICAqIEByZXR1cm5zIGVycm9yIGZvciBjaGFpbmluZyAobnVsbCBpZiBubyBlcnJvcilcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0VGhyb3dzIChlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgbmVnYXRlID0gZmxhZyh0aGlzLCAnbmVnYXRlJykgfHwgZmFsc2U7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHR5cGVvZiBlcnJvckxpa2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY2F1Z2h0RXJyO1xuICAgIHRyeSB7XG4gICAgICBvYmooKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhdWdodEVyciA9IGVycjtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIHRoZSBuZWdhdGUgZmxhZyBlbmFibGVkIGFuZCBhdCBsZWFzdCBvbmUgdmFsaWQgYXJndW1lbnQgaXQgbWVhbnMgd2UgZG8gZXhwZWN0IGFuIGVycm9yXG4gICAgLy8gYnV0IHdlIHdhbnQgaXQgdG8gbWF0Y2ggYSBnaXZlbiBzZXQgb2YgY3JpdGVyaWFcbiAgICB2YXIgZXZlcnlBcmdJc1VuZGVmaW5lZCA9IGVycm9yTGlrZSA9PT0gdW5kZWZpbmVkICYmIGVyck1zZ01hdGNoZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHdlJ3ZlIGdvdCB0aGUgbmVnYXRlIGZsYWcgZW5hYmxlZCBhbmQgYm90aCBhcmdzLCB3ZSBzaG91bGQgb25seSBmYWlsIGlmIGJvdGggYXJlbid0IGNvbXBhdGlibGVcbiAgICAvLyBTZWUgSXNzdWUgIzU1MSBhbmQgUFIgIzY4M0BHaXRIdWJcbiAgICB2YXIgZXZlcnlBcmdJc0RlZmluZWQgPSBCb29sZWFuKGVycm9yTGlrZSAmJiBlcnJNc2dNYXRjaGVyKTtcbiAgICB2YXIgZXJyb3JMaWtlRmFpbCA9IGZhbHNlO1xuICAgIHZhciBlcnJNc2dNYXRjaGVyRmFpbCA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgZXJyb3Igd2FzIHRocm93blxuICAgIGlmIChldmVyeUFyZ0lzVW5kZWZpbmVkIHx8ICFldmVyeUFyZ0lzVW5kZWZpbmVkICYmICFuZWdhdGUpIHtcbiAgICAgIC8vIFdlIG5lZWQgdGhpcyB0byBkaXNwbGF5IHJlc3VsdHMgY29ycmVjdGx5IGFjY29yZGluZyB0byB0aGVpciB0eXBlc1xuICAgICAgdmFyIGVycm9yTGlrZVN0cmluZyA9ICdhbiBlcnJvcic7XG4gICAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgZXJyb3JMaWtlU3RyaW5nID0gJyN7ZXhwfSc7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yTGlrZSkge1xuICAgICAgICBlcnJvckxpa2VTdHJpbmcgPSBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGNhdWdodEVyclxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICcgKyBlcnJvckxpa2VTdHJpbmdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgYW4gZXJyb3IgYnV0ICN7YWN0fSB3YXMgdGhyb3duJ1xuICAgICAgICAsIGVycm9yTGlrZSAmJiBlcnJvckxpa2UudG9TdHJpbmcoKVxuICAgICAgICAsIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/XG4gICAgICAgICAgICBjYXVnaHRFcnIudG9TdHJpbmcoKSA6ICh0eXBlb2YgY2F1Z2h0RXJyID09PSAnc3RyaW5nJyA/IGNhdWdodEVyciA6IGNhdWdodEVyciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5jaGVja0Vycm9yLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yTGlrZSAmJiBjYXVnaHRFcnIpIHtcbiAgICAgIC8vIFdlIHNob3VsZCBjb21wYXJlIGluc3RhbmNlcyBvbmx5IGlmIGBlcnJvckxpa2VgIGlzIGFuIGluc3RhbmNlIG9mIGBFcnJvcmBcbiAgICAgIGlmIChlcnJvckxpa2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB2YXIgaXNDb21wYXRpYmxlSW5zdGFuY2UgPSBfLmNoZWNrRXJyb3IuY29tcGF0aWJsZUluc3RhbmNlKGNhdWdodEVyciwgZXJyb3JMaWtlKTtcblxuICAgICAgICBpZiAoaXNDb21wYXRpYmxlSW5zdGFuY2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICAgIC8vIFRoZXNlIGNoZWNrcyB3ZXJlIGNyZWF0ZWQgdG8gZW5zdXJlIHdlIHdvbid0IGZhaWwgdG9vIHNvb24gd2hlbiB3ZSd2ZSBnb3QgYm90aCBhcmdzIGFuZCBhIG5lZ2F0ZVxuICAgICAgICAgIC8vIFNlZSBJc3N1ZSAjNTUxIGFuZCBQUiAjNjgzQEdpdEh1YlxuICAgICAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgICAgIGVycm9yTGlrZUZhaWwgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyAje2V4cH0gYnV0ICN7YWN0fSB3YXMgdGhyb3duJ1xuICAgICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH0nICsgKGNhdWdodEVyciAmJiAhbmVnYXRlID8gJyBidXQgI3thY3R9IHdhcyB0aHJvd24nIDogJycpXG4gICAgICAgICAgICAgICwgZXJyb3JMaWtlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgLCBjYXVnaHRFcnIudG9TdHJpbmcoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGlzQ29tcGF0aWJsZUNvbnN0cnVjdG9yID0gXy5jaGVja0Vycm9yLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihjYXVnaHRFcnIsIGVycm9yTGlrZSk7XG4gICAgICBpZiAoaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgICBlcnJvckxpa2VGYWlsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgbmVnYXRlXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICN7ZXhwfSBidXQgI3thY3R9IHdhcyB0aHJvd24nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH0nICsgKGNhdWdodEVyciA/ICcgYnV0ICN7YWN0fSB3YXMgdGhyb3duJyA6ICcnKVxuICAgICAgICAgICAgLCAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkpXG4gICAgICAgICAgICAsIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVyci50b1N0cmluZygpIDogY2F1Z2h0RXJyICYmIF8uY2hlY2tFcnJvci5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNhdWdodEVyciAmJiBlcnJNc2dNYXRjaGVyICE9PSB1bmRlZmluZWQgJiYgZXJyTXNnTWF0Y2hlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSGVyZSB3ZSBjaGVjayBjb21wYXRpYmxlIG1lc3NhZ2VzXG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSAnaW5jbHVkaW5nJztcbiAgICAgIGlmIChlcnJNc2dNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyID0gJ21hdGNoaW5nJ1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNDb21wYXRpYmxlTWVzc2FnZSA9IF8uY2hlY2tFcnJvci5jb21wYXRpYmxlTWVzc2FnZShjYXVnaHRFcnIsIGVyck1zZ01hdGNoZXIpO1xuICAgICAgaWYgKGlzQ29tcGF0aWJsZU1lc3NhZ2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgICBlcnJNc2dNYXRjaGVyRmFpbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3IgJyArIHBsYWNlaG9sZGVyICsgJyAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IGVycm9yIG5vdCAnICsgcGxhY2Vob2xkZXIgKyAnICN7ZXhwfSdcbiAgICAgICAgICAgICwgIGVyck1zZ01hdGNoZXJcbiAgICAgICAgICAgICwgIF8uY2hlY2tFcnJvci5nZXRNZXNzYWdlKGNhdWdodEVycilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYm90aCBhc3NlcnRpb25zIGZhaWxlZCBhbmQgYm90aCBzaG91bGQndmUgbWF0Y2hlZCB3ZSB0aHJvdyBhbiBlcnJvclxuICAgIGlmIChlcnJvckxpa2VGYWlsICYmIGVyck1zZ01hdGNoZXJGYWlsKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbmVnYXRlXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93bidcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgI3tleHB9JyArIChjYXVnaHRFcnIgPyAnIGJ1dCAje2FjdH0gd2FzIHRocm93bicgOiAnJylcbiAgICAgICAgLCAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkpXG4gICAgICAgICwgKGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyLnRvU3RyaW5nKCkgOiBjYXVnaHRFcnIgJiYgXy5jaGVja0Vycm9yLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBjYXVnaHRFcnIpO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3Rocm93JywgYXNzZXJ0VGhyb3dzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgndGhyb3dzJywgYXNzZXJ0VGhyb3dzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnVGhyb3cnLCBhc3NlcnRUaHJvd3MpO1xuXG4gIC8qKlxuICAgKiAjIyMgLnJlc3BvbmRUbyhtZXRob2RbLCBtc2ddKVxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBgLnJlc3BvbmRUb2AgYXNzZXJ0cyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgaGFzIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgYG1ldGhvZGAuIFRoZSBtZXRob2QgY2FuIGJlIG93biBvclxuICAgKiBpbmhlcml0ZWQsIGFuZCBpdCBjYW4gYmUgZW51bWVyYWJsZSBvciBub24tZW51bWVyYWJsZS5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7fVxuICAgKiAgICAgQ2F0LnByb3RvdHlwZS5tZW93ID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IENhdCgpKS50by5yZXNwb25kVG8oJ21lb3cnKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgZnVuY3Rpb24sIGAucmVzcG9uZFRvYCBhc3NlcnRzIHRoYXQgdGhlIHRhcmdldCdzXG4gICAqIGBwcm90b3R5cGVgIHByb3BlcnR5IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGBtZXRob2RgLiBBZ2FpbiwgdGhlXG4gICAqIG1ldGhvZCBjYW4gYmUgb3duIG9yIGluaGVyaXRlZCwgYW5kIGl0IGNhbiBiZSBlbnVtZXJhYmxlIG9yIG5vbi1lbnVtZXJhYmxlLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gQ2F0ICgpIHt9XG4gICAqICAgICBDYXQucHJvdG90eXBlLm1lb3cgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLnRvLnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBBZGQgYC5pdHNlbGZgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGZvcmNlIGAucmVzcG9uZFRvYCB0byB0cmVhdCB0aGVcbiAgICogdGFyZ2V0IGFzIGEgbm9uLWZ1bmN0aW9uIG9iamVjdCwgZXZlbiBpZiBpdCdzIGEgZnVuY3Rpb24uIFRodXMsIGl0IGFzc2VydHNcbiAgICogdGhhdCB0aGUgdGFyZ2V0IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGBtZXRob2RgLCByYXRoZXIgdGhhblxuICAgKiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0J3MgYHByb3RvdHlwZWAgcHJvcGVydHkgaGFzIGEgbWV0aG9kIHdpdGggdGhlXG4gICAqIGdpdmVuIG5hbWUgYG1ldGhvZGAuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiBDYXQgKCkge31cbiAgICogICAgIENhdC5wcm90b3R5cGUubWVvdyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKiAgICAgQ2F0Lmhpc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLml0c2VsZi50by5yZXNwb25kVG8oJ2hpc3MnKS5idXQubm90LnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBXaGVuIG5vdCBhZGRpbmcgYC5pdHNlbGZgLCBpdCdzIGltcG9ydGFudCB0byBjaGVjayB0aGUgdGFyZ2V0J3MgdHlwZSBiZWZvcmVcbiAgICogdXNpbmcgYC5yZXNwb25kVG9gLiBTZWUgdGhlIGAuYWAgZG9jIGZvciBpbmZvIG9uIGNoZWNraW5nIGEgdGFyZ2V0J3MgdHlwZS5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7fVxuICAgKiAgICAgQ2F0LnByb3RvdHlwZS5tZW93ID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IENhdCgpKS50by5iZS5hbignb2JqZWN0JykudGhhdC5yZXNwb25kc1RvKCdtZW93Jyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAucmVzcG9uZFRvYC5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIERvZyAoKSB7fVxuICAgKiAgICAgRG9nLnByb3RvdHlwZS5iYXJrID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IERvZygpKS50by5ub3QucmVzcG9uZFRvKCdtZW93Jyk7XG4gICAqXG4gICAqIGAucmVzcG9uZFRvYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe30pLnRvLnJlc3BvbmRUbygnbWVvdycsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7fSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5yZXNwb25kc1RvYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLnJlc3BvbmRUb2AuXG4gICAqXG4gICAqIEBuYW1lIHJlc3BvbmRUb1xuICAgKiBAYWxpYXMgcmVzcG9uZHNUb1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiByZXNwb25kVG8gKG1ldGhvZCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGl0c2VsZiA9IGZsYWcodGhpcywgJ2l0c2VsZicpXG4gICAgICAsIGNvbnRleHQgPSAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iaiAmJiAhaXRzZWxmKVxuICAgICAgICA/IG9iai5wcm90b3R5cGVbbWV0aG9kXVxuICAgICAgICA6IG9ialttZXRob2RdO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBjb250ZXh0XG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHJlc3BvbmQgdG8gJyArIF8uaW5zcGVjdChtZXRob2QpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCByZXNwb25kIHRvICcgKyBfLmluc3BlY3QobWV0aG9kKVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdyZXNwb25kVG8nLCByZXNwb25kVG8pO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdyZXNwb25kc1RvJywgcmVzcG9uZFRvKTtcblxuICAvKipcbiAgICogIyMjIC5pdHNlbGZcbiAgICpcbiAgICogRm9yY2VzIGFsbCBgLnJlc3BvbmRUb2AgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gYmVoYXZlIGFzIGlmXG4gICAqIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBldmVuIGlmIGl0J3MgYSBmdW5jdGlvbi4gVGh1cywgaXRcbiAgICogY2F1c2VzIGAucmVzcG9uZFRvYCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlblxuICAgKiBuYW1lLCByYXRoZXIgdGhhbiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0J3MgYHByb3RvdHlwZWAgcHJvcGVydHkgaGFzIGFcbiAgICogbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiBDYXQgKCkge31cbiAgICogICAgIENhdC5wcm90b3R5cGUubWVvdyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKiAgICAgQ2F0Lmhpc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLml0c2VsZi50by5yZXNwb25kVG8oJ2hpc3MnKS5idXQubm90LnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBAbmFtZSBpdHNlbGZcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdpdHNlbGYnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnaXRzZWxmJywgdHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLnNhdGlzZnkobWF0Y2hlclssIG1zZ10pXG4gICAqXG4gICAqIEludm9rZXMgdGhlIGdpdmVuIGBtYXRjaGVyYCBmdW5jdGlvbiB3aXRoIHRoZSB0YXJnZXQgYmVpbmcgcGFzc2VkIGFzIHRoZVxuICAgKiBmaXJzdCBhcmd1bWVudCwgYW5kIGFzc2VydHMgdGhhdCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgdHJ1dGh5LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLnNhdGlzZnkoZnVuY3Rpb24obnVtKSB7XG4gICAqICAgICAgIHJldHVybiBudW0gPiAwO1xuICAgKiAgICAgfSk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuc2F0aXNmeWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LnNhdGlzZnkoZnVuY3Rpb24obnVtKSB7XG4gICAqICAgICAgIHJldHVybiBudW0gPiAyO1xuICAgKiAgICAgfSk7XG4gICAqXG4gICAqIGAuc2F0aXNmeWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLnNhdGlzZnkoZnVuY3Rpb24obnVtKSB7XG4gICAqICAgICAgIHJldHVybiBudW0gPiAyO1xuICAgKiAgICAgfSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5zYXRpc2Z5KGZ1bmN0aW9uKG51bSkge1xuICAgKiAgICAgICByZXR1cm4gbnVtID4gMjtcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5zYXRpc2ZpZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuc2F0aXNmeWAuXG4gICAqXG4gICAqIEBuYW1lIHNhdGlzZnlcbiAgICogQGFsaWFzIHNhdGlzZmllc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBzYXRpc2Z5IChtYXRjaGVyLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgdmFyIHJlc3VsdCA9IG1hdGNoZXIob2JqKTtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgcmVzdWx0XG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHNhdGlzZnkgJyArIF8ub2JqRGlzcGxheShtYXRjaGVyKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3Qgc2F0aXNmeScgKyBfLm9iakRpc3BsYXkobWF0Y2hlcilcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyBmYWxzZSA6IHRydWVcbiAgICAgICwgcmVzdWx0XG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3NhdGlzZnknLCBzYXRpc2Z5KTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnc2F0aXNmaWVzJywgc2F0aXNmeSk7XG5cbiAgLyoqXG4gICAqICMjIyAuY2xvc2VUbyhleHBlY3RlZCwgZGVsdGFbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciB0aGF0J3Mgd2l0aGluIGEgZ2l2ZW4gKy8tIGBkZWx0YWAgcmFuZ2VcbiAgICogb2YgdGhlIGdpdmVuIG51bWJlciBgZXhwZWN0ZWRgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlXG4gICAqIHRhcmdldCBpcyBlcXVhbCB0byBpdHMgZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uZXF1YWwoMS41KTtcbiAgICpcbiAgICogICAgIC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uYmUuY2xvc2VUbygxLCAwLjUpO1xuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uYmUuY2xvc2VUbygyLCAwLjUpO1xuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uYmUuY2xvc2VUbygxLCAxKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5jbG9zZVRvYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmVxdWFsKDEuNSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMS41KS50by5ub3QuYmUuY2xvc2VUbygzLCAxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuY2xvc2VUb2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uYmUuY2xvc2VUbygzLCAxLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMS41LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuY2xvc2VUbygzLCAxKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuYXBwcm94aW1hdGVseWAgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5jbG9zZVRvYC5cbiAgICpcbiAgICogQG5hbWUgY2xvc2VUb1xuICAgKiBAYWxpYXMgYXBwcm94aW1hdGVseVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBjbG9zZVRvKGV4cGVjdGVkLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcblxuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKCdudW1iZXInKTtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgZGVsdGEgIT09ICdudW1iZXInKSB7XG4gICAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG4gICAgICB2YXIgZGVsdGFNZXNzYWdlID0gZGVsdGEgPT09IHVuZGVmaW5lZCA/IFwiLCBhbmQgYSBkZWx0YSBpcyByZXF1aXJlZFwiIDogXCJcIjtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICBmbGFnTXNnICsgJ3RoZSBhcmd1bWVudHMgdG8gY2xvc2VUbyBvciBhcHByb3hpbWF0ZWx5IG11c3QgYmUgbnVtYmVycycgKyBkZWx0YU1lc3NhZ2UsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIE1hdGguYWJzKG9iaiAtIGV4cGVjdGVkKSA8PSBkZWx0YVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byAnICsgZXhwZWN0ZWQgKyAnICsvLSAnICsgZGVsdGFcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIGNsb3NlIHRvICcgKyBleHBlY3RlZCArICcgKy8tICcgKyBkZWx0YVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdjbG9zZVRvJywgY2xvc2VUbyk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2FwcHJveGltYXRlbHknLCBjbG9zZVRvKTtcblxuICAvLyBOb3RlOiBEdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGlmIHRlc3RpbmcgZm9yIGluY2x1c2lvbiBpbnN0ZWFkIG9mIHNhbWVuZXNzLlxuICBmdW5jdGlvbiBpc1N1YnNldE9mKHN1YnNldCwgc3VwZXJzZXQsIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpIHtcbiAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICBpZiAoc3Vic2V0Lmxlbmd0aCAhPT0gc3VwZXJzZXQubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBzdXBlcnNldCA9IHN1cGVyc2V0LnNsaWNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnNldC5ldmVyeShmdW5jdGlvbihlbGVtLCBpZHgpIHtcbiAgICAgIGlmIChvcmRlcmVkKSByZXR1cm4gY21wID8gY21wKGVsZW0sIHN1cGVyc2V0W2lkeF0pIDogZWxlbSA9PT0gc3VwZXJzZXRbaWR4XTtcblxuICAgICAgaWYgKCFjbXApIHtcbiAgICAgICAgdmFyIG1hdGNoSWR4ID0gc3VwZXJzZXQuaW5kZXhPZihlbGVtKTtcbiAgICAgICAgaWYgKG1hdGNoSWR4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIFJlbW92ZSBtYXRjaCBmcm9tIHN1cGVyc2V0IHNvIG5vdCBjb3VudGVkIHR3aWNlIGlmIGR1cGxpY2F0ZSBpbiBzdWJzZXQuXG4gICAgICAgIGlmICghY29udGFpbnMpIHN1cGVyc2V0LnNwbGljZShtYXRjaElkeCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXJzZXQuc29tZShmdW5jdGlvbihlbGVtMiwgbWF0Y2hJZHgpIHtcbiAgICAgICAgaWYgKCFjbXAoZWxlbSwgZWxlbTIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVtb3ZlIG1hdGNoIGZyb20gc3VwZXJzZXQgc28gbm90IGNvdW50ZWQgdHdpY2UgaWYgZHVwbGljYXRlIGluIHN1YnNldC5cbiAgICAgICAgaWYgKCFjb250YWlucykgc3VwZXJzZXQuc3BsaWNlKG1hdGNoSWR4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm1lbWJlcnMoc2V0WywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgYXJyYXkgaGFzIHRoZSBzYW1lIG1lbWJlcnMgYXMgdGhlIGdpdmVuIGFycmF5XG4gICAqIGBzZXRgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5tZW1iZXJzKFsyLCAxLCAzXSk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDJdKS50by5oYXZlLm1lbWJlcnMoWzIsIDEsIDJdKTtcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgbWVtYmVycyBhcmUgY29tcGFyZWQgdXNpbmcgc3RyaWN0IChgPT09YCkgZXF1YWxpdHkuIEFkZCBgLmRlZXBgXG4gICAqIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5IGluc3RlYWQuIFNlZSB0aGUgYGRlZXAtZXFsYFxuICAgKiBwcm9qZWN0IHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIG1lbWJlciBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KFt7YTogMX1dKS50by5oYXZlLmRlZXAubWVtYmVycyhbe2E6IDF9XSk7XG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLm5vdC5oYXZlLm1lbWJlcnMoW3thOiAxfV0pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBvcmRlciBkb2Vzbid0IG1hdHRlci4gQWRkIGAub3JkZXJlZGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG9cbiAgICogcmVxdWlyZSB0aGF0IG1lbWJlcnMgYXBwZWFyIGluIHRoZSBzYW1lIG9yZGVyLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5vcmRlcmVkLm1lbWJlcnMoWzEsIDIsIDNdKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubWVtYmVycyhbMiwgMSwgM10pXG4gICAqICAgICAgIC5idXQubm90Lm9yZGVyZWQubWVtYmVycyhbMiwgMSwgM10pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBib3RoIGFycmF5cyBtdXN0IGJlIHRoZSBzYW1lIHNpemUuIEFkZCBgLmluY2x1ZGVgIGVhcmxpZXIgaW5cbiAgICogdGhlIGNoYWluIHRvIHJlcXVpcmUgdGhhdCB0aGUgdGFyZ2V0J3MgbWVtYmVycyBiZSBhIHN1cGVyc2V0IG9mIHRoZVxuICAgKiBleHBlY3RlZCBtZW1iZXJzLiBOb3RlIHRoYXQgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBpbiB0aGUgc3Vic2V0IHdoZW5cbiAgICogYC5pbmNsdWRlYCBpcyBhZGRlZC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBpcyBhIHN1cGVyc2V0IG9mIFsxLCAyXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaW5jbHVkZS5tZW1iZXJzKFsxLCAyXSk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5ub3QuaGF2ZS5tZW1iZXJzKFsxLCAyXSk7XG4gICAqXG4gICAqICAgICAvLyBEdXBsaWNhdGVzIGluIHRoZSBzdWJzZXQgYXJlIGlnbm9yZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUubWVtYmVycyhbMSwgMiwgMiwgMl0pO1xuICAgKlxuICAgKiBgLmRlZXBgLCBgLm9yZGVyZWRgLCBhbmQgYC5pbmNsdWRlYCBjYW4gYWxsIGJlIGNvbWJpbmVkLiBIb3dldmVyLCBpZlxuICAgKiBgLmluY2x1ZGVgIGFuZCBgLm9yZGVyZWRgIGFyZSBjb21iaW5lZCwgdGhlIG9yZGVyaW5nIGJlZ2lucyBhdCB0aGUgc3RhcnQgb2ZcbiAgICogYm90aCBhcnJheXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoW3thOiAxfSwge2I6IDJ9LCB7YzogM31dKVxuICAgKiAgICAgICAudG8uaW5jbHVkZS5kZWVwLm9yZGVyZWQubWVtYmVycyhbe2E6IDF9LCB7YjogMn1dKVxuICAgKiAgICAgICAuYnV0Lm5vdC5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKFt7YjogMn0sIHtjOiAzfV0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm1lbWJlcnNgLiBIb3dldmVyLCBpdCdzXG4gICAqIGRhbmdlcm91cyB0byBkbyBzby4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnNcbiAgICogYnkgYXNzZXJ0aW5nIHRoYXQgdGhlIHRhcmdldCBhcnJheSBkb2Vzbid0IGhhdmUgYWxsIG9mIHRoZSBzYW1lIG1lbWJlcnMgYXNcbiAgICogdGhlIGdpdmVuIGFycmF5IGBzZXRgIGJ1dCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNvbWUgb2YgdGhlbS4gSXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb25cbiAgICogdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5ub3QuaW5jbHVkZSgzKS5hbmQubm90LmluY2x1ZGUoNCk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5ub3QuaGF2ZS5tZW1iZXJzKFszLCA0XSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLm1lbWJlcnNgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmhhdmUubWVtYmVycyhbMSwgMiwgM10sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdChbMSwgMl0sICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLm1lbWJlcnMoWzEsIDIsIDNdKTtcbiAgICpcbiAgICogQG5hbWUgbWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ21lbWJlcnMnLCBmdW5jdGlvbiAoc3Vic2V0LCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuXG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLmFuKCdhcnJheScpO1xuICAgIG5ldyBBc3NlcnRpb24oc3Vic2V0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5hbignYXJyYXknKTtcblxuICAgIHZhciBjb250YWlucyA9IGZsYWcodGhpcywgJ2NvbnRhaW5zJyk7XG4gICAgdmFyIG9yZGVyZWQgPSBmbGFnKHRoaXMsICdvcmRlcmVkJyk7XG5cbiAgICB2YXIgc3ViamVjdCwgZmFpbE1zZywgZmFpbE5lZ2F0ZU1zZztcblxuICAgIGlmIChjb250YWlucykge1xuICAgICAgc3ViamVjdCA9IG9yZGVyZWQgPyAnYW4gb3JkZXJlZCBzdXBlcnNldCcgOiAnYSBzdXBlcnNldCc7XG4gICAgICBmYWlsTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgJyArIHN1YmplY3QgKyAnIG9mICN7ZXhwfSc7XG4gICAgICBmYWlsTmVnYXRlTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlICcgKyBzdWJqZWN0ICsgJyBvZiAje2V4cH0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJqZWN0ID0gb3JkZXJlZCA/ICdvcmRlcmVkIG1lbWJlcnMnIDogJ21lbWJlcnMnO1xuICAgICAgZmFpbE1zZyA9ICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgdGhlIHNhbWUgJyArIHN1YmplY3QgKyAnIGFzICN7ZXhwfSc7XG4gICAgICBmYWlsTmVnYXRlTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgdGhlIHNhbWUgJyArIHN1YmplY3QgKyAnIGFzICN7ZXhwfSc7XG4gICAgfVxuXG4gICAgdmFyIGNtcCA9IGZsYWcodGhpcywgJ2RlZXAnKSA/IF8uZXFsIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGlzU3Vic2V0T2Yoc3Vic2V0LCBvYmosIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpXG4gICAgICAsIGZhaWxNc2dcbiAgICAgICwgZmFpbE5lZ2F0ZU1zZ1xuICAgICAgLCBzdWJzZXRcbiAgICAgICwgb2JqXG4gICAgICAsIHRydWVcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5vbmVPZihsaXN0WywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBtZW1iZXIgb2YgdGhlIGdpdmVuIGFycmF5IGBsaXN0YC4gSG93ZXZlcixcbiAgICogaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLm9uZU9mKFsxLCAyLCAzXSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBDb21wYXJpc29ucyBhcmUgcGVyZm9ybWVkIHVzaW5nIHN0cmljdCAoYD09PWApIGVxdWFsaXR5LlxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm9uZU9mYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUub25lT2YoWzIsIDMsIDRdKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEl0IGNhbiBhbHNvIGJlIGNoYWluZWQgd2l0aCBgLmNvbnRhaW5gIG9yIGAuaW5jbHVkZWAsIHdoaWNoIHdpbGwgd29yayB3aXRoXG4gICAqIGJvdGggYXJyYXlzIGFuZCBzdHJpbmdzOlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdUb2RheSBpcyBzdW5ueScpLnRvLmNvbnRhaW4ub25lT2YoWydzdW5ueScsICdjbG91ZHknXSlcbiAgICogICAgIGV4cGVjdCgnVG9kYXkgaXMgcmFpbnknKS50by5ub3QuY29udGFpbi5vbmVPZihbJ3N1bm55JywgJ2Nsb3VkeSddKVxuICAgKiAgICAgZXhwZWN0KFsxLDIsM10pLnRvLmNvbnRhaW4ub25lT2YoWzMsNCw1XSlcbiAgICogICAgIGV4cGVjdChbMSwyLDNdKS50by5ub3QuY29udGFpbi5vbmVPZihbNCw1LDZdKVxuICAgKlxuICAgKiBgLm9uZU9mYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUub25lT2YoWzIsIDMsIDRdLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLm9uZU9mKFsyLCAzLCA0XSk7XG4gICAqXG4gICAqIEBuYW1lIG9uZU9mXG4gICAqIEBwYXJhbSB7QXJyYXk8Kj59IGxpc3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIG9uZU9mIChsaXN0LCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgZXhwZWN0ZWQgPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgY29udGFpbnMgPSBmbGFnKHRoaXMsICdjb250YWlucycpXG4gICAgICAsIGlzRGVlcCA9IGZsYWcodGhpcywgJ2RlZXAnKTtcbiAgICBuZXcgQXNzZXJ0aW9uKGxpc3QsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLmFuKCdhcnJheScpO1xuXG4gICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbGlzdC5zb21lKGZ1bmN0aW9uKHBvc3NpYmlsaXR5KSB7IHJldHVybiBleHBlY3RlZC5pbmRleE9mKHBvc3NpYmlsaXR5KSA+IC0xIH0pXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiBvbmUgb2YgI3tleHB9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIG9uZSBvZiAje2V4cH0nXG4gICAgICAgICwgbGlzdFxuICAgICAgICAsIGV4cGVjdGVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkgeyByZXR1cm4gXy5lcWwoZXhwZWN0ZWQsIHBvc3NpYmlsaXR5KSB9KVxuICAgICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gZGVlcGx5IGVxdWFsIG9uZSBvZiAje2V4cH0nXG4gICAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgb25lIG9mICN7ZXhwfSdcbiAgICAgICAgICAsIGxpc3RcbiAgICAgICAgICAsIGV4cGVjdGVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBsaXN0LmluZGV4T2YoZXhwZWN0ZWQpID4gLTFcbiAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIG9uZSBvZiAje2V4cH0nXG4gICAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgb25lIG9mICN7ZXhwfSdcbiAgICAgICAgICAsIGxpc3RcbiAgICAgICAgICAsIGV4cGVjdGVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnb25lT2YnLCBvbmVPZik7XG5cbiAgLyoqXG4gICAqICMjIyAuY2hhbmdlKHN1YmplY3RbLCBwcm9wWywgbXNnXV0pXG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBgLmNoYW5nZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBmdW5jdGlvblxuICAgKiBgc3ViamVjdGAgcmV0dXJucyBhIGRpZmZlcmVudCB2YWx1ZSB3aGVuIGl0J3MgaW52b2tlZCBiZWZvcmUgdGhlIHRhcmdldFxuICAgKiBmdW5jdGlvbiBjb21wYXJlZCB0byB3aGVuIGl0J3MgaW52b2tlZCBhZnRlcndhcmQuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCBgc3ViamVjdGAgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgdmFyIGRvdHMgPSAnJ1xuICAgKiAgICAgICAsIGFkZERvdCA9IGZ1bmN0aW9uICgpIHsgZG90cyArPSAnLic7IH1cbiAgICogICAgICAgLCBnZXREb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG90czsgfTtcbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoZ2V0RG90cygpKS50by5lcXVhbCgnJyk7XG4gICAqICAgICBhZGREb3QoKTtcbiAgICogICAgIGV4cGVjdChnZXREb3RzKCkpLnRvLmVxdWFsKCcuJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChhZGREb3QpLnRvLmNoYW5nZShnZXREb3RzKTtcbiAgICpcbiAgICogV2hlbiB0d28gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgYC5jaGFuZ2VgIGFzc2VydHMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIGdpdmVuIG9iamVjdCBgc3ViamVjdGAncyBgcHJvcGAgcHJvcGVydHkgaXMgZGlmZmVyZW50IGJlZm9yZSBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIGFmdGVyd2FyZC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHtkb3RzOiAnJ31cbiAgICogICAgICAgLCBhZGREb3QgPSBmdW5jdGlvbiAoKSB7IG15T2JqLmRvdHMgKz0gJy4nOyB9O1xuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChteU9iaikudG8uaGF2ZS5wcm9wZXJ0eSgnZG90cycsICcnKTtcbiAgICogICAgIGFkZERvdCgpO1xuICAgKiAgICAgZXhwZWN0KG15T2JqKS50by5oYXZlLnByb3BlcnR5KCdkb3RzJywgJy4nKTtcbiAgICpcbiAgICogICAgIC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZERvdCkudG8uY2hhbmdlKG15T2JqLCAnZG90cycpO1xuICAgKlxuICAgKiBTdHJpY3QgKGA9PT1gKSBlcXVhbGl0eSBpcyB1c2VkIHRvIGNvbXBhcmUgYmVmb3JlIGFuZCBhZnRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuY2hhbmdlYC5cbiAgICpcbiAgICogICAgIHZhciBkb3RzID0gJydcbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge31cbiAgICogICAgICAgLCBnZXREb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG90czsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wKS50by5ub3QuY2hhbmdlKGdldERvdHMpO1xuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge2RvdHM6ICcnfVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wKS50by5ub3QuY2hhbmdlKG15T2JqLCAnZG90cycpO1xuICAgKlxuICAgKiBgLmNoYW5nZWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzXG4gICAqIHVzZSB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7ZG90czogJyd9XG4gICAqICAgICAgICwgYWRkRG90ID0gZnVuY3Rpb24gKCkgeyBteU9iai5kb3RzICs9ICcuJzsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGREb3QpLnRvLm5vdC5jaGFuZ2UobXlPYmosICdkb3RzJywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiAgICAgdmFyIGRvdHMgPSAnJ1xuICAgKiAgICAgICAsIGFkZERvdCA9IGZ1bmN0aW9uICgpIHsgZG90cyArPSAnLic7IH1cbiAgICogICAgICAgLCBnZXREb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG90czsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGREb3QsICdub29vIHdoeSBmYWlsPz8nKS50by5ub3QuY2hhbmdlKGdldERvdHMpO1xuICAgKlxuICAgKiBgLmNoYW5nZWAgYWxzbyBjYXVzZXMgYWxsIGAuYnlgIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluIHRvXG4gICAqIGFzc2VydCBob3cgbXVjaCBhIG51bWVyaWMgc3ViamVjdCB3YXMgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBieS4gSG93ZXZlcixcbiAgICogaXQncyBkYW5nZXJvdXMgdG8gdXNlIGAuY2hhbmdlLmJ5YC4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzXG4gICAqIHVuY2VydGFpbiBleHBlY3RhdGlvbnMgYnkgYXNzZXJ0aW5nIHRoYXQgdGhlIHN1YmplY3QgZWl0aGVyIGluY3JlYXNlcyBieVxuICAgKiB0aGUgZ2l2ZW4gZGVsdGEsIG9yIHRoYXQgaXQgZGVjcmVhc2VzIGJ5IHRoZSBnaXZlbiBkZWx0YS4gSXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb25cbiAgICogdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uY2hhbmdlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5jaGFuZ2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmNoYW5nZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuY2hhbmdlYC5cbiAgICpcbiAgICogQG5hbWUgY2hhbmdlXG4gICAqIEBhbGlhcyBjaGFuZ2VzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlcyAoc3ViamVjdCwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIGZuID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICB2YXIgaW5pdGlhbDtcbiAgICBpZiAoIXByb3ApIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICAgIH1cblxuICAgIGZuKCk7XG5cbiAgICB2YXIgZmluYWwgPSBwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcCA9PT0gbnVsbCA/IHN1YmplY3QoKSA6IHN1YmplY3RbcHJvcF07XG4gICAgdmFyIG1zZ09iaiA9IHByb3AgPT09IHVuZGVmaW5lZCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6ICcuJyArIHByb3A7XG5cbiAgICAvLyBUaGlzIGdldHMgZmxhZ2dlZCBiZWNhdXNlIG9mIHRoZSAuYnkoZGVsdGEpIGFzc2VydGlvblxuICAgIGZsYWcodGhpcywgJ2RlbHRhTXNnT2JqJywgbXNnT2JqKTtcbiAgICBmbGFnKHRoaXMsICdpbml0aWFsRGVsdGFWYWx1ZScsIGluaXRpYWwpO1xuICAgIGZsYWcodGhpcywgJ2ZpbmFsRGVsdGFWYWx1ZScsIGZpbmFsKTtcbiAgICBmbGFnKHRoaXMsICdkZWx0YUJlaGF2aW9yJywgJ2NoYW5nZScpO1xuICAgIGZsYWcodGhpcywgJ3JlYWxEZWx0YScsIGZpbmFsICE9PSBpbml0aWFsKTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaW5pdGlhbCAhPT0gZmluYWxcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIGNoYW5nZSdcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIG5vdCBjaGFuZ2UnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2NoYW5nZScsIGFzc2VydENoYW5nZXMpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdjaGFuZ2VzJywgYXNzZXJ0Q2hhbmdlcyk7XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jcmVhc2Uoc3ViamVjdFssIHByb3BbLCBtc2ddXSlcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGAuaW5jcmVhc2VgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb25cbiAgICogYHN1YmplY3RgIHJldHVybnMgYSBncmVhdGVyIG51bWJlciB3aGVuIGl0J3MgaW52b2tlZCBhZnRlciBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIHdoZW4gaXQncyBpbnZva2VkIGJlZm9yZWhhbmQuIGAuaW5jcmVhc2VgIGFsc29cbiAgICogY2F1c2VzIGFsbCBgLmJ5YCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byBhc3NlcnQgaG93IG11Y2hcbiAgICogZ3JlYXRlciBvZiBhIG51bWJlciBpcyByZXR1cm5lZC4gSXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSByZXR1cm5cbiAgICogdmFsdWUgaW5jcmVhc2VkIGJ5IHRoZSBleHBlY3RlZCBhbW91bnQsIHJhdGhlciB0aGFuIGFzc2VydGluZyBpdCBpbmNyZWFzZWRcbiAgICogYnkgYW55IGFtb3VudC5cbiAgICpcbiAgICogICAgIHZhciB2YWwgPSAxXG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyB2YWwgKz0gMjsgfVxuICAgKiAgICAgICAsIGdldFZhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbDsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmluY3JlYXNlKGdldFZhbCkuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShnZXRWYWwpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0d28gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgYC5pbmNyZWFzZWAgYXNzZXJ0cyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGVcbiAgICogZ2l2ZW4gb2JqZWN0IGBzdWJqZWN0YCdzIGBwcm9wYCBwcm9wZXJ0eSBpcyBncmVhdGVyIGFmdGVyIGludm9raW5nIHRoZVxuICAgKiB0YXJnZXQgZnVuY3Rpb24gY29tcGFyZWQgdG8gYmVmb3JlaGFuZC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgKz0gMjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmluY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5pbmNyZWFzZWAuIEhvd2V2ZXIsIGl0J3NcbiAgICogZGFuZ2Vyb3VzIHRvIGRvIHNvLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9uc1xuICAgKiBieSBhc3NlcnRpbmcgdGhhdCB0aGUgc3ViamVjdCBlaXRoZXIgZGVjcmVhc2VzLCBvciB0aGF0IGl0IHN0YXlzIHRoZSBzYW1lLlxuICAgKiBJdCdzIG9mdGVuIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuXG4gICAqIHdyaXRlIGFuIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgc3ViamVjdCBpcyBleHBlY3RlZCB0byBkZWNyZWFzZSwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IGl0XG4gICAqIGRlY3JlYXNlZCBieSB0aGUgZXhwZWN0ZWQgYW1vdW50LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLm5vdC5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgc3ViamVjdCBpcyBleHBlY3RlZCB0byBzdGF5IHRoZSBzYW1lLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vb3ApLnRvLm5vdC5jaGFuZ2UobXlPYmosICd2YWwnKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChub29wKS50by5ub3QuaW5jcmVhc2UobXlPYmosICd2YWwnKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuaW5jcmVhc2VgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nIHR3byBhcmd1bWVudHMsIGFsd2F5c1xuICAgKiB1c2UgdGhlIHNlY29uZCBmb3JtLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8uaW5jcmVhc2UobXlPYmosICd2YWwnLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqXG4gICAqICAgICB2YXIgdmFsID0gMVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxuICAgKiAgICAgICAsIGdldFZhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbDsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaW5jcmVhc2UoZ2V0VmFsKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuaW5jcmVhc2VzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmluY3JlYXNlYC5cbiAgICpcbiAgICogQG5hbWUgaW5jcmVhc2VcbiAgICogQGFsaWFzIGluY3JlYXNlc1xuICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc3ViamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEluY3JlYXNlcyAoc3ViamVjdCwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIGZuID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICB2YXIgaW5pdGlhbDtcbiAgICBpZiAoIXByb3ApIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXJcbiAgICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ251bWJlcicpO1xuXG4gICAgZm4oKTtcblxuICAgIHZhciBmaW5hbCA9IHByb3AgPT09IHVuZGVmaW5lZCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgICB2YXIgbXNnT2JqID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBpbml0aWFsIDogJy4nICsgcHJvcDtcblxuICAgIGZsYWcodGhpcywgJ2RlbHRhTXNnT2JqJywgbXNnT2JqKTtcbiAgICBmbGFnKHRoaXMsICdpbml0aWFsRGVsdGFWYWx1ZScsIGluaXRpYWwpO1xuICAgIGZsYWcodGhpcywgJ2ZpbmFsRGVsdGFWYWx1ZScsIGZpbmFsKTtcbiAgICBmbGFnKHRoaXMsICdkZWx0YUJlaGF2aW9yJywgJ2luY3JlYXNlJyk7XG4gICAgZmxhZyh0aGlzLCAncmVhbERlbHRhJywgZmluYWwgLSBpbml0aWFsKTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZmluYWwgLSBpbml0aWFsID4gMFxuICAgICAgLCAnZXhwZWN0ZWQgJyArIG1zZ09iaiArICcgdG8gaW5jcmVhc2UnXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBub3QgaW5jcmVhc2UnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2luY3JlYXNlJywgYXNzZXJ0SW5jcmVhc2VzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaW5jcmVhc2VzJywgYXNzZXJ0SW5jcmVhc2VzKTtcblxuICAvKipcbiAgICogIyMjIC5kZWNyZWFzZShzdWJqZWN0WywgcHJvcFssIG1zZ11dKVxuICAgKlxuICAgKiBXaGVuIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgYC5kZWNyZWFzZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBmdW5jdGlvblxuICAgKiBgc3ViamVjdGAgcmV0dXJucyBhIGxlc3NlciBudW1iZXIgd2hlbiBpdCdzIGludm9rZWQgYWZ0ZXIgaW52b2tpbmcgdGhlXG4gICAqIHRhcmdldCBmdW5jdGlvbiBjb21wYXJlZCB0byB3aGVuIGl0J3MgaW52b2tlZCBiZWZvcmVoYW5kLiBgLmRlY3JlYXNlYCBhbHNvXG4gICAqIGNhdXNlcyBhbGwgYC5ieWAgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IGhvdyBtdWNoXG4gICAqIGxlc3NlciBvZiBhIG51bWJlciBpcyByZXR1cm5lZC4gSXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSByZXR1cm5cbiAgICogdmFsdWUgZGVjcmVhc2VkIGJ5IHRoZSBleHBlY3RlZCBhbW91bnQsIHJhdGhlciB0aGFuIGFzc2VydGluZyBpdCBkZWNyZWFzZWRcbiAgICogYnkgYW55IGFtb3VudC5cbiAgICpcbiAgICogICAgIHZhciB2YWwgPSAxXG4gICAqICAgICAgICwgc3VidHJhY3RUd28gPSBmdW5jdGlvbiAoKSB7IHZhbCAtPSAyOyB9XG4gICAqICAgICAgICwgZ2V0VmFsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShnZXRWYWwpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShnZXRWYWwpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0d28gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgYC5kZWNyZWFzZWAgYXNzZXJ0cyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGVcbiAgICogZ2l2ZW4gb2JqZWN0IGBzdWJqZWN0YCdzIGBwcm9wYCBwcm9wZXJ0eSBpcyBsZXNzZXIgYWZ0ZXIgaW52b2tpbmcgdGhlXG4gICAqIHRhcmdldCBmdW5jdGlvbiBjb21wYXJlZCB0byBiZWZvcmVoYW5kLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmRlY3JlYXNlYC4gSG93ZXZlciwgaXQnc1xuICAgKiBkYW5nZXJvdXMgdG8gZG8gc28uIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zXG4gICAqIGJ5IGFzc2VydGluZyB0aGF0IHRoZSBzdWJqZWN0IGVpdGhlciBpbmNyZWFzZXMsIG9yIHRoYXQgaXQgc3RheXMgdGhlIHNhbWUuXG4gICAqIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQncyBleHBlY3RlZCwgYW5kIHRoZW5cbiAgICogd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiBXaGVuIHRoZSBzdWJqZWN0IGlzIGV4cGVjdGVkIHRvIGluY3JlYXNlLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgaXRcbiAgICogaW5jcmVhc2VkIGJ5IHRoZSBleHBlY3RlZCBhbW91bnQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8ubm90LmRlY3JlYXNlKG15T2JqLCAndmFsJyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSBzdWJqZWN0IGlzIGV4cGVjdGVkIHRvIHN0YXkgdGhlIHNhbWUsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnRcbiAgICogZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8ubm90LmNoYW5nZShteU9iaiwgJ3ZhbCcpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KG5vb3ApLnRvLm5vdC5kZWNyZWFzZShteU9iaiwgJ3ZhbCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5kZWNyZWFzZWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzXG4gICAqIHVzZSB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wKS50by5kZWNyZWFzZShteU9iaiwgJ3ZhbCcsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIHZhciB2YWwgPSAxXG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG4gICAqICAgICAgICwgZ2V0VmFsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vb3AsICdub29vIHdoeSBmYWlsPz8nKS50by5kZWNyZWFzZShnZXRWYWwpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5kZWNyZWFzZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuZGVjcmVhc2VgLlxuICAgKlxuICAgKiBAbmFtZSBkZWNyZWFzZVxuICAgKiBAYWxpYXMgZGVjcmVhc2VzXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzdWJqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0RGVjcmVhc2VzIChzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgZm4gPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG4gICAgbmV3IEFzc2VydGlvbihmbiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcblxuICAgIHZhciBpbml0aWFsO1xuICAgIGlmICghcHJvcCkge1xuICAgICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKCdmdW5jdGlvbicpO1xuICAgICAgaW5pdGlhbCA9IHN1YmplY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgICAgaW5pdGlhbCA9IHN1YmplY3RbcHJvcF07XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlclxuICAgIG5ldyBBc3NlcnRpb24oaW5pdGlhbCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnbnVtYmVyJyk7XG5cbiAgICBmbigpO1xuXG4gICAgdmFyIGZpbmFsID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBzdWJqZWN0KCkgOiBzdWJqZWN0W3Byb3BdO1xuICAgIHZhciBtc2dPYmogPSBwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcCA9PT0gbnVsbCA/IGluaXRpYWwgOiAnLicgKyBwcm9wO1xuXG4gICAgZmxhZyh0aGlzLCAnZGVsdGFNc2dPYmonLCBtc2dPYmopO1xuICAgIGZsYWcodGhpcywgJ2luaXRpYWxEZWx0YVZhbHVlJywgaW5pdGlhbCk7XG4gICAgZmxhZyh0aGlzLCAnZmluYWxEZWx0YVZhbHVlJywgZmluYWwpO1xuICAgIGZsYWcodGhpcywgJ2RlbHRhQmVoYXZpb3InLCAnZGVjcmVhc2UnKTtcbiAgICBmbGFnKHRoaXMsICdyZWFsRGVsdGEnLCBpbml0aWFsIC0gZmluYWwpO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBmaW5hbCAtIGluaXRpYWwgPCAwXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBkZWNyZWFzZSdcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIG5vdCBkZWNyZWFzZSdcbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZGVjcmVhc2UnLCBhc3NlcnREZWNyZWFzZXMpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdkZWNyZWFzZXMnLCBhc3NlcnREZWNyZWFzZXMpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmJ5KGRlbHRhWywgbXNnXSlcbiAgICpcbiAgICogV2hlbiBmb2xsb3dpbmcgYW4gYC5pbmNyZWFzZWAgYXNzZXJ0aW9uIGluIHRoZSBjaGFpbiwgYC5ieWAgYXNzZXJ0cyB0aGF0XG4gICAqIHRoZSBzdWJqZWN0IG9mIHRoZSBgLmluY3JlYXNlYCBhc3NlcnRpb24gaW5jcmVhc2VkIGJ5IHRoZSBnaXZlbiBgZGVsdGFgLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBhZGRUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCArPSAyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTtcbiAgICpcbiAgICogV2hlbiBmb2xsb3dpbmcgYSBgLmRlY3JlYXNlYCBhc3NlcnRpb24gaW4gdGhlIGNoYWluLCBgLmJ5YCBhc3NlcnRzIHRoYXQgdGhlXG4gICAqIHN1YmplY3Qgb2YgdGhlIGAuZGVjcmVhc2VgIGFzc2VydGlvbiBkZWNyZWFzZWQgYnkgdGhlIGdpdmVuIGBkZWx0YWAuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIHN1YnRyYWN0VHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgLT0gMjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uZGVjcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTtcbiAgICpcbiAgICogV2hlbiBmb2xsb3dpbmcgYSBgLmNoYW5nZWAgYXNzZXJ0aW9uIGluIHRoZSBjaGFpbiwgYC5ieWAgYXNzZXJ0cyB0aGF0IHRoZVxuICAgKiBzdWJqZWN0IG9mIHRoZSBgLmNoYW5nZWAgYXNzZXJ0aW9uIGVpdGhlciBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGJ5IHRoZVxuICAgKiBnaXZlbiBgZGVsdGFgLiBIb3dldmVyLCBpdCdzIGRhbmdlcm91cyB0byB1c2UgYC5jaGFuZ2UuYnlgLiBUaGUgcHJvYmxlbSBpc1xuICAgKiB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9ucy4gSXQncyBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZVxuICAgKiBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHNcbiAgICogdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uY2hhbmdlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5jaGFuZ2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuYnlgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3RcbiAgICogdG8gYXNzZXJ0IHRoYXQgdGhlIHN1YmplY3QgY2hhbmdlZCBieSBpdHMgZXhwZWN0ZWQgZGVsdGEsIHJhdGhlciB0aGFuXG4gICAqIGFzc2VydGluZyB0aGF0IGl0IGRpZG4ndCBjaGFuZ2UgYnkgb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIGRlbHRhcy5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgKz0gMjsgfTtcbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ1dC5ub3QuYnkoMyk7XG4gICAqXG4gICAqIGAuYnlgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSB0b1xuICAgKiBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZFxuICAgKiBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgKz0gMjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmluY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KGFkZFR3bywgJ25vb28gd2h5IGZhaWw/PycpLnRvLmluY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMyk7XG4gICAqXG4gICAqIEBuYW1lIGJ5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0RGVsdGEoZGVsdGEsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuXG4gICAgdmFyIG1zZ09iaiA9IGZsYWcodGhpcywgJ2RlbHRhTXNnT2JqJyk7XG4gICAgdmFyIGluaXRpYWwgPSBmbGFnKHRoaXMsICdpbml0aWFsRGVsdGFWYWx1ZScpO1xuICAgIHZhciBmaW5hbCA9IGZsYWcodGhpcywgJ2ZpbmFsRGVsdGFWYWx1ZScpO1xuICAgIHZhciBiZWhhdmlvciA9IGZsYWcodGhpcywgJ2RlbHRhQmVoYXZpb3InKTtcbiAgICB2YXIgcmVhbERlbHRhID0gZmxhZyh0aGlzLCAncmVhbERlbHRhJyk7XG5cbiAgICB2YXIgZXhwcmVzc2lvbjtcbiAgICBpZiAoYmVoYXZpb3IgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBleHByZXNzaW9uID0gTWF0aC5hYnMoZmluYWwgLSBpbml0aWFsKSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByZXNzaW9uID0gcmVhbERlbHRhID09PSBNYXRoLmFicyhkZWx0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBleHByZXNzaW9uXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byAnICsgYmVoYXZpb3IgKyAnIGJ5ICcgKyBkZWx0YVxuICAgICAgLCAnZXhwZWN0ZWQgJyArIG1zZ09iaiArICcgdG8gbm90ICcgKyBiZWhhdmlvciArICcgYnkgJyArIGRlbHRhXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2J5JywgYXNzZXJ0RGVsdGEpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmV4dGVuc2libGVcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgZXh0ZW5zaWJsZSwgd2hpY2ggbWVhbnMgdGhhdCBuZXcgcHJvcGVydGllcyBjYW5cbiAgICogYmUgYWRkZWQgdG8gaXQuIFByaW1pdGl2ZXMgYXJlIG5ldmVyIGV4dGVuc2libGUuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5iZS5leHRlbnNpYmxlO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmV4dGVuc2libGVgLlxuICAgKlxuICAgKiAgICAgdmFyIG5vbkV4dGVuc2libGVPYmplY3QgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pXG4gICAqICAgICAgICwgc2VhbGVkT2JqZWN0ID0gT2JqZWN0LnNlYWwoe30pXG4gICAqICAgICAgICwgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9uRXh0ZW5zaWJsZU9iamVjdCkudG8ubm90LmJlLmV4dGVuc2libGU7XG4gICAqICAgICBleHBlY3Qoc2VhbGVkT2JqZWN0KS50by5ub3QuYmUuZXh0ZW5zaWJsZTtcbiAgICogICAgIGV4cGVjdChmcm96ZW5PYmplY3QpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5leHRlbnNpYmxlO1xuICAgKlxuICAgKiBAbmFtZSBleHRlbnNpYmxlXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZXh0ZW5zaWJsZScsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKTtcblxuICAgIC8vIEluIEVTNSwgaWYgdGhlIGFyZ3VtZW50IHRvIHRoaXMgbWV0aG9kIGlzIGEgcHJpbWl0aXZlLCB0aGVuIGl0IHdpbGwgY2F1c2UgYSBUeXBlRXJyb3IuXG4gICAgLy8gSW4gRVM2LCBhIG5vbi1vYmplY3QgYXJndW1lbnQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdhcyBhIG5vbi1leHRlbnNpYmxlIG9yZGluYXJ5IG9iamVjdCwgc2ltcGx5IHJldHVybiBmYWxzZS5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNFeHRlbnNpYmxlXG4gICAgLy8gVGhlIGZvbGxvd2luZyBwcm92aWRlcyBFUzYgYmVoYXZpb3IgZm9yIEVTNSBlbnZpcm9ubWVudHMuXG5cbiAgICB2YXIgaXNFeHRlbnNpYmxlID0gb2JqID09PSBPYmplY3Qob2JqKSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKG9iaik7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGlzRXh0ZW5zaWJsZVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBleHRlbnNpYmxlJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgZXh0ZW5zaWJsZSdcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5zZWFsZWRcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgc2VhbGVkLCB3aGljaCBtZWFucyB0aGF0IG5ldyBwcm9wZXJ0aWVzIGNhbid0IGJlXG4gICAqIGFkZGVkIHRvIGl0LCBhbmQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2FuJ3QgYmUgcmVjb25maWd1cmVkIG9yIGRlbGV0ZWQuXG4gICAqIEhvd2V2ZXIsIGl0J3MgcG9zc2libGUgdGhhdCBpdHMgZXhpc3RpbmcgcHJvcGVydGllcyBjYW4gc3RpbGwgYmUgcmVhc3NpZ25lZFxuICAgKiB0byBkaWZmZXJlbnQgdmFsdWVzLiBQcmltaXRpdmVzIGFyZSBhbHdheXMgc2VhbGVkLlxuICAgKlxuICAgKiAgICAgdmFyIHNlYWxlZE9iamVjdCA9IE9iamVjdC5zZWFsKHt9KTtcbiAgICogICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICpcbiAgICogICAgIGV4cGVjdChzZWFsZWRPYmplY3QpLnRvLmJlLnNlYWxlZDtcbiAgICogICAgIGV4cGVjdChmcm96ZW5PYmplY3QpLnRvLmJlLnNlYWxlZDtcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5zZWFsZWQ7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuc2VhbGVkYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLm5vdC5iZS5zZWFsZWQ7XG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuc2VhbGVkO1xuICAgKlxuICAgKiBAbmFtZSBzZWFsZWRcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdzZWFsZWQnLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG5cbiAgICAvLyBJbiBFUzUsIGlmIHRoZSBhcmd1bWVudCB0byB0aGlzIG1ldGhvZCBpcyBhIHByaW1pdGl2ZSwgdGhlbiBpdCB3aWxsIGNhdXNlIGEgVHlwZUVycm9yLlxuICAgIC8vIEluIEVTNiwgYSBub24tb2JqZWN0IGFyZ3VtZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3YXMgYSBzZWFsZWQgb3JkaW5hcnkgb2JqZWN0LCBzaW1wbHkgcmV0dXJuIHRydWUuXG4gICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1NlYWxlZFxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvdmlkZXMgRVM2IGJlaGF2aW9yIGZvciBFUzUgZW52aXJvbm1lbnRzLlxuXG4gICAgdmFyIGlzU2VhbGVkID0gb2JqID09PSBPYmplY3Qob2JqKSA/IE9iamVjdC5pc1NlYWxlZChvYmopIDogdHJ1ZTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXNTZWFsZWRcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgc2VhbGVkJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgc2VhbGVkJ1xuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmZyb3plblxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBmcm96ZW4sIHdoaWNoIG1lYW5zIHRoYXQgbmV3IHByb3BlcnRpZXMgY2FuJ3QgYmVcbiAgICogYWRkZWQgdG8gaXQsIGFuZCBpdHMgZXhpc3RpbmcgcHJvcGVydGllcyBjYW4ndCBiZSByZWFzc2lnbmVkIHRvIGRpZmZlcmVudFxuICAgKiB2YWx1ZXMsIHJlY29uZmlndXJlZCwgb3IgZGVsZXRlZC4gUHJpbWl0aXZlcyBhcmUgYWx3YXlzIGZyb3plbi5cbiAgICpcbiAgICogICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICpcbiAgICogICAgIGV4cGVjdChmcm96ZW5PYmplY3QpLnRvLmJlLmZyb3plbjtcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5mcm96ZW47XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuZnJvemVuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLm5vdC5iZS5mcm96ZW47XG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZnJvemVuO1xuICAgKlxuICAgKiBAbmFtZSBmcm96ZW5cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdmcm96ZW4nLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG5cbiAgICAvLyBJbiBFUzUsIGlmIHRoZSBhcmd1bWVudCB0byB0aGlzIG1ldGhvZCBpcyBhIHByaW1pdGl2ZSwgdGhlbiBpdCB3aWxsIGNhdXNlIGEgVHlwZUVycm9yLlxuICAgIC8vIEluIEVTNiwgYSBub24tb2JqZWN0IGFyZ3VtZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3YXMgYSBmcm96ZW4gb3JkaW5hcnkgb2JqZWN0LCBzaW1wbHkgcmV0dXJuIHRydWUuXG4gICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc0Zyb3plblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvdmlkZXMgRVM2IGJlaGF2aW9yIGZvciBFUzUgZW52aXJvbm1lbnRzLlxuXG4gICAgdmFyIGlzRnJvemVuID0gb2JqID09PSBPYmplY3Qob2JqKSA/IE9iamVjdC5pc0Zyb3plbihvYmopIDogdHJ1ZTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXNGcm96ZW5cbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgZnJvemVuJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgZnJvemVuJ1xuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmZpbml0ZVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciwgYW5kIGlzbid0IGBOYU5gIG9yIHBvc2l0aXZlL25lZ2F0aXZlXG4gICAqIGBJbmZpbml0eWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuZmluaXRlO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmZpbml0ZWAuIEhvd2V2ZXIsIGl0J3NcbiAgICogZGFuZ2Vyb3VzIHRvIGRvIHNvLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9uc1xuICAgKiBieSBhc3NlcnRpbmcgdGhhdCB0aGUgc3ViamVjdCBlaXRoZXIgaXNuJ3QgYSBudW1iZXIsIG9yIHRoYXQgaXQncyBgTmFOYCwgb3JcbiAgICogdGhhdCBpdCdzIHBvc2l0aXZlIGBJbmZpbml0eWAsIG9yIHRoYXQgaXQncyBuZWdhdGl2ZSBgSW5maW5pdHlgLiBJdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuXG4gICAqIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzbid0IGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIHRoYXQgaXQncyB0aGUgZXhwZWN0ZWQgdHlwZSwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgaXNuJ3Qgb25lIG9mXG4gICAqIG1hbnkgdW5leHBlY3RlZCB0eXBlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uYmUuYSgnc3RyaW5nJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLm5vdC5iZS5maW5pdGU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gYmUgYE5hTmAsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgZXhhY3RseVxuICAgKiB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KE5hTikudG8uYmUuTmFOOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KE5hTikudG8ubm90LmJlLmZpbml0ZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSBpbmZpbml0eSwgaXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCBleGFjdGx5IHRoYXQuXG4gICAqXG4gICAqICAgICBleHBlY3QoSW5maW5pdHkpLnRvLmVxdWFsKEluZmluaXR5KTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChJbmZpbml0eSkudG8ubm90LmJlLmZpbml0ZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBiZSBuZWdhdGl2ZSBpbmZpbml0eSwgaXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCBleGFjdGx5IHRoYXQuXG4gICAqXG4gICAqICAgICBleHBlY3QoLUluZmluaXR5KS50by5lcXVhbCgtSW5maW5pdHkpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KC1JbmZpbml0eSkudG8ubm90LmJlLmZpbml0ZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5maW5pdGU7XG4gICAqXG4gICAqIEBuYW1lIGZpbml0ZVxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2Zpbml0ZScsIGZ1bmN0aW9uKG1zZykge1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShvYmopXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGEgZmluaXRlIG51bWJlcidcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGEgZmluaXRlIG51bWJlcidcbiAgICApO1xuICB9KTtcbn07XG4iLCAiLyohXG4gKiBjaGFpXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2hhaSwgdXRpbCkge1xuICBjaGFpLmV4cGVjdCA9IGZ1bmN0aW9uICh2YWwsIG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbmV3IGNoYWkuQXNzZXJ0aW9uKHZhbCwgbWVzc2FnZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZmFpbChbbWVzc2FnZV0pXG4gICAqICMjIyAuZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0sIFtvcGVyYXRvcl0pXG4gICAqXG4gICAqIFRocm93IGEgZmFpbHVyZS5cbiAgICpcbiAgICogICAgIGV4cGVjdC5mYWlsKCk7XG4gICAqICAgICBleHBlY3QuZmFpbChcImN1c3RvbSBlcnJvciBtZXNzYWdlXCIpO1xuICAgKiAgICAgZXhwZWN0LmZhaWwoMSwgMik7XG4gICAqICAgICBleHBlY3QuZmFpbCgxLCAyLCBcImN1c3RvbSBlcnJvciBtZXNzYWdlXCIpO1xuICAgKiAgICAgZXhwZWN0LmZhaWwoMSwgMiwgXCJjdXN0b20gZXJyb3IgbWVzc2FnZVwiLCBcIj5cIik7XG4gICAqICAgICBleHBlY3QuZmFpbCgxLCAyLCB1bmRlZmluZWQsIFwiPlwiKTtcbiAgICpcbiAgICogQG5hbWUgZmFpbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IG9wZXJhdG9yXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGNoYWkuZXhwZWN0LmZhaWwgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFjdHVhbDtcbiAgICAgICAgYWN0dWFsID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdleHBlY3QuZmFpbCgpJztcbiAgICB0aHJvdyBuZXcgY2hhaS5Bc3NlcnRpb25FcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGFjdHVhbDogYWN0dWFsXG4gICAgICAsIGV4cGVjdGVkOiBleHBlY3RlZFxuICAgICAgLCBvcGVyYXRvcjogb3BlcmF0b3JcbiAgICB9LCBjaGFpLmV4cGVjdC5mYWlsKTtcbiAgfTtcbn07XG4iLCAiLyohXG4gKiBjaGFpXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2hhaSwgdXRpbCkge1xuICB2YXIgQXNzZXJ0aW9uID0gY2hhaS5Bc3NlcnRpb247XG5cbiAgZnVuY3Rpb24gbG9hZFNob3VsZCAoKSB7XG4gICAgLy8gZXhwbGljaXRseSBkZWZpbmUgdGhpcyBtZXRob2QgYXMgZnVuY3Rpb24gYXMgdG8gaGF2ZSBpdCdzIG5hbWUgdG8gaW5jbHVkZSBhcyBgc3NmaWBcbiAgICBmdW5jdGlvbiBzaG91bGRHZXR0ZXIoKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFN0cmluZ1xuICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBOdW1iZXJcbiAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgQm9vbGVhblxuICAgICAgICAgIHx8IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdGhpcyBpbnN0YW5jZW9mIFN5bWJvbFxuICAgICAgICAgIHx8IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgJiYgdGhpcyBpbnN0YW5jZW9mIEJpZ0ludCkge1xuICAgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbih0aGlzLnZhbHVlT2YoKSwgbnVsbCwgc2hvdWxkR2V0dGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMsIG51bGwsIHNob3VsZEdldHRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNob3VsZFNldHRlcih2YWx1ZSkge1xuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvY2hhaS9pc3N1ZXMvODY6IHRoaXMgbWFrZXNcbiAgICAgIC8vIGB3aGF0ZXZlci5zaG91bGQgPSBzb21lVmFsdWVgIGFjdHVhbGx5IHNldCBgc29tZVZhbHVlYCwgd2hpY2ggaXNcbiAgICAgIC8vIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBgZ2xvYmFsLnNob3VsZCA9IHJlcXVpcmUoJ2NoYWknKS5zaG91bGQoKWAuXG4gICAgICAvL1xuICAgICAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgdG8gdXNlIFtbRGVmaW5lUHJvcGVydHldXSBpbnN0ZWFkIG9mIFtbUHV0XV1cbiAgICAgIC8vIHNpbmNlIG90aGVyd2lzZSB3ZSB3b3VsZCB0cmlnZ2VyIHRoaXMgdmVyeSBzZXR0ZXIhXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Nob3VsZCcsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gbW9kaWZ5IE9iamVjdC5wcm90b3R5cGUgdG8gaGF2ZSBgc2hvdWxkYFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QucHJvdG90eXBlLCAnc2hvdWxkJywge1xuICAgICAgc2V0OiBzaG91bGRTZXR0ZXJcbiAgICAgICwgZ2V0OiBzaG91bGRHZXR0ZXJcbiAgICAgICwgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG5cbiAgICB2YXIgc2hvdWxkID0ge307XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLmZhaWwoW21lc3NhZ2VdKVxuICAgICAqICMjIyAuZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0sIFtvcGVyYXRvcl0pXG4gICAgICpcbiAgICAgKiBUaHJvdyBhIGZhaWx1cmUuXG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLmZhaWwoKTtcbiAgICAgKiAgICAgc2hvdWxkLmZhaWwoXCJjdXN0b20gZXJyb3IgbWVzc2FnZVwiKTtcbiAgICAgKiAgICAgc2hvdWxkLmZhaWwoMSwgMik7XG4gICAgICogICAgIHNob3VsZC5mYWlsKDEsIDIsIFwiY3VzdG9tIGVycm9yIG1lc3NhZ2VcIik7XG4gICAgICogICAgIHNob3VsZC5mYWlsKDEsIDIsIFwiY3VzdG9tIGVycm9yIG1lc3NhZ2VcIiwgXCI+XCIpO1xuICAgICAqICAgICBzaG91bGQuZmFpbCgxLCAyLCB1bmRlZmluZWQsIFwiPlwiKTtcbiAgICAgKlxuICAgICAqXG4gICAgICogQG5hbWUgZmFpbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3BlcmF0b3JcbiAgICAgKiBAbmFtZXNwYWNlIEJERFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQuZmFpbCA9IGZ1bmN0aW9uIChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGFjdHVhbDtcbiAgICAgICAgICBhY3R1YWwgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdzaG91bGQuZmFpbCgpJztcbiAgICAgIHRocm93IG5ldyBjaGFpLkFzc2VydGlvbkVycm9yKG1lc3NhZ2UsIHtcbiAgICAgICAgICBhY3R1YWw6IGFjdHVhbFxuICAgICAgICAsIGV4cGVjdGVkOiBleHBlY3RlZFxuICAgICAgICAsIG9wZXJhdG9yOiBvcGVyYXRvclxuICAgICAgfSwgc2hvdWxkLmZhaWwpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICAgKlxuICAgICAqIEFzc2VydHMgbm9uLXN0cmljdCBlcXVhbGl0eSAoYD09YCkgb2YgYGFjdHVhbGAgYW5kIGBleHBlY3RlZGAuXG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLmVxdWFsKDMsICczJywgJz09IGNvZXJjZXMgdmFsdWVzIHRvIHN0cmluZ3MnKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIGVxdWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5lcXVhbCA9IGZ1bmN0aW9uICh2YWwxLCB2YWwyLCBtc2cpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24odmFsMSwgbXNnKS50by5lcXVhbCh2YWwyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIyMjIC50aHJvdyhmdW5jdGlvbiwgW2NvbnN0cnVjdG9yL3N0cmluZy9yZWdleHBdLCBbc3RyaW5nL3JlZ2V4cF0sIFttZXNzYWdlXSlcbiAgICAgKlxuICAgICAqIEFzc2VydHMgdGhhdCBgZnVuY3Rpb25gIHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZlxuICAgICAqIGBjb25zdHJ1Y3RvcmAsIG9yIGFsdGVybmF0ZWx5IHRoYXQgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aXRoIG1lc3NhZ2VcbiAgICAgKiBtYXRjaGluZyBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqICAgICBzaG91bGQudGhyb3coZm4sICdmdW5jdGlvbiB0aHJvd3MgYSByZWZlcmVuY2UgZXJyb3InKTtcbiAgICAgKiAgICAgc2hvdWxkLnRocm93KGZuLCAvZnVuY3Rpb24gdGhyb3dzIGEgcmVmZXJlbmNlIGVycm9yLyk7XG4gICAgICogICAgIHNob3VsZC50aHJvdyhmbiwgUmVmZXJlbmNlRXJyb3IpO1xuICAgICAqICAgICBzaG91bGQudGhyb3coZm4sIFJlZmVyZW5jZUVycm9yLCAnZnVuY3Rpb24gdGhyb3dzIGEgcmVmZXJlbmNlIGVycm9yJyk7XG4gICAgICogICAgIHNob3VsZC50aHJvdyhmbiwgUmVmZXJlbmNlRXJyb3IsIC9mdW5jdGlvbiB0aHJvd3MgYSByZWZlcmVuY2UgZXJyb3IvKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIHRocm93XG4gICAgICogQGFsaWFzIFRocm93XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvciNFcnJvcl90eXBlc1xuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5UaHJvdyA9IGZ1bmN0aW9uIChmbiwgZXJydCwgZXJycywgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2cpLnRvLlRocm93KGVycnQsIGVycnMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLmV4aXN0XG4gICAgICpcbiAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiAgICAgdmFyIGZvbyA9ICdoaSc7XG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLmV4aXN0KGZvbywgJ2ZvbyBleGlzdHMnKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIGV4aXN0XG4gICAgICogQG5hbWVzcGFjZSBTaG91bGRcbiAgICAgKiBAYXBpIHB1YmxpY1xuICAgICAqL1xuXG4gICAgc2hvdWxkLmV4aXN0ID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnKS50by5leGlzdDtcbiAgICB9XG5cbiAgICAvLyBuZWdhdGlvblxuICAgIHNob3VsZC5ub3QgPSB7fVxuXG4gICAgLyoqXG4gICAgICogIyMjIC5ub3QuZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgW21lc3NhZ2VdKVxuICAgICAqXG4gICAgICogQXNzZXJ0cyBub24tc3RyaWN0IGluZXF1YWxpdHkgKGAhPWApIG9mIGBhY3R1YWxgIGFuZCBgZXhwZWN0ZWRgLlxuICAgICAqXG4gICAgICogICAgIHNob3VsZC5ub3QuZXF1YWwoMywgNCwgJ3RoZXNlIG51bWJlcnMgYXJlIG5vdCBlcXVhbCcpO1xuICAgICAqXG4gICAgICogQG5hbWUgbm90LmVxdWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5ub3QuZXF1YWwgPSBmdW5jdGlvbiAodmFsMSwgdmFsMiwgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHZhbDEsIG1zZykudG8ubm90LmVxdWFsKHZhbDIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLnRocm93KGZ1bmN0aW9uLCBbY29uc3RydWN0b3IvcmVnZXhwXSwgW21lc3NhZ2VdKVxuICAgICAqXG4gICAgICogQXNzZXJ0cyB0aGF0IGBmdW5jdGlvbmAgd2lsbCBfbm90XyB0aHJvdyBhbiBlcnJvciB0aGF0IGlzIGFuIGluc3RhbmNlIG9mXG4gICAgICogYGNvbnN0cnVjdG9yYCwgb3IgYWx0ZXJuYXRlbHkgdGhhdCBpdCB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciB3aXRoIG1lc3NhZ2VcbiAgICAgKiBtYXRjaGluZyBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqICAgICBzaG91bGQubm90LnRocm93KGZuLCBFcnJvciwgJ2Z1bmN0aW9uIGRvZXMgbm90IHRocm93Jyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSBub3QudGhyb3dcbiAgICAgKiBAYWxpYXMgbm90LlRocm93XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvciNFcnJvcl90eXBlc1xuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5ub3QuVGhyb3cgPSBmdW5jdGlvbiAoZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgICAgbmV3IEFzc2VydGlvbihmbiwgbXNnKS50by5ub3QuVGhyb3coZXJydCwgZXJycyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICMjIyAubm90LmV4aXN0XG4gICAgICpcbiAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiAgICAgdmFyIGJhciA9IG51bGw7XG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLm5vdC5leGlzdChiYXIsICdiYXIgZG9lcyBub3QgZXhpc3QnKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIG5vdC5leGlzdFxuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5ub3QuZXhpc3QgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2cpLnRvLm5vdC5leGlzdDtcbiAgICB9XG5cbiAgICBzaG91bGRbJ3Rocm93J10gPSBzaG91bGRbJ1Rocm93J107XG4gICAgc2hvdWxkLm5vdFsndGhyb3cnXSA9IHNob3VsZC5ub3RbJ1Rocm93J107XG5cbiAgICByZXR1cm4gc2hvdWxkO1xuICB9O1xuXG4gIGNoYWkuc2hvdWxkID0gbG9hZFNob3VsZDtcbiAgY2hhaS5TaG91bGQgPSBsb2FkU2hvdWxkO1xufTtcbiIsICIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjaGFpLCB1dGlsKSB7XG4gIC8qIVxuICAgKiBDaGFpIGRlcGVuZGVuY2llcy5cbiAgICovXG5cbiAgdmFyIEFzc2VydGlvbiA9IGNoYWkuQXNzZXJ0aW9uXG4gICAgLCBmbGFnID0gdXRpbC5mbGFnO1xuXG4gIC8qIVxuICAgKiBNb2R1bGUgZXhwb3J0LlxuICAgKi9cblxuICAvKipcbiAgICogIyMjIGFzc2VydChleHByZXNzaW9uLCBtZXNzYWdlKVxuICAgKlxuICAgKiBXcml0ZSB5b3VyIG93biB0ZXN0IGV4cHJlc3Npb25zLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0KCdmb28nICE9PSAnYmFyJywgJ2ZvbyBpcyBub3QgYmFyJyk7XG4gICAqICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShbXSksICdlbXB0eSBhcnJheXMgYXJlIGFycmF5cycpO1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSBleHByZXNzaW9uIHRvIHRlc3QgZm9yIHRydXRoaW5lc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgdG8gZGlzcGxheSBvbiBlcnJvclxuICAgKiBAbmFtZSBhc3NlcnRcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmFyIGFzc2VydCA9IGNoYWkuYXNzZXJ0ID0gZnVuY3Rpb24gKGV4cHJlc3MsIGVycm1zZykge1xuICAgIHZhciB0ZXN0ID0gbmV3IEFzc2VydGlvbihudWxsLCBudWxsLCBjaGFpLmFzc2VydCwgdHJ1ZSk7XG4gICAgdGVzdC5hc3NlcnQoXG4gICAgICAgIGV4cHJlc3NcbiAgICAgICwgZXJybXNnXG4gICAgICAsICdbIG5lZ2F0aW9uIG1lc3NhZ2UgdW5hdmFpbGFibGUgXSdcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmZhaWwoW21lc3NhZ2VdKVxuICAgKiAjIyMgLmZhaWwoYWN0dWFsLCBleHBlY3RlZCwgW21lc3NhZ2VdLCBbb3BlcmF0b3JdKVxuICAgKlxuICAgKiBUaHJvdyBhIGZhaWx1cmUuIE5vZGUuanMgYGFzc2VydGAgbW9kdWxlLWNvbXBhdGlibGUuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZmFpbCgpO1xuICAgKiAgICAgYXNzZXJ0LmZhaWwoXCJjdXN0b20gZXJyb3IgbWVzc2FnZVwiKTtcbiAgICogICAgIGFzc2VydC5mYWlsKDEsIDIpO1xuICAgKiAgICAgYXNzZXJ0LmZhaWwoMSwgMiwgXCJjdXN0b20gZXJyb3IgbWVzc2FnZVwiKTtcbiAgICogICAgIGFzc2VydC5mYWlsKDEsIDIsIFwiY3VzdG9tIGVycm9yIG1lc3NhZ2VcIiwgXCI+XCIpO1xuICAgKiAgICAgYXNzZXJ0LmZhaWwoMSwgMiwgdW5kZWZpbmVkLCBcIj5cIik7XG4gICAqXG4gICAqIEBuYW1lIGZhaWxcbiAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBvcGVyYXRvclxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZmFpbCA9IGZ1bmN0aW9uIChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICAvLyBDb21wbHkgd2l0aCBOb2RlJ3MgZmFpbChbbWVzc2FnZV0pIGludGVyZmFjZVxuXG4gICAgICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgICAgIGFjdHVhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnYXNzZXJ0LmZhaWwoKSc7XG4gICAgdGhyb3cgbmV3IGNoYWkuQXNzZXJ0aW9uRXJyb3IobWVzc2FnZSwge1xuICAgICAgICBhY3R1YWw6IGFjdHVhbFxuICAgICAgLCBleHBlY3RlZDogZXhwZWN0ZWRcbiAgICAgICwgb3BlcmF0b3I6IG9wZXJhdG9yXG4gICAgfSwgYXNzZXJ0LmZhaWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzT2sob2JqZWN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyB0cnV0aHkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNPaygnZXZlcnl0aGluZycsICdldmVyeXRoaW5nIGlzIG9rJyk7XG4gICAqICAgICBhc3NlcnQuaXNPayhmYWxzZSwgJ3RoaXMgd2lsbCBmYWlsJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzT2tcbiAgICogQGFsaWFzIG9rXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdCB0byB0ZXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc09rID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzT2ssIHRydWUpLmlzLm9rO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTm90T2sob2JqZWN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBmYWxzeS5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc05vdE9rKCdldmVyeXRoaW5nJywgJ3RoaXMgd2lsbCBmYWlsJyk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RPayhmYWxzZSwgJ3RoaXMgd2lsbCBwYXNzJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90T2tcbiAgICogQGFsaWFzIG5vdE9rXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdCB0byB0ZXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdE9rID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90T2ssIHRydWUpLmlzLm5vdC5vaztcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgbm9uLXN0cmljdCBlcXVhbGl0eSAoYD09YCkgb2YgYGFjdHVhbGAgYW5kIGBleHBlY3RlZGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZXF1YWwoMywgJzMnLCAnPT0gY29lcmNlcyB2YWx1ZXMgdG8gc3RyaW5ncycpO1xuICAgKlxuICAgKiBAbmFtZSBlcXVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBtc2cpIHtcbiAgICB2YXIgdGVzdCA9IG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5lcXVhbCwgdHJ1ZSk7XG5cbiAgICB0ZXN0LmFzc2VydChcbiAgICAgICAgZXhwID09IGZsYWcodGVzdCwgJ29iamVjdCcpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGVxdWFsICN7ZXhwfSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7YWN0fSdcbiAgICAgICwgZXhwXG4gICAgICAsIGFjdFxuICAgICAgLCB0cnVlXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgbm9uLXN0cmljdCBpbmVxdWFsaXR5IChgIT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RFcXVhbCgzLCA0LCAndGhlc2UgbnVtYmVycyBhcmUgbm90IGVxdWFsJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIHZhciB0ZXN0ID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdEVxdWFsLCB0cnVlKTtcblxuICAgIHRlc3QuYXNzZXJ0KFxuICAgICAgICBleHAgIT0gZmxhZyh0ZXN0LCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gZXF1YWwgI3thY3R9J1xuICAgICAgLCBleHBcbiAgICAgICwgYWN0XG4gICAgICAsIHRydWVcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBzdHJpY3QgZXF1YWxpdHkgKGA9PT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCB0cnVlLCAndGhlc2UgYm9vbGVhbnMgYXJlIHN0cmljdGx5IGVxdWFsJyk7XG4gICAqXG4gICAqIEBuYW1lIHN0cmljdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5zdHJpY3RFcXVhbCwgdHJ1ZSkudG8uZXF1YWwoZXhwKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgc3RyaWN0IGluZXF1YWxpdHkgKGAhPT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbCgzLCAnMycsICdubyBjb2VyY2lvbiBmb3Igc3RyaWN0IGVxdWFsaXR5Jyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFN0cmljdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RTdHJpY3RFcXVhbCwgdHJ1ZSkudG8ubm90LmVxdWFsKGV4cCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBhY3R1YWxgIGlzIGRlZXBseSBlcXVhbCB0byBgZXhwZWN0ZWRgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBFcXVhbCh7IHRlYTogJ2dyZWVuJyB9LCB7IHRlYTogJ2dyZWVuJyB9KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYWxpYXMgZGVlcFN0cmljdEVxdWFsXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWVwRXF1YWwgPSBhc3NlcnQuZGVlcFN0cmljdEVxdWFsID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZGVlcEVxdWFsLCB0cnVlKS50by5lcWwoZXhwKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnQgdGhhdCBgYWN0dWFsYCBpcyBub3QgZGVlcGx5IGVxdWFsIHRvIGBleHBlY3RlZGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcEVxdWFsKHsgdGVhOiAnZ3JlZW4nIH0sIHsgdGVhOiAnamFzbWluZScgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBFcXVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIChhY3QsIGV4cCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdERlZXBFcXVhbCwgdHJ1ZSkudG8ubm90LmVxbChleHApO1xuICB9O1xuXG4gICAvKipcbiAgICogIyMjIC5pc0Fib3ZlKHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQWJvdmUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gKD4pIGB2YWx1ZVRvQmVBYm92ZWAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBYm92ZSg1LCAyLCAnNSBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gMicpO1xuICAgKlxuICAgKiBAbmFtZSBpc0Fib3ZlXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVBYm92ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNBYm92ZSA9IGZ1bmN0aW9uICh2YWwsIGFidiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQWJvdmUsIHRydWUpLnRvLmJlLmFib3ZlKGFidik7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLmlzQXRMZWFzdCh2YWx1ZVRvQ2hlY2ssIHZhbHVlVG9CZUF0TGVhc3QsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKD49KSBgdmFsdWVUb0JlQXRMZWFzdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBdExlYXN0KDUsIDIsICc1IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMicpO1xuICAgKiAgICAgYXNzZXJ0LmlzQXRMZWFzdCgzLCAzLCAnMyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDMnKTtcbiAgICpcbiAgICogQG5hbWUgaXNBdExlYXN0XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVBdExlYXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0F0TGVhc3QgPSBmdW5jdGlvbiAodmFsLCBhdGxzdCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXRMZWFzdCwgdHJ1ZSkudG8uYmUubGVhc3QoYXRsc3QpO1xuICB9O1xuXG4gICAvKipcbiAgICogIyMjIC5pc0JlbG93KHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQmVsb3csIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBzdHJpY3RseSBsZXNzIHRoYW4gKDwpIGB2YWx1ZVRvQmVCZWxvd2AuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNCZWxvdygzLCA2LCAnMyBpcyBzdHJpY3RseSBsZXNzIHRoYW4gNicpO1xuICAgKlxuICAgKiBAbmFtZSBpc0JlbG93XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVCZWxvd1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNCZWxvdyA9IGZ1bmN0aW9uICh2YWwsIGJsdywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQmVsb3csIHRydWUpLnRvLmJlLmJlbG93KGJsdyk7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLmlzQXRNb3N0KHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQXRNb3N0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgYHZhbHVlVG9DaGVja2AgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICg8PSkgYHZhbHVlVG9CZUF0TW9zdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBdE1vc3QoMywgNiwgJzMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDYnKTtcbiAgICogICAgIGFzc2VydC5pc0F0TW9zdCg0LCA0LCAnNCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCcpO1xuICAgKlxuICAgKiBAbmFtZSBpc0F0TW9zdFxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQ2hlY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVUb0JlQXRNb3N0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0F0TW9zdCA9IGZ1bmN0aW9uICh2YWwsIGF0bXN0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdE1vc3QsIHRydWUpLnRvLmJlLm1vc3QoYXRtc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzVHJ1ZSh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyB0cnVlLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYVNlcnZlZCA9IHRydWU7XG4gICAqICAgICBhc3NlcnQuaXNUcnVlKHRlYVNlcnZlZCwgJ3RoZSB0ZWEgaGFzIGJlZW4gc2VydmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzVHJ1ZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNUcnVlID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzVHJ1ZSwgdHJ1ZSkuaXNbJ3RydWUnXTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFRydWUodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IHRydWUuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90VHJ1ZSh0ZWEsICdncmVhdCwgdGltZSBmb3IgdGVhIScpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdFRydWVcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90VHJ1ZSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFRydWUsIHRydWUpLnRvLm5vdC5lcXVhbCh0cnVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0ZhbHNlKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIGZhbHNlLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYVNlcnZlZCA9IGZhbHNlO1xuICAgKiAgICAgYXNzZXJ0LmlzRmFsc2UodGVhU2VydmVkLCAnbm8gdGVhIHlldD8gaG1tLi4uJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRmFsc2VcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRmFsc2UgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGYWxzZSwgdHJ1ZSkuaXNbJ2ZhbHNlJ107XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RGYWxzZSh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBub3QgZmFsc2UuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RmFsc2UodGVhLCAnZ3JlYXQsIHRpbWUgZm9yIHRlYSEnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RGYWxzZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RGYWxzZSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEZhbHNlLCB0cnVlKS50by5ub3QuZXF1YWwoZmFsc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTnVsbCh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBudWxsLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTnVsbChlcnIsICd0aGVyZSB3YXMgbm8gZXJyb3InKTtcbiAgICpcbiAgICogQG5hbWUgaXNOdWxsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc051bGwgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOdWxsLCB0cnVlKS50by5lcXVhbChudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdE51bGwodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IG51bGwuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90TnVsbCh0ZWEsICdncmVhdCwgdGltZSBmb3IgdGVhIScpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE51bGxcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90TnVsbCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bGwsIHRydWUpLnRvLm5vdC5lcXVhbChudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05hTlxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgTmFOLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTmFOKE5hTiwgJ05hTiBpcyBOYU4nKTtcbiAgICpcbiAgICogQG5hbWUgaXNOYU5cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTmFOID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTmFOLCB0cnVlKS50by5iZS5OYU47XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3ROYU5cbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIG5vdCBOYU4uXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3ROYU4oNCwgJzQgaXMgbm90IE5hTicpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE5hTlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgYXNzZXJ0LmlzTm90TmFOID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90TmFOLCB0cnVlKS5ub3QudG8uYmUuTmFOO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmV4aXN0c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICB2YXIgZm9vID0gJ2hpJztcbiAgICpcbiAgICogICAgIGFzc2VydC5leGlzdHMoZm9vLCAnZm9vIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYCcpO1xuICAgKlxuICAgKiBAbmFtZSBleGlzdHNcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmV4aXN0cyA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5leGlzdHMsIHRydWUpLnRvLmV4aXN0O1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEV4aXN0c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBlaXRoZXIgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiAgICAgdmFyIGJhciA9IG51bGxcbiAgICogICAgICAgLCBiYXo7XG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RXhpc3RzKGJhcik7XG4gICAqICAgICBhc3NlcnQubm90RXhpc3RzKGJheiwgJ2JheiBpcyBlaXRoZXIgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICpcbiAgICogQG5hbWUgbm90RXhpc3RzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RFeGlzdHMgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90RXhpc3RzLCB0cnVlKS50by5ub3QuZXhpc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNVbmRlZmluZWQodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICB2YXIgdGVhO1xuICAgKiAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHRlYSwgJ25vIHRlYSBkZWZpbmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzVW5kZWZpbmVkXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1VuZGVmaW5lZCwgdHJ1ZSkudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0RlZmluZWQodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYSA9ICdjdXAgb2YgY2hhaSc7XG4gICAqICAgICBhc3NlcnQuaXNEZWZpbmVkKHRlYSwgJ3RlYSBoYXMgYmVlbiBkZWZpbmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNEZWZpbmVkID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRGVmaW5lZCwgdHJ1ZSkudG8ubm90LmVxdWFsKHVuZGVmaW5lZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNGdW5jdGlvbih2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gc2VydmVUZWEoKSB7IHJldHVybiAnY3VwIG9mIHRlYSc7IH07XG4gICAqICAgICBhc3NlcnQuaXNGdW5jdGlvbihzZXJ2ZVRlYSwgJ2dyZWF0LCB3ZSBjYW4gaGF2ZSB0ZWEgbm93Jyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRnVuY3Rpb25cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGdW5jdGlvbiwgdHJ1ZSkudG8uYmUuYSgnZnVuY3Rpb24nKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEZ1bmN0aW9uKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqICAgICB2YXIgc2VydmVUZWEgPSBbICdoZWF0JywgJ3BvdXInLCAnc2lwJyBdO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RnVuY3Rpb24oc2VydmVUZWEsICdncmVhdCwgd2UgaGF2ZSBsaXN0ZWQgdGhlIHN0ZXBzJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90RnVuY3Rpb25cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90RnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RGdW5jdGlvbiwgdHJ1ZSkudG8ubm90LmJlLmEoJ2Z1bmN0aW9uJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNPYmplY3QodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gb2JqZWN0IG9mIHR5cGUgJ09iamVjdCcgKGFzIHJldmVhbGVkIGJ5IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCkuXG4gICAqIF9UaGUgYXNzZXJ0aW9uIGRvZXMgbm90IG1hdGNoIHN1YmNsYXNzZWQgb2JqZWN0cy5fXG4gICAqXG4gICAqICAgICB2YXIgc2VsZWN0aW9uID0geyBuYW1lOiAnQ2hhaScsIHNlcnZlOiAnd2l0aCBzcGljZXMnIH07XG4gICAqICAgICBhc3NlcnQuaXNPYmplY3Qoc2VsZWN0aW9uLCAndGVhIHNlbGVjdGlvbiBpcyBhbiBvYmplY3QnKTtcbiAgICpcbiAgICogQG5hbWUgaXNPYmplY3RcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzT2JqZWN0ID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzT2JqZWN0LCB0cnVlKS50by5iZS5hKCdvYmplY3QnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdE9iamVjdCh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBfbm90XyBhbiBvYmplY3Qgb2YgdHlwZSAnT2JqZWN0JyAoYXMgcmV2ZWFsZWQgYnkgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgKS5cbiAgICpcbiAgICogICAgIHZhciBzZWxlY3Rpb24gPSAnY2hhaSdcbiAgICogICAgIGFzc2VydC5pc05vdE9iamVjdChzZWxlY3Rpb24sICd0ZWEgc2VsZWN0aW9uIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICogICAgIGFzc2VydC5pc05vdE9iamVjdChudWxsLCAnbnVsbCBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90T2JqZWN0XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdE9iamVjdCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE9iamVjdCwgdHJ1ZSkudG8ubm90LmJlLmEoJ29iamVjdCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzQXJyYXkodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gYXJyYXkuXG4gICAqXG4gICAqICAgICB2YXIgbWVudSA9IFsgJ2dyZWVuJywgJ2NoYWknLCAnb29sb25nJyBdO1xuICAgKiAgICAgYXNzZXJ0LmlzQXJyYXkobWVudSwgJ3doYXQga2luZCBvZiB0ZWEgZG8gd2Ugd2FudD8nKTtcbiAgICpcbiAgICogQG5hbWUgaXNBcnJheVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNBcnJheSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0FycmF5LCB0cnVlKS50by5iZS5hbignYXJyYXknKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEFycmF5KHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGFuIGFycmF5LlxuICAgKlxuICAgKiAgICAgdmFyIG1lbnUgPSAnZ3JlZW58Y2hhaXxvb2xvbmcnO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90QXJyYXkobWVudSwgJ3doYXQga2luZCBvZiB0ZWEgZG8gd2Ugd2FudD8nKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RBcnJheVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RBcnJheSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEFycmF5LCB0cnVlKS50by5ub3QuYmUuYW4oJ2FycmF5Jyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNTdHJpbmcodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBzdHJpbmcuXG4gICAqXG4gICAqICAgICB2YXIgdGVhT3JkZXIgPSAnY2hhaSc7XG4gICAqICAgICBhc3NlcnQuaXNTdHJpbmcodGVhT3JkZXIsICdvcmRlciBwbGFjZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNTdHJpbmdcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzU3RyaW5nID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzU3RyaW5nLCB0cnVlKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFN0cmluZyh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBfbm90XyBhIHN0cmluZy5cbiAgICpcbiAgICogICAgIHZhciB0ZWFPcmRlciA9IDQ7XG4gICAqICAgICBhc3NlcnQuaXNOb3RTdHJpbmcodGVhT3JkZXIsICdvcmRlciBwbGFjZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RTdHJpbmdcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90U3RyaW5nID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90U3RyaW5nLCB0cnVlKS50by5ub3QuYmUuYSgnc3RyaW5nJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOdW1iZXIodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBudW1iZXIuXG4gICAqXG4gICAqICAgICB2YXIgY3VwcyA9IDI7XG4gICAqICAgICBhc3NlcnQuaXNOdW1iZXIoY3VwcywgJ2hvdyBtYW55IGN1cHMnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOdW1iZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc051bWJlciA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWJlciwgdHJ1ZSkudG8uYmUuYSgnbnVtYmVyJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3ROdW1iZXIodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgX25vdF8gYSBudW1iZXIuXG4gICAqXG4gICAqICAgICB2YXIgY3VwcyA9ICcyIGN1cHMgcGxlYXNlJztcbiAgICogICAgIGFzc2VydC5pc05vdE51bWJlcihjdXBzLCAnaG93IG1hbnkgY3VwcycpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE51bWJlclxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3ROdW1iZXIgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdW1iZXIsIHRydWUpLnRvLm5vdC5iZS5hKCdudW1iZXInKTtcbiAgfTtcblxuICAgLyoqXG4gICAqICMjIyAuaXNGaW5pdGUodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLiBVbmxpa2UgYC5pc051bWJlcmAsIHRoaXMgd2lsbCBmYWlsIGZvciBgTmFOYCBhbmQgYEluZmluaXR5YC5cbiAgICpcbiAgICogICAgIHZhciBjdXBzID0gMjtcbiAgICogICAgIGFzc2VydC5pc0Zpbml0ZShjdXBzLCAnaG93IG1hbnkgY3VwcycpO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzRmluaXRlKE5hTik7IC8vIHRocm93c1xuICAgKlxuICAgKiBAbmFtZSBpc0Zpbml0ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRmluaXRlID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRmluaXRlLCB0cnVlKS50by5iZS5maW5pdGU7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNCb29sZWFuKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIGEgYm9vbGVhbi5cbiAgICpcbiAgICogICAgIHZhciB0ZWFSZWFkeSA9IHRydWVcbiAgICogICAgICAgLCB0ZWFTZXJ2ZWQgPSBmYWxzZTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pc0Jvb2xlYW4odGVhUmVhZHksICdpcyB0aGUgdGVhIHJlYWR5Jyk7XG4gICAqICAgICBhc3NlcnQuaXNCb29sZWFuKHRlYVNlcnZlZCwgJ2hhcyB0ZWEgYmVlbiBzZXJ2ZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNCb29sZWFuXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0Jvb2xlYW4gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCb29sZWFuLCB0cnVlKS50by5iZS5hKCdib29sZWFuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RCb29sZWFuKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGEgYm9vbGVhbi5cbiAgICpcbiAgICogICAgIHZhciB0ZWFSZWFkeSA9ICd5ZXAnXG4gICAqICAgICAgICwgdGVhU2VydmVkID0gJ25vcGUnO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTm90Qm9vbGVhbih0ZWFSZWFkeSwgJ2lzIHRoZSB0ZWEgcmVhZHknKTtcbiAgICogICAgIGFzc2VydC5pc05vdEJvb2xlYW4odGVhU2VydmVkLCAnaGFzIHRlYSBiZWVuIHNlcnZlZCcpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdEJvb2xlYW5cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90Qm9vbGVhbiA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEJvb2xlYW4sIHRydWUpLnRvLm5vdC5iZS5hKCdib29sZWFuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAudHlwZU9mKHZhbHVlLCBuYW1lLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgJ3MgdHlwZSBpcyBgbmFtZWAsIGFzIGRldGVybWluZWQgYnlcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnR5cGVPZih7IHRlYTogJ2NoYWknIH0sICdvYmplY3QnLCAnd2UgaGF2ZSBhbiBvYmplY3QnKTtcbiAgICogICAgIGFzc2VydC50eXBlT2YoWydjaGFpJywgJ2phc21pbmUnXSwgJ2FycmF5JywgJ3dlIGhhdmUgYW4gYXJyYXknKTtcbiAgICogICAgIGFzc2VydC50eXBlT2YoJ3RlYScsICdzdHJpbmcnLCAnd2UgaGF2ZSBhIHN0cmluZycpO1xuICAgKiAgICAgYXNzZXJ0LnR5cGVPZigvdGVhLywgJ3JlZ2V4cCcsICd3ZSBoYXZlIGEgcmVndWxhciBleHByZXNzaW9uJyk7XG4gICAqICAgICBhc3NlcnQudHlwZU9mKG51bGwsICdudWxsJywgJ3dlIGhhdmUgYSBudWxsJyk7XG4gICAqICAgICBhc3NlcnQudHlwZU9mKHVuZGVmaW5lZCwgJ3VuZGVmaW5lZCcsICd3ZSBoYXZlIGFuIHVuZGVmaW5lZCcpO1xuICAgKlxuICAgKiBAbmFtZSB0eXBlT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnR5cGVPZiA9IGZ1bmN0aW9uICh2YWwsIHR5cGUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC50eXBlT2YsIHRydWUpLnRvLmJlLmEodHlwZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90VHlwZU9mKHZhbHVlLCBuYW1lLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgJ3MgdHlwZSBpcyBfbm90XyBgbmFtZWAsIGFzIGRldGVybWluZWQgYnlcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFR5cGVPZigndGVhJywgJ251bWJlcicsICdzdHJpbmdzIGFyZSBub3QgbnVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RUeXBlT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVvZiBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RUeXBlT2YgPSBmdW5jdGlvbiAodmFsLCB0eXBlLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90VHlwZU9mLCB0cnVlKS50by5ub3QuYmUuYSh0eXBlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pbnN0YW5jZU9mKG9iamVjdCwgY29uc3RydWN0b3IsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYGNvbnN0cnVjdG9yYC5cbiAgICpcbiAgICogICAgIHZhciBUZWEgPSBmdW5jdGlvbiAobmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9XG4gICAqICAgICAgICwgY2hhaSA9IG5ldyBUZWEoJ2NoYWknKTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pbnN0YW5jZU9mKGNoYWksIFRlYSwgJ2NoYWkgaXMgYW4gaW5zdGFuY2Ugb2YgdGVhJyk7XG4gICAqXG4gICAqIEBuYW1lIGluc3RhbmNlT2ZcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5zdGFuY2VPZiA9IGZ1bmN0aW9uICh2YWwsIHR5cGUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pbnN0YW5jZU9mLCB0cnVlKS50by5iZS5pbnN0YW5jZU9mKHR5cGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluc3RhbmNlT2Yob2JqZWN0LCBjb25zdHJ1Y3RvciwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIGB2YWx1ZWAgaXMgbm90IGFuIGluc3RhbmNlIG9mIGBjb25zdHJ1Y3RvcmAuXG4gICAqXG4gICAqICAgICB2YXIgVGVhID0gZnVuY3Rpb24gKG5hbWUpIHsgdGhpcy5uYW1lID0gbmFtZTsgfVxuICAgKiAgICAgICAsIGNoYWkgPSBuZXcgU3RyaW5nKCdjaGFpJyk7XG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5zdGFuY2VPZihjaGFpLCBUZWEsICdjaGFpIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0ZWEnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5zdGFuY2VPZlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RJbnN0YW5jZU9mID0gZnVuY3Rpb24gKHZhbCwgdHlwZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lm5vdEluc3RhbmNlT2YsIHRydWUpXG4gICAgICAudG8ubm90LmJlLmluc3RhbmNlT2YodHlwZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgaGF5c3RhY2tgIGluY2x1ZGVzIGBuZWVkbGVgLiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlXG4gICAqIGluY2x1c2lvbiBvZiBhIHZhbHVlIGluIGFuIGFycmF5LCBhIHN1YnN0cmluZyBpbiBhIHN0cmluZywgb3IgYSBzdWJzZXQgb2ZcbiAgICogcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZShbMSwyLDNdLCAyLCAnYXJyYXkgY29udGFpbnMgdmFsdWUnKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKCdmb29iYXInLCAnZm9vJywgJ3N0cmluZyBjb250YWlucyBzdWJzdHJpbmcnKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKHsgZm9vOiAnYmFyJywgaGVsbG86ICd1bml2ZXJzZScgfSwgeyBmb286ICdiYXInIH0sICdvYmplY3QgY29udGFpbnMgcHJvcGVydHknKTtcbiAgICpcbiAgICogU3RyaWN0IGVxdWFsaXR5ICg9PT0pIGlzIHVzZWQuIFdoZW4gYXNzZXJ0aW5nIHRoZSBpbmNsdXNpb24gb2YgYSB2YWx1ZSBpblxuICAgKiBhbiBhcnJheSwgdGhlIGFycmF5IGlzIHNlYXJjaGVkIGZvciBhbiBlbGVtZW50IHRoYXQncyBzdHJpY3RseSBlcXVhbCB0byB0aGVcbiAgICogZ2l2ZW4gdmFsdWUuIFdoZW4gYXNzZXJ0aW5nIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LCB0aGUgb2JqZWN0XG4gICAqIGlzIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkga2V5cywgY2hlY2tpbmcgdGhhdCBlYWNoIG9uZSBpcyBwcmVzZW50XG4gICAqIGFuZCBzdHJpY3RseSBlcXVhbCB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgdmFsdWUuIEZvciBpbnN0YW5jZTpcbiAgICpcbiAgICogICAgIHZhciBvYmoxID0ge2E6IDF9XG4gICAqICAgICAgICwgb2JqMiA9IHtiOiAyfTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKFtvYmoxLCBvYmoyXSwgb2JqMSk7XG4gICAqICAgICBhc3NlcnQuaW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiBvYmoxfSk7XG4gICAqICAgICBhc3NlcnQuaW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9KTtcbiAgICpcbiAgICogQG5hbWUgaW5jbHVkZVxuICAgKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuaW5jbHVkZSwgdHJ1ZSkuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYGhheXN0YWNrYCBkb2VzIG5vdCBpbmNsdWRlIGBuZWVkbGVgLiBDYW4gYmUgdXNlZCB0byBhc3NlcnRcbiAgICogdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSBpbiBhbiBhcnJheSwgYSBzdWJzdHJpbmcgaW4gYSBzdHJpbmcsIG9yIGEgc3Vic2V0IG9mXG4gICAqIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGUoWzEsMiwzXSwgNCwgXCJhcnJheSBkb2Vzbid0IGNvbnRhaW4gdmFsdWVcIik7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSgnZm9vYmFyJywgJ2JheicsIFwic3RyaW5nIGRvZXNuJ3QgY29udGFpbiBzdWJzdHJpbmdcIik7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSh7IGZvbzogJ2JhcicsIGhlbGxvOiAndW5pdmVyc2UnIH0sIHsgZm9vOiAnYmF6JyB9LCAnb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBwcm9wZXJ0eScpO1xuICAgKlxuICAgKiBTdHJpY3QgZXF1YWxpdHkgKD09PSkgaXMgdXNlZC4gV2hlbiBhc3NlcnRpbmcgdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSBpbiBhblxuICAgKiBhcnJheSwgdGhlIGFycmF5IGlzIHNlYXJjaGVkIHRvIGNvbmZpcm0gdGhlIGFic2VuY2Ugb2YgYW4gZWxlbWVudCB0aGF0J3NcbiAgICogc3RyaWN0bHkgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLiBXaGVuIGFzc2VydGluZyBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluXG4gICAqIGFuIG9iamVjdCwgdGhlIG9iamVjdCBpcyBzZWFyY2hlZCB0byBjb25maXJtIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlblxuICAgKiBwcm9wZXJ0eSBrZXlzIGlzIGVpdGhlciBub3QgcHJlc2VudCBvciBub3Qgc3RyaWN0bHkgZXF1YWwgdG8gdGhlIGdpdmVuXG4gICAqIHByb3BlcnR5IHZhbHVlLiBGb3IgaW5zdGFuY2U6XG4gICAqXG4gICAqICAgICB2YXIgb2JqMSA9IHthOiAxfVxuICAgKiAgICAgICAsIG9iajIgPSB7YjogMn07XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZShbb2JqMSwgb2JqMl0sIHthOiAxfSk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiB7YTogMX19KTtcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IG9iajEsIGJhcjoge2I6IDJ9fSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVcbiAgICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90SW5jbHVkZSA9IGZ1bmN0aW9uIChleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGUsIHRydWUpLm5vdC5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYGhheXN0YWNrYCBpbmNsdWRlcyBgbmVlZGxlYC4gQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZVxuICAgKiBpbmNsdXNpb24gb2YgYSB2YWx1ZSBpbiBhbiBhcnJheSBvciBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdC5cbiAgICogRGVlcCBlcXVhbGl0eSBpcyB1c2VkLlxuICAgKlxuICAgKiAgICAgdmFyIG9iajEgPSB7YTogMX1cbiAgICogICAgICAgLCBvYmoyID0ge2I6IDJ9O1xuICAgKiAgICAgYXNzZXJ0LmRlZXBJbmNsdWRlKFtvYmoxLCBvYmoyXSwge2E6IDF9KTtcbiAgICogICAgIGFzc2VydC5kZWVwSW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiB7YTogMX19KTtcbiAgICogICAgIGFzc2VydC5kZWVwSW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiB7YTogMX0sIGJhcjoge2I6IDJ9fSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBJbmNsdWRlXG4gICAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge01peGVkfSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuZGVlcEluY2x1ZGUsIHRydWUpLmRlZXAuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdERlZXBJbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBoYXlzdGFja2AgZG9lcyBub3QgaW5jbHVkZSBgbmVlZGxlYC4gQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0XG4gICAqIHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gYW4gYXJyYXkgb3IgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqIERlZXAgZXF1YWxpdHkgaXMgdXNlZC5cbiAgICpcbiAgICogICAgIHZhciBvYmoxID0ge2E6IDF9XG4gICAqICAgICAgICwgb2JqMiA9IHtiOiAyfTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwSW5jbHVkZShbb2JqMSwgb2JqMl0sIHthOiA5fSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDl9fSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDF9LCBiYXI6IHtiOiA5fX0pO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwSW5jbHVkZVxuICAgKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3REZWVwSW5jbHVkZSA9IGZ1bmN0aW9uIChleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdERlZXBJbmNsdWRlLCB0cnVlKS5ub3QuZGVlcC5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubmVzdGVkSW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGluY2x1c2lvbiBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuXG4gICAqIG9iamVjdC5cbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIHJlZmVyZW5jaW5nIG5lc3RlZFxuICAgKiBwcm9wZXJ0aWVzLlxuICAgKiAnW10nIGFuZCAnLicgaW4gcHJvcGVydHkgbmFtZXMgY2FuIGJlIGVzY2FwZWQgdXNpbmcgZG91YmxlIGJhY2tzbGFzaGVzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUoeycuYSc6IHsnYic6ICd4J319LCB7J1xcXFwuYS5bYl0nOiAneCd9KTtcbiAgICogICAgIGFzc2VydC5uZXN0ZWRJbmNsdWRlKHsnYSc6IHsnW2JdJzogJ3gnfX0sIHsnYS5cXFxcW2JcXFxcXSc6ICd4J30pO1xuICAgKlxuICAgKiBAbmFtZSBuZXN0ZWRJbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5uZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubmVzdGVkSW5jbHVkZSwgdHJ1ZSkubmVzdGVkLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3ROZXN0ZWRJbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgZG9lcyBub3QgaW5jbHVkZSAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBhYnNlbmNlIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW5cbiAgICogb2JqZWN0LlxuICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgcmVmZXJlbmNpbmcgbmVzdGVkXG4gICAqIHByb3BlcnRpZXMuXG4gICAqICdbXScgYW5kICcuJyBpbiBwcm9wZXJ0eSBuYW1lcyBjYW4gYmUgZXNjYXBlZCB1c2luZyBkb3VibGUgYmFja3NsYXNoZXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90TmVzdGVkSW5jbHVkZSh7Jy5hJzogeydiJzogJ3gnfX0sIHsnXFxcXC5hLmInOiAneSd9KTtcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlKHsnYSc6IHsnW2JdJzogJ3gnfX0sIHsnYS5cXFxcW2JcXFxcXSc6ICd5J30pO1xuICAgKlxuICAgKiBAbmFtZSBub3ROZXN0ZWRJbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90TmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5ub3QubmVzdGVkLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5kZWVwTmVzdGVkSW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGluY2x1c2lvbiBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuXG4gICAqIG9iamVjdCB3aGlsZSBjaGVja2luZyBmb3IgZGVlcCBlcXVhbGl0eS5cbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIHJlZmVyZW5jaW5nIG5lc3RlZFxuICAgKiBwcm9wZXJ0aWVzLlxuICAgKiAnW10nIGFuZCAnLicgaW4gcHJvcGVydHkgbmFtZXMgY2FuIGJlIGVzY2FwZWQgdXNpbmcgZG91YmxlIGJhY2tzbGFzaGVzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlKHthOiB7YjogW3t4OiAxfV19fSwgeydhLmJbMF0nOiB7eDogMX19KTtcbiAgICogICAgIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSh7Jy5hJzogeydbYl0nOiB7eDogMX19fSwgeydcXFxcLmEuXFxcXFtiXFxcXF0nOiB7eDogMX19KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcE5lc3RlZEluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5kZWVwLm5lc3RlZC5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90RGVlcE5lc3RlZEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgJ2hheXN0YWNrJyBkb2VzIG5vdCBpbmNsdWRlICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGFic2VuY2Ugb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhblxuICAgKiBvYmplY3Qgd2hpbGUgY2hlY2tpbmcgZm9yIGRlZXAgZXF1YWxpdHkuXG4gICAqIEVuYWJsZXMgdGhlIHVzZSBvZiBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGZvciByZWZlcmVuY2luZyBuZXN0ZWRcbiAgICogcHJvcGVydGllcy5cbiAgICogJ1tdJyBhbmQgJy4nIGluIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBlc2NhcGVkIHVzaW5nIGRvdWJsZSBiYWNrc2xhc2hlcy5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSh7YToge2I6IFt7eDogMX1dfX0sIHsnYS5iWzBdJzoge3k6IDF9fSlcbiAgICogICAgIGFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSh7Jy5hJzogeydbYl0nOiB7eDogMX19fSwgeydcXFxcLmEuXFxcXFtiXFxcXF0nOiB7eTogMn19KTtcbiAgICpcbiAgICogQG5hbWUgbm90RGVlcE5lc3RlZEluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm93bkluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgJ2hheXN0YWNrJyBpbmNsdWRlcyAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBpbmNsdXNpb24gb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhblxuICAgKiBvYmplY3Qgd2hpbGUgaWdub3JpbmcgaW5oZXJpdGVkIHByb3BlcnRpZXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duSW5jbHVkZSh7IGE6IDEgfSwgeyBhOiAxIH0pO1xuICAgKlxuICAgKiBAbmFtZSBvd25JbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5vd25JbmNsdWRlLCB0cnVlKS5vd24uaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdE93bkluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgJ2hheXN0YWNrJyBpbmNsdWRlcyAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBhYnNlbmNlIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW5cbiAgICogb2JqZWN0IHdoaWxlIGlnbm9yaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAgICAgT2JqZWN0LnByb3RvdHlwZS5iID0gMjtcbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RPd25JbmNsdWRlKHsgYTogMSB9LCB7IGI6IDIgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdE93bkluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdE93bkluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlZXBPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgaW5jbHVkZXMgJ25lZWRsZScuXG4gICAqIENhbiBiZSB1c2VkIHRvIGFzc2VydCB0aGUgaW5jbHVzaW9uIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW5cbiAgICogb2JqZWN0IHdoaWxlIGlnbm9yaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGFuZCBjaGVja2luZyBmb3IgZGVlcCBlcXVhbGl0eS5cbiAgICpcbiAgICogICAgICBhc3NlcnQuZGVlcE93bkluY2x1ZGUoe2E6IHtiOiAyfX0sIHthOiB7YjogMn19KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcE93bkluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwT3duSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLm5vdERlZXBPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgaW5jbHVkZXMgJ25lZWRsZScuXG4gICAqIENhbiBiZSB1c2VkIHRvIGFzc2VydCB0aGUgYWJzZW5jZSBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuXG4gICAqIG9iamVjdCB3aGlsZSBpZ25vcmluZyBpbmhlcml0ZWQgcHJvcGVydGllcyBhbmQgY2hlY2tpbmcgZm9yIGRlZXAgZXF1YWxpdHkuXG4gICAqXG4gICAqICAgICAgYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlKHthOiB7YjogMn19LCB7YToge2M6IDN9fSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBPd25JbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3REZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpXG4gICAgICAubm90LmRlZXAub3duLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5tYXRjaCh2YWx1ZSwgcmVnZXhwLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBgcmVnZXhwYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5tYXRjaCgnZm9vYmFyJywgL15mb28vLCAncmVnZXhwIG1hdGNoZXMnKTtcbiAgICpcbiAgICogQG5hbWUgbWF0Y2hcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubWF0Y2ggPSBmdW5jdGlvbiAoZXhwLCByZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm1hdGNoLCB0cnVlKS50by5tYXRjaChyZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TWF0Y2godmFsdWUsIHJlZ2V4cCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uIGByZWdleHBgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdE1hdGNoKCdmb29iYXInLCAvXmZvby8sICdyZWdleHAgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICpcbiAgICogQG5hbWUgbm90TWF0Y2hcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90TWF0Y2ggPSBmdW5jdGlvbiAoZXhwLCByZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE1hdGNoLCB0cnVlKS50by5ub3QubWF0Y2gocmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YC5cbiAgICpcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEnKTtcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0b1N0cmluZycpO1xuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQucHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQucHJvcGVydHksIHRydWUpLnRvLmhhdmUucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lZFxuICAgKiBieSBgcHJvcGVydHlgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFByb3BlcnR5KHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ2NvZmZlZScpO1xuICAgKlxuICAgKiBAbmFtZSBub3RQcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90UHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHksIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAucHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YCB3aXRoIGEgdmFsdWUgZ2l2ZW4gYnkgYHZhbHVlYC4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVja1xuICAgKiAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eVZhbCh7IHRlYTogJ2lzIGdvb2QnIH0sICd0ZWEnLCAnaXMgZ29vZCcpO1xuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQucHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5wcm9wZXJ0eVZhbCwgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90UHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWRcbiAgICogYnkgYHByb3BlcnR5YCB3aXRoIHZhbHVlIGdpdmVuIGJ5IGB2YWx1ZWAuIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHkgY2hlY2tcbiAgICogKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90UHJvcGVydHlWYWwoeyB0ZWE6ICdpcyBnb29kJyB9LCAndGVhJywgJ2lzIGJhZCcpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdFByb3BlcnR5VmFsKHsgdGVhOiAnaXMgZ29vZCcgfSwgJ2NvZmZlZScsICdpcyBnb29kJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFByb3BlcnR5VmFsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcFByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVkIGJ5XG4gICAqIGBwcm9wZXJ0eWAgd2l0aCBhIHZhbHVlIGdpdmVuIGJ5IGB2YWx1ZWAuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuZGVlcC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdERlZXBQcm9wZXJ0eVZhbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lZFxuICAgKiBieSBgcHJvcGVydHlgIHdpdGggdmFsdWUgZ2l2ZW4gYnkgYHZhbHVlYC4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9IH0sICd0ZWEnLCB7IGJsYWNrOiAnbWF0Y2hhJyB9KTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwUHJvcGVydHlWYWwoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH0gfSwgJ3RlYScsIHsgZ3JlZW46ICdvb2xvbmcnIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAnY29mZmVlJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5vd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YC4gSW5oZXJpdGVkXG4gICAqIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duUHJvcGVydHkoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH19LCAndGVhJyk7XG4gICAqXG4gICAqIEBuYW1lIG93blByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5vd25Qcm9wZXJ0eSwgdHJ1ZSlcbiAgICAgIC50by5oYXZlLm93bi5wcm9wZXJ0eShwcm9wKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIF9ub3RfIGhhdmUgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YC4gSW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHkoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH19LCAnY29mZmVlJyk7XG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHkoe30sICd0b1N0cmluZycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RPd25Qcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90T3duUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90T3duUHJvcGVydHksIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUub3duLnByb3BlcnR5KHByb3ApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCBhbmQgYSB2YWx1ZVxuICAgKiBlcXVhbCB0byB0aGUgcHJvdmlkZWQgYHZhbHVlYC4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICogSW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duUHJvcGVydHlWYWwoeyBjb2ZmZWU6ICdpcyBnb29kJ30sICdjb2ZmZWUnLCAnaXMgZ29vZCcpO1xuICAgKlxuICAgKiBAbmFtZSBvd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25Qcm9wZXJ0eVZhbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWBcbiAgICogd2l0aCBhIHZhbHVlIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBgdmFsdWVgLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrXG4gICAqICg9PT0pLiBJbmhlcml0ZWQgcHJvcGVydGllcyBhcmVuJ3QgY2hlY2tlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RPd25Qcm9wZXJ0eVZhbCh7IHRlYTogJ2lzIGJldHRlcid9LCAndGVhJywgJ2lzIHdvcnNlJyk7XG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwoe30sICd0b1N0cmluZycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuICAgKlxuICAgKiBAbmFtZSBub3RPd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcE93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCBhbmQgYSB2YWx1ZVxuICAgKiBlcXVhbCB0byB0aGUgcHJvdmlkZWQgYHZhbHVlYC4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suIEluaGVyaXRlZFxuICAgKiBwcm9wZXJ0aWVzIGFyZW4ndCBjaGVja2VkLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBPd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kZWVwT3duUHJvcGVydHlWYWwsIHRydWUpXG4gICAgICAudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90RGVlcE93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIF9ub3RfIGhhdmUgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YFxuICAgKiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIGB2YWx1ZWAuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKiBJbmhlcml0ZWQgcHJvcGVydGllcyBhcmVuJ3QgY2hlY2tlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH0gfSwgJ3RlYScsIHsgYmxhY2s6ICdtYXRjaGEnIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ29vbG9uZycgfSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcE93blByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9IH0sICdjb2ZmZWUnLCB7IGdyZWVuOiAnbWF0Y2hhJyB9KTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwoe30sICd0b1N0cmluZycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwT3duUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcE93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmRlZXAub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5uZXN0ZWRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVkIGJ5XG4gICAqIGBwcm9wZXJ0eWAsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyB1c2luZyBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGZvclxuICAgKiBuZXN0ZWQgcmVmZXJlbmNlLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5lc3RlZFByb3BlcnR5KHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ3RlYS5ncmVlbicpO1xuICAgKlxuICAgKiBAbmFtZSBuZXN0ZWRQcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubmVzdGVkUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubmVzdGVkUHJvcGVydHksIHRydWUpXG4gICAgICAudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TmVzdGVkUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCwgd2hpY2hcbiAgICogY2FuIGJlIGEgc3RyaW5nIHVzaW5nIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIG5lc3RlZCByZWZlcmVuY2UuIFRoZVxuICAgKiBwcm9wZXJ0eSBjYW5ub3QgZXhpc3Qgb24gdGhlIG9iamVjdCBub3IgYW55d2hlcmUgaW4gaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEub29sb25nJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdE5lc3RlZFByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aCB2YWx1ZSBnaXZlblxuICAgKiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgbmVzdGVkXG4gICAqIHJlZmVyZW5jZS4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEuZ3JlZW4nLCAnbWF0Y2hhJyk7XG4gICAqXG4gICAqIEBuYW1lIG5lc3RlZFByb3BlcnR5VmFsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aFxuICAgKiB2YWx1ZSBnaXZlbiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3JcbiAgICogbmVzdGVkIHJlZmVyZW5jZS4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEuZ3JlZW4nLCAna29uYWNoYScpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ2NvZmZlZS5ncmVlbicsICdtYXRjaGEnKTtcbiAgICpcbiAgICogQG5hbWUgbm90TmVzdGVkUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90TmVzdGVkUHJvcGVydHlWYWwsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcE5lc3RlZFByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBwcm9wZXJ0eSBuYW1lZCBieSBgcHJvcGVydHlgIHdpdGggYSB2YWx1ZSBnaXZlblxuICAgKiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgbmVzdGVkXG4gICAqIHJlZmVyZW5jZS4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG1hdGNoYTogJ3l1bScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBOZXN0ZWRQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwTmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aFxuICAgKiB2YWx1ZSBnaXZlbiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3JcbiAgICogbmVzdGVkIHJlZmVyZW5jZS4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG9vbG9uZzogJ3l1bScgfSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG1hdGNoYTogJ3l1Y2snIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogeyBtYXRjaGE6ICd5dW0nIH0gfSB9LCAndGVhLmJsYWNrJywgeyBtYXRjaGE6ICd5dW0nIH0pO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwTmVzdGVkUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubGVuZ3RoT2Yob2JqZWN0LCBsZW5ndGgsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGBsZW5ndGhgIG9yIGBzaXplYCB3aXRoIHRoZSBleHBlY3RlZCB2YWx1ZS5cbiAgICpcbiAgICogICAgIGFzc2VydC5sZW5ndGhPZihbMSwyLDNdLCAzLCAnYXJyYXkgaGFzIGxlbmd0aCBvZiAzJyk7XG4gICAqICAgICBhc3NlcnQubGVuZ3RoT2YoJ2Zvb2JhcicsIDYsICdzdHJpbmcgaGFzIGxlbmd0aCBvZiA2Jyk7XG4gICAqICAgICBhc3NlcnQubGVuZ3RoT2YobmV3IFNldChbMSwyLDNdKSwgMywgJ3NldCBoYXMgc2l6ZSBvZiAzJyk7XG4gICAqICAgICBhc3NlcnQubGVuZ3RoT2YobmV3IE1hcChbWydhJywxXSxbJ2InLDJdLFsnYycsM11dKSwgMywgJ21hcCBoYXMgc2l6ZSBvZiAzJyk7XG4gICAqXG4gICAqIEBuYW1lIGxlbmd0aE9mXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5sZW5ndGhPZiA9IGZ1bmN0aW9uIChleHAsIGxlbiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lmxlbmd0aE9mLCB0cnVlKS50by5oYXZlLmxlbmd0aE9mKGxlbik7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaGFzQW55S2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5oYXNBbnlLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwgWydmb28nLCAnaURvbnRFeGlzdCcsICdiYXonXSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55S2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtmb286IDMwLCBpRG9udEV4aXN0OiA5OSwgYmF6OiAxMzM3fSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55S2V5cyhuZXcgTWFwKFtbe2ZvbzogMX0sICdiYXInXSwgWydrZXknLCAndmFsdWUnXV0pLCBbe2ZvbzogMX0sICdrZXknXSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55S2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10pLCBbe2ZvbzogJ2Jhcid9LCAnYW5vdGhlcktleSddKTtcbiAgICpcbiAgICogQG5hbWUgaGFzQW55S2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lmhhc0FueUtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55S2V5cywgdHJ1ZSkudG8uaGF2ZS5hbnkua2V5cyhrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmhhc0FsbEtleXMob2JqZWN0LCBba2V5c10sIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhbGwgYW5kIG9ubHkgYWxsIG9mIHRoZSBga2V5c2AgcHJvdmlkZWQuXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lmhhc0FsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ2ZvbycsICdiYXInLCAnYmF6J10pO1xuICAgKiAgICAgYXNzZXJ0Lmhhc0FsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCB7Zm9vOiAzMCwgYmFyOiA5OSwgYmF6OiAxMzM3XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsS2V5cyhuZXcgTWFwKFtbe2ZvbzogMX0sICdiYXInXSwgWydrZXknLCAndmFsdWUnXV0pLCBbe2ZvbzogMX0sICdrZXknXSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsS2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10sIFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10pO1xuICAgKlxuICAgKiBAbmFtZSBoYXNBbGxLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBrZXlzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5oYXNBbGxLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lmhhc0FsbEtleXMsIHRydWUpLnRvLmhhdmUuYWxsLmtleXMoa2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5jb250YWluc0FsbEtleXMob2JqZWN0LCBba2V5c10sIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZCBidXQgbWF5IGhhdmUgbW9yZSBrZXlzIG5vdCBsaXN0ZWQuXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIFsnZm9vJywgJ2JheiddKTtcbiAgICogICAgIGFzc2VydC5jb250YWluc0FsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ2ZvbycsICdiYXInLCAnYmF6J10pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtmb286IDMwLCBiYXo6IDEzMzd9KTtcbiAgICogICAgIGFzc2VydC5jb250YWluc0FsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCB7Zm9vOiAzMCwgYmFyOiA5OSwgYmF6OiAxMzM3fSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7Zm9vOiAxfV0pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyhuZXcgTWFwKFtbe2ZvbzogMX0sICdiYXInXSwgWydrZXknLCAndmFsdWUnXV0pLCBbe2ZvbzogMX0sICdrZXknXSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSwgW3tmb286ICdiYXInfV0pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10sIFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10pO1xuICAgKlxuICAgKiBAbmFtZSBjb250YWluc0FsbEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nW119IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5jb250YWluc0FsbEtleXMsIHRydWUpXG4gICAgICAudG8uY29udGFpbi5hbGwua2V5cyhrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmRvZXNOb3RIYXZlQW55S2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIG5vbmUgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwgWydvbmUnLCAndHdvJywgJ2V4YW1wbGUnXSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwge29uZTogMSwgdHdvOiAyLCBleGFtcGxlOiAnZm9vJ30pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cyhuZXcgTWFwKFtbe2ZvbzogMX0sICdiYXInXSwgWydrZXknLCAndmFsdWUnXV0pLCBbe29uZTogJ3R3byd9LCAnZXhhbXBsZSddKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMobmV3IFNldChbe2ZvbzogJ2Jhcid9LCAnYW5vdGhlcktleSddLCBbe29uZTogJ3R3byd9LCAnZXhhbXBsZSddKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdEhhdmVBbnlLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBrZXlzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmFueS5rZXlzKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdEhhdmVBbGxLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ29uZScsICd0d28nLCAnZXhhbXBsZSddKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCB7b25lOiAxLCB0d286IDIsIGV4YW1wbGU6ICdmb28nfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7b25lOiAndHdvJ30sICdleGFtcGxlJ10pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10sIFt7b25lOiAndHdvJ30sICdleGFtcGxlJ10pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SGF2ZUFsbEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nW119IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUuYWxsLmtleXMoa2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5oYXNBbnlEZWVwS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgWzEsIDJdXSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55RGVlcEtleXMobmV3IE1hcChbW3tvbmU6ICdvbmUnfSwgJ3ZhbHVlT25lJ10sIFsxLCAyXV0pLCBbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55RGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwge29uZTogJ29uZSd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCBbe29uZTogJ29uZSd9LCB7dGhyZWU6ICd0aHJlZSd9XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55RGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGhhc0FueURlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQW55RGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55RGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5oYXNBbGxEZWVwS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGFsbCBhbmQgb25seSBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogU2luY2UgU2V0cyBhbmQgTWFwcyBjYW4gaGF2ZSBvYmplY3RzIGFzIGtleXMgeW91IGNhbiB1c2UgdGhpcyBhc3NlcnRpb24gdG8gcGVyZm9ybVxuICAgKiBhIGRlZXAgY29tcGFyaXNvbi5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IE1hcChbW3tvbmU6ICdvbmUnfSwgJ3ZhbHVlT25lJ11dKSwge29uZTogJ29uZSd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9XSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGhhc0FsbERlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQWxsRGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQWxsRGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5hbGwuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5jb250YWluc0FsbERlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBjb250YWlucyBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogU2luY2UgU2V0cyBhbmQgTWFwcyBjYW4gaGF2ZSBvYmplY3RzIGFzIGtleXMgeW91IGNhbiB1c2UgdGhpcyBhc3NlcnRpb24gdG8gcGVyZm9ybVxuICAgKiBhIGRlZXAgY29tcGFyaXNvbi5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgWzEsIDJdXSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7b25lOiAnb25lJ30pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGNvbnRhaW5zQWxsRGVlcEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBrZXlzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jb250YWluc0FsbERlZXBLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgbm9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge3RoaXNEb2VzTm90OiAnZXhpc3QnfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3t0d2VudHk6ICd0d2VudHknfSwge2ZpZnR5OiAnZmlmdHknfV0pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwge3R3ZW50eTogJ3R3ZW50eSd9KTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG5ldyBTZXQoW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSksIFt7dHdlbnR5OiAndHdlbnR5J30sIHtmaWZ0eTogJ2ZpZnR5J31dKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdEhhdmVBbnlEZWVwS2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbnlEZWVwS2V5cywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge3RoaXNEb2VzTm90OiAnZXhpc3QnfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3t0d2VudHk6ICd0d2VudHknfSwge29uZTogJ29uZSd9XSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7dHdlbnR5OiAndHdlbnR5J30pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge2ZpZnR5OiAnZmlmdHknfV0pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SGF2ZUFsbERlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmFsbC5kZWVwLmtleXMoa2V5cyk7XG4gIH1cblxuIC8qKlxuICAgKiAjIyMgLnRocm93cyhmbiwgW2Vycm9yTGlrZS9zdHJpbmcvcmVnZXhwXSwgW3N0cmluZy9yZWdleHBdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIElmIGBlcnJvckxpa2VgIGlzIGFuIGBFcnJvcmAgY29uc3RydWN0b3IsIGFzc2VydHMgdGhhdCBgZm5gIHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhblxuICAgKiBpbnN0YW5jZSBvZiBgZXJyb3JMaWtlYC5cbiAgICogSWYgYGVycm9yTGlrZWAgaXMgYW4gYEVycm9yYCBpbnN0YW5jZSwgYXNzZXJ0cyB0aGF0IHRoZSBlcnJvciB0aHJvd24gaXMgdGhlIHNhbWVcbiAgICogaW5zdGFuY2UgYXMgYGVycm9yTGlrZWAuXG4gICAqIElmIGBlcnJNc2dNYXRjaGVyYCBpcyBwcm92aWRlZCwgaXQgYWxzbyBhc3NlcnRzIHRoYXQgdGhlIGVycm9yIHRocm93biB3aWxsIGhhdmUgYVxuICAgKiBtZXNzYWdlIG1hdGNoaW5nIGBlcnJNc2dNYXRjaGVyYC5cbiAgICpcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sICdFcnJvciB0aHJvd24gbXVzdCBoYXZlIHRoaXMgbXNnJyk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCAvRXJyb3IgdGhyb3duIG11c3QgaGF2ZSBhIG1zZyB0aGF0IG1hdGNoZXMgdGhpcy8pO1xuICAgKiAgICAgYXNzZXJ0LnRocm93cyhmbiwgUmVmZXJlbmNlRXJyb3IpO1xuICAgKiAgICAgYXNzZXJ0LnRocm93cyhmbiwgZXJyb3JJbnN0YW5jZSk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCBSZWZlcmVuY2VFcnJvciwgJ0Vycm9yIHRocm93biBtdXN0IGJlIGEgUmVmZXJlbmNlRXJyb3IgYW5kIGhhdmUgdGhpcyBtc2cnKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIGVycm9ySW5zdGFuY2UsICdFcnJvciB0aHJvd24gbXVzdCBiZSB0aGUgc2FtZSBlcnJvckluc3RhbmNlIGFuZCBoYXZlIHRoaXMgbXNnJyk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCBSZWZlcmVuY2VFcnJvciwgL0Vycm9yIHRocm93biBtdXN0IGJlIGEgUmVmZXJlbmNlRXJyb3IgYW5kIG1hdGNoIHRoaXMvKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIGVycm9ySW5zdGFuY2UsIC9FcnJvciB0aHJvd24gbXVzdCBiZSB0aGUgc2FtZSBlcnJvckluc3RhbmNlIGFuZCBtYXRjaCB0aGlzLyk7XG4gICAqXG4gICAqIEBuYW1lIHRocm93c1xuICAgKiBAYWxpYXMgdGhyb3dcbiAgICogQGFsaWFzIFRocm93XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3RvcnxFcnJvcn0gZXJyb3JMaWtlXG4gICAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gZXJyTXNnTWF0Y2hlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0Vycm9yX3R5cGVzXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC50aHJvd3MgPSBmdW5jdGlvbiAoZm4sIGVycm9yTGlrZSwgZXJyTXNnTWF0Y2hlciwgbXNnKSB7XG4gICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgZXJyb3JMaWtlIHx8IGVycm9yTGlrZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICAgIGVycm9yTGlrZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGFzc2VydEVyciA9IG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LnRocm93cywgdHJ1ZSlcbiAgICAgIC50by50aHJvdyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIpO1xuICAgIHJldHVybiBmbGFnKGFzc2VydEVyciwgJ29iamVjdCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmRvZXNOb3RUaHJvdyhmbiwgW2Vycm9yTGlrZS9zdHJpbmcvcmVnZXhwXSwgW3N0cmluZy9yZWdleHBdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIElmIGBlcnJvckxpa2VgIGlzIGFuIGBFcnJvcmAgY29uc3RydWN0b3IsIGFzc2VydHMgdGhhdCBgZm5gIHdpbGwgX25vdF8gdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhblxuICAgKiBpbnN0YW5jZSBvZiBgZXJyb3JMaWtlYC5cbiAgICogSWYgYGVycm9yTGlrZWAgaXMgYW4gYEVycm9yYCBpbnN0YW5jZSwgYXNzZXJ0cyB0aGF0IHRoZSBlcnJvciB0aHJvd24gaXMgX25vdF8gdGhlIHNhbWVcbiAgICogaW5zdGFuY2UgYXMgYGVycm9yTGlrZWAuXG4gICAqIElmIGBlcnJNc2dNYXRjaGVyYCBpcyBwcm92aWRlZCwgaXQgYWxzbyBhc3NlcnRzIHRoYXQgdGhlIGVycm9yIHRocm93biB3aWxsIF9ub3RfIGhhdmUgYVxuICAgKiBtZXNzYWdlIG1hdGNoaW5nIGBlcnJNc2dNYXRjaGVyYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90VGhyb3coZm4sICdBbnkgRXJyb3IgdGhyb3duIG11c3Qgbm90IGhhdmUgdGhpcyBtZXNzYWdlJyk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCAvQW55IEVycm9yIHRocm93biBtdXN0IG5vdCBtYXRjaCB0aGlzLyk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBFcnJvcik7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBlcnJvckluc3RhbmNlKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90VGhyb3coZm4sIEVycm9yLCAnRXJyb3IgbXVzdCBub3QgaGF2ZSB0aGlzIG1lc3NhZ2UnKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90VGhyb3coZm4sIGVycm9ySW5zdGFuY2UsICdFcnJvciBtdXN0IG5vdCBoYXZlIHRoaXMgbWVzc2FnZScpO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgRXJyb3IsIC9FcnJvciBtdXN0IG5vdCBtYXRjaCB0aGlzLyk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBlcnJvckluc3RhbmNlLCAvRXJyb3IgbXVzdCBub3QgbWF0Y2ggdGhpcy8pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90VGhyb3dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2VcbiAgICogQHBhcmFtIHtSZWdFeHB8U3RyaW5nfSBlcnJNc2dNYXRjaGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjRXJyb3JfdHlwZXNcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uIChmbiwgZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyLCBtc2cpIHtcbiAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgICB9XG5cbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90VGhyb3csIHRydWUpXG4gICAgICAudG8ubm90LnRocm93KGVycm9yTGlrZSwgZXJyTXNnTWF0Y2hlcik7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAub3BlcmF0b3IodmFsMSwgb3BlcmF0b3IsIHZhbDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQ29tcGFyZXMgdHdvIHZhbHVlcyB1c2luZyBgb3BlcmF0b3JgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm9wZXJhdG9yKDEsICc8JywgMiwgJ2V2ZXJ5dGhpbmcgaXMgb2snKTtcbiAgICogICAgIGFzc2VydC5vcGVyYXRvcigxLCAnPicsIDIsICd0aGlzIHdpbGwgZmFpbCcpO1xuICAgKlxuICAgKiBAbmFtZSBvcGVyYXRvclxuICAgKiBAcGFyYW0ge01peGVkfSB2YWwxXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBvcGVyYXRvclxuICAgKiBAcGFyYW0ge01peGVkfSB2YWwyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vcGVyYXRvciA9IGZ1bmN0aW9uICh2YWwsIG9wZXJhdG9yLCB2YWwyLCBtc2cpIHtcbiAgICB2YXIgb2s7XG4gICAgc3dpdGNoKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlICc9PSc6XG4gICAgICAgIG9rID0gdmFsID09IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPT09JzpcbiAgICAgICAgb2sgPSB2YWwgPT09IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPic6XG4gICAgICAgIG9rID0gdmFsID4gdmFsMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc+PSc6XG4gICAgICAgIG9rID0gdmFsID49IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIG9rID0gdmFsIDwgdmFsMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc8PSc6XG4gICAgICAgIG9rID0gdmFsIDw9IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnIT0nOlxuICAgICAgICBvayA9IHZhbCAhPSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgIG9rID0gdmFsICE9PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG1zZyA9IG1zZyA/IG1zZyArICc6ICcgOiBtc2c7XG4gICAgICAgIHRocm93IG5ldyBjaGFpLkFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIG1zZyArICdJbnZhbGlkIG9wZXJhdG9yIFwiJyArIG9wZXJhdG9yICsgJ1wiJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgYXNzZXJ0Lm9wZXJhdG9yXG4gICAgICAgICk7XG4gICAgfVxuICAgIHZhciB0ZXN0ID0gbmV3IEFzc2VydGlvbihvaywgbXNnLCBhc3NlcnQub3BlcmF0b3IsIHRydWUpO1xuICAgIHRlc3QuYXNzZXJ0KFxuICAgICAgICB0cnVlID09PSBmbGFnKHRlc3QsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgJyArIHV0aWwuaW5zcGVjdCh2YWwpICsgJyB0byBiZSAnICsgb3BlcmF0b3IgKyAnICcgKyB1dGlsLmluc3BlY3QodmFsMilcbiAgICAgICwgJ2V4cGVjdGVkICcgKyB1dGlsLmluc3BlY3QodmFsKSArICcgdG8gbm90IGJlICcgKyBvcGVyYXRvciArICcgJyArIHV0aWwuaW5zcGVjdCh2YWwyKSApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmNsb3NlVG8oYWN0dWFsLCBleHBlY3RlZCwgZGVsdGEsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgYGV4cGVjdGVkYCwgdG8gd2l0aGluIGEgKy8tIGBkZWx0YWAgcmFuZ2UuXG4gICAqXG4gICAqICAgICBhc3NlcnQuY2xvc2VUbygxLjUsIDEsIDAuNSwgJ251bWJlcnMgYXJlIGNsb3NlJyk7XG4gICAqXG4gICAqIEBuYW1lIGNsb3NlVG9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjdHVhbFxuICAgKiBAcGFyYW0ge051bWJlcn0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jbG9zZVRvID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmNsb3NlVG8sIHRydWUpLnRvLmJlLmNsb3NlVG8oZXhwLCBkZWx0YSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuYXBwcm94aW1hdGVseShhY3R1YWwsIGV4cGVjdGVkLCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCBgZXhwZWN0ZWRgLCB0byB3aXRoaW4gYSArLy0gYGRlbHRhYCByYW5nZS5cbiAgICpcbiAgICogICAgIGFzc2VydC5hcHByb3hpbWF0ZWx5KDEuNSwgMSwgMC41LCAnbnVtYmVycyBhcmUgY2xvc2UnKTtcbiAgICpcbiAgICogQG5hbWUgYXBwcm94aW1hdGVseVxuICAgKiBAcGFyYW0ge051bWJlcn0gYWN0dWFsXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmFwcHJveGltYXRlbHkgPSBmdW5jdGlvbiAoYWN0LCBleHAsIGRlbHRhLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuYXBwcm94aW1hdGVseSwgdHJ1ZSlcbiAgICAgIC50by5iZS5hcHByb3hpbWF0ZWx5KGV4cCwgZGVsdGEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnNhbWVNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiBhbnkgb3JkZXIuIFVzZXMgYVxuICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuc2FtZU1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMiwgMSwgMyBdLCAnc2FtZSBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIHNhbWVNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZU1lbWJlcnMgPSBmdW5jdGlvbiAoc2V0MSwgc2V0MiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzZXQxLCBtc2csIGFzc2VydC5zYW1lTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnNhbWUubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm5vdFNhbWVNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGRvbid0IGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiBhbnkgb3JkZXIuXG4gICAqIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90U2FtZU1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgNSwgMSwgMyBdLCAnbm90IHNhbWUgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RTYW1lTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdFNhbWVNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZU1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuc2FtZURlZXBNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiBhbnkgb3JkZXIuIFVzZXMgYVxuICAgKiBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgW3sgYjogMiB9LCB7IGE6IDEgfSwgeyBjOiAzIH1dLCAnc2FtZSBkZWVwIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgc2FtZURlZXBNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZURlZXBNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuc2FtZS5kZWVwLm1lbWJlcnMoc2V0Mik7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RTYW1lRGVlcE1lbWJlcnMoc2V0MSwgc2V0MiwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHNldDFgIGFuZCBgc2V0MmAgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBtZW1iZXJzIGluIGFueSBvcmRlci5cbiAgICogVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbeyBiOiAyIH0sIHsgYTogMSB9LCB7IGY6IDUgfV0sICdub3Qgc2FtZSBkZWVwIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90U2FtZURlZXBNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnNhbWUuZGVlcC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuc2FtZU9yZGVyZWRNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICogVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5zYW1lT3JkZXJlZE1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMSwgMiwgMyBdLCAnc2FtZSBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgc2FtZU9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuc2FtZS5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RTYW1lT3JkZXJlZE1lbWJlcnMoc2V0MSwgc2V0MiwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHNldDFgIGFuZCBgc2V0MmAgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBtZW1iZXJzIGluIHRoZSBzYW1lXG4gICAqIG9yZGVyLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycyhbIDEsIDIsIDMgXSwgWyAyLCAxLCAzIF0sICdub3Qgc2FtZSBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90U2FtZU9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnNhbWUub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuc2FtZURlZXBPcmRlcmVkTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCAnc2FtZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBzYW1lRGVlcE9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBkb24ndCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gdGhlIHNhbWVcbiAgICogb3JkZXIuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IHo6IDUgfSBdLCAnbm90IHNhbWUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICogICAgIGFzc2VydC5ub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGE6IDEgfSwgeyBjOiAzIH0gXSwgJ25vdCBzYW1lIGRlZXAgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnNcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MVxuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jbHVkZU1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXMgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiBhbnkgb3JkZXIuIFVzZXMgYVxuICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuIER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZU1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMiwgMSwgMiBdLCAnaW5jbHVkZSBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIGluY2x1ZGVNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5jbHVkZU1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQuaW5jbHVkZU1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaW5jbHVkZS5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RJbmNsdWRlTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpc24ndCBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIGFueSBvcmRlci4gVXNlcyBhXG4gICAqIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS4gRHVwbGljYXRlcyBhcmUgaWdub3JlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlTWVtYmVycyhbIDEsIDIsIDMgXSwgWyA1LCAxIF0sICdub3QgaW5jbHVkZSBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90SW5jbHVkZU1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZU1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmluY2x1ZGUubWVtYmVycyhzdWJzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jbHVkZURlZXBNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzIGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gYW55IG9yZGVyLiBVc2VzIGEgZGVlcFxuICAgKiBlcXVhbGl0eSBjaGVjay4gRHVwbGljYXRlcyBhcmUgaWdub3JlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBiOiAyIH0sIHsgYTogMSB9LCB7IGI6IDIgfSBdLCAnaW5jbHVkZSBkZWVwIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgaW5jbHVkZURlZXBNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5pbmNsdWRlLmRlZXAubWVtYmVycyhzdWJzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90SW5jbHVkZURlZXBNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzbid0IGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gYW55IG9yZGVyLiBVc2VzIGFcbiAgICogZGVlcCBlcXVhbGl0eSBjaGVjay4gRHVwbGljYXRlcyBhcmUgaWdub3JlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBiOiAyIH0sIHsgZjogNSB9IF0sICdub3QgaW5jbHVkZSBkZWVwIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5jbHVkZURlZXBNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY2x1ZGVPcmRlcmVkTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpcyBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIHRoZSBzYW1lIG9yZGVyXG4gICAqIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IGluIGBzdXBlcnNldGAuIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHlcbiAgICogY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZU9yZGVyZWRNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDEsIDIgXSwgJ2luY2x1ZGUgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIGluY2x1ZGVPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaW5jbHVkZS5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpc24ndCBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIHRoZSBzYW1lIG9yZGVyXG4gICAqIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IGluIGBzdXBlcnNldGAuIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHlcbiAgICogY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDIsIDEgXSwgJ25vdCBpbmNsdWRlIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyhbIDEsIDIsIDMgXSwgWyAyLCAzIF0sICdub3QgaW5jbHVkZSBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaW5jbHVkZS5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXMgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiB0aGUgc2FtZSBvcmRlclxuICAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBpbiBgc3VwZXJzZXRgLiBVc2VzIGEgZGVlcCBlcXVhbGl0eVxuICAgKiBjaGVjay5cbiAgICpcbiAgICogICAgIGFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYTogMSB9LCB7IGI6IDIgfSBdLCAnaW5jbHVkZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBpbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmluY2x1ZGUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXNuJ3QgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiB0aGUgc2FtZSBvcmRlclxuICAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBpbiBgc3VwZXJzZXRgLiBVc2VzIGEgZGVlcCBlcXVhbGl0eVxuICAgKiBjaGVjay5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYTogMSB9LCB7IGY6IDUgfSBdLCAnbm90IGluY2x1ZGUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGE6IDEgfSBdLCAnbm90IGluY2x1ZGUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGM6IDMgfSBdLCAnbm90IGluY2x1ZGUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaW5jbHVkZS5kZWVwLm9yZGVyZWQubWVtYmVycyhzdWJzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAub25lT2YoaW5MaXN0LCBsaXN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBub24tb2JqZWN0LCBub24tYXJyYXkgdmFsdWUgYGluTGlzdGAgYXBwZWFycyBpbiB0aGUgZmxhdCBhcnJheSBgbGlzdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQub25lT2YoMSwgWyAyLCAxIF0sICdOb3QgZm91bmQgaW4gbGlzdCcpO1xuICAgKlxuICAgKiBAbmFtZSBvbmVPZlxuICAgKiBAcGFyYW0geyp9IGluTGlzdFxuICAgKiBAcGFyYW0ge0FycmF5PCo+fSBsaXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vbmVPZiA9IGZ1bmN0aW9uIChpbkxpc3QsIGxpc3QsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oaW5MaXN0LCBtc2csIGFzc2VydC5vbmVPZiwgdHJ1ZSkudG8uYmUub25lT2YobGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5jaGFuZ2VzKGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDIyIH07XG4gICAqICAgICBhc3NlcnQuY2hhbmdlcyhmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGNoYW5nZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jaGFuZ2VzID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1zZyA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5jaGFuZ2VzLCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKTtcbiAgfVxuXG4gICAvKipcbiAgICogIyMjIC5jaGFuZ2VzQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgYnkgYW4gYW1vdW50IChkZWx0YSkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCArPSAyIH07XG4gICAqICAgICBhc3NlcnQuY2hhbmdlc0J5KGZuLCBvYmosICd2YWwnLCAyKTtcbiAgICpcbiAgICogQG5hbWUgY2hhbmdlc0J5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jaGFuZ2VzQnkgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0bXBNc2cgPSBkZWx0YTtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIG1zZyA9IHRtcE1zZztcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmNoYW5nZXNCeSwgdHJ1ZSlcbiAgICAgIC50by5jaGFuZ2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG4gIH1cblxuICAgLyoqXG4gICAqICMjIyAuZG9lc05vdENoYW5nZShmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ZvbycpOyB9O1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RDaGFuZ2UoZm4sIG9iaiwgJ3ZhbCcpO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90Q2hhbmdlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdENoYW5nZSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3RDaGFuZ2UsIHRydWUpXG4gICAgICAudG8ubm90LmNoYW5nZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuY2hhbmdlc0J1dE5vdEJ5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb3Igb2YgYSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBieSBhbiBhbW91bnQgKGRlbHRhKVxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgKz0gMTAgfTtcbiAgICogICAgIGFzc2VydC5jaGFuZ2VzQnV0Tm90QnkoZm4sIG9iaiwgJ3ZhbCcsIDUpO1xuICAgKlxuICAgKiBAbmFtZSBjaGFuZ2VzQnV0Tm90QnlcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge051bWJlcn0gY2hhbmdlIGFtb3VudCAoZGVsdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmNoYW5nZXNCdXROb3RCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J1dE5vdEJ5LCB0cnVlKVxuICAgICAgLnRvLmNoYW5nZShvYmosIHByb3ApLmJ1dC5ub3QuYnkoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jcmVhc2VzKGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGluY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5LlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgPSAxMyB9O1xuICAgKiAgICAgYXNzZXJ0LmluY3JlYXNlcyhmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGluY3JlYXNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY3JlYXNlcyA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmluY3JlYXNlcywgdHJ1ZSlcbiAgICAgIC50by5pbmNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jcmVhc2VzQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGluY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCArPSAxMCB9O1xuICAgKiAgICAgYXNzZXJ0LmluY3JlYXNlc0J5KGZuLCBvYmosICd2YWwnLCAxMCk7XG4gICAqXG4gICAqIEBuYW1lIGluY3JlYXNlc0J5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNyZWFzZXNCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnksIHRydWUpXG4gICAgICAudG8uaW5jcmVhc2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90SW5jcmVhc2UoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgaW5jcmVhc2UgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eS5cbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gOCB9O1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RJbmNyZWFzZShmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGRvZXNOb3RJbmNyZWFzZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RJbmNyZWFzZSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3RJbmNyZWFzZSwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaW5jcmVhc2Uob2JqLCBwcm9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY3JlYXNlc0J1dE5vdEJ5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBpbmNyZWFzZSBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGJ5IGFuIGFtb3VudCAoZGVsdGEpLlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgPSAxNSB9O1xuICAgKiAgICAgYXNzZXJ0LmluY3JlYXNlc0J1dE5vdEJ5KGZuLCBvYmosICd2YWwnLCAxMCk7XG4gICAqXG4gICAqIEBuYW1lIGluY3JlYXNlc0J1dE5vdEJ5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnksIHRydWUpXG4gICAgICAudG8uaW5jcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmRlY3JlYXNlcyhmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkZWNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eS5cbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRlY3JlYXNlcyhmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlY3JlYXNlcyA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlcywgdHJ1ZSlcbiAgICAgIC50by5kZWNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZGVjcmVhc2VzQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsIC09IDUgfTtcbiAgICogICAgIGFzc2VydC5kZWNyZWFzZXNCeShmbiwgb2JqLCAndmFsJywgNSk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc0J5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWNyZWFzZXNCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZGVjcmVhc2VzQnksIHRydWUpXG4gICAgICAudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90RGVjcmVhc2UoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgZGVjcmVhc2VzIGEgbnVtZXJpYyBvYmplY3QgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDE1IH07XG4gICAqICAgICBhc3NlcnQuZG9lc05vdERlY3JlYXNlKGZuLCBvYmosICd2YWwnKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdERlY3JlYXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdERlY3JlYXNlID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1zZyA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdERlY3JlYXNlLCB0cnVlKVxuICAgICAgLnRvLm5vdC5kZWNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdERlY3JlYXNlQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRvZXMgbm90IGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5KGZuLCBvYmosICd2YWwnLCAxKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdERlY3JlYXNlQnlcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge051bWJlcn0gY2hhbmdlIGFtb3VudCAoZGVsdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5ID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdG1wTXNnID0gZGVsdGE7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBtc2cgPSB0bXBNc2c7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdERlY3JlYXNlQnksIHRydWUpXG4gICAgICAudG8ubm90LmRlY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZGVjcmVhc2VzQnV0Tm90QnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRvZXMgbm90IGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRlY3JlYXNlc0J1dE5vdEJ5KGZuLCBvYmosICd2YWwnLCAxKTtcbiAgICpcbiAgICogQG5hbWUgZGVjcmVhc2VzQnV0Tm90QnlcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge051bWJlcn0gY2hhbmdlIGFtb3VudCAoZGVsdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlY3JlYXNlc0J1dE5vdEJ5ID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdG1wTXNnID0gZGVsdGE7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBtc2cgPSB0bXBNc2c7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSwgdHJ1ZSlcbiAgICAgIC50by5kZWNyZWFzZShvYmosIHByb3ApLmJ1dC5ub3QuYnkoZGVsdGEpO1xuICB9XG5cbiAgLyohXG4gICAqICMjIyAuaWZFcnJvcihvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgaWYgdmFsdWUgaXMgbm90IGEgZmFsc2UgdmFsdWUsIGFuZCB0aHJvd3MgaWYgaXQgaXMgYSB0cnVlIHZhbHVlLlxuICAgKiBUaGlzIGlzIGFkZGVkIHRvIGFsbG93IGZvciBjaGFpIHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgTm9kZSdzXG4gICAqIGFzc2VydCBjbGFzcy5cbiAgICpcbiAgICogICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0kgYW0gYSBjdXN0b20gZXJyb3InKTtcbiAgICogICAgIGFzc2VydC5pZkVycm9yKGVycik7IC8vIFJldGhyb3dzIGVyciFcbiAgICpcbiAgICogQG5hbWUgaWZFcnJvclxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRocm93KHZhbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzRXh0ZW5zaWJsZShvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBleHRlbnNpYmxlIChjYW4gaGF2ZSBuZXcgcHJvcGVydGllcyBhZGRlZCB0byBpdCkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNFeHRlbnNpYmxlKHt9KTtcbiAgICpcbiAgICogQG5hbWUgaXNFeHRlbnNpYmxlXG4gICAqIEBhbGlhcyBleHRlbnNpYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNFeHRlbnNpYmxlID0gZnVuY3Rpb24gKG9iaiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzRXh0ZW5zaWJsZSwgdHJ1ZSkudG8uYmUuZXh0ZW5zaWJsZTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEV4dGVuc2libGUob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgX25vdF8gZXh0ZW5zaWJsZS5cbiAgICpcbiAgICogICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KTtcbiAgICogICAgIHZhciBzZWFsZWRPYmplY3QgPSBPYmplY3Quc2VhbCh7fSk7XG4gICAqICAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3RFeHRlbnNpYmxlKG5vbkV4dGVuc2libGVPYmplY3QpO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZShzZWFsZWRPYmplY3QpO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZShmcm96ZW5PYmplY3QpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdEV4dGVuc2libGVcbiAgICogQGFsaWFzIG5vdEV4dGVuc2libGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdEV4dGVuc2libGUgPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RFeHRlbnNpYmxlLCB0cnVlKS50by5ub3QuYmUuZXh0ZW5zaWJsZTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc1NlYWxlZChvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBzZWFsZWQgKGNhbm5vdCBoYXZlIG5ldyBwcm9wZXJ0aWVzIGFkZGVkIHRvIGl0XG4gICAqIGFuZCBpdHMgZXhpc3RpbmcgcHJvcGVydGllcyBjYW5ub3QgYmUgcmVtb3ZlZCkuXG4gICAqXG4gICAqICAgICB2YXIgc2VhbGVkT2JqZWN0ID0gT2JqZWN0LnNlYWwoe30pO1xuICAgKiAgICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5zZWFsKHt9KTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pc1NlYWxlZChzZWFsZWRPYmplY3QpO1xuICAgKiAgICAgYXNzZXJ0LmlzU2VhbGVkKGZyb3plbk9iamVjdCk7XG4gICAqXG4gICAqIEBuYW1lIGlzU2VhbGVkXG4gICAqIEBhbGlhcyBzZWFsZWRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc1NlYWxlZCA9IGZ1bmN0aW9uIChvYmosIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc1NlYWxlZCwgdHJ1ZSkudG8uYmUuc2VhbGVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTm90U2VhbGVkKG9iamVjdClcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGlzIF9ub3RfIHNlYWxlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc05vdFNlYWxlZCh7fSk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90U2VhbGVkXG4gICAqIEBhbGlhcyBub3RTZWFsZWRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdFNlYWxlZCA9IGZ1bmN0aW9uIChvYmosIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdFNlYWxlZCwgdHJ1ZSkudG8ubm90LmJlLnNlYWxlZDtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0Zyb3plbihvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBmcm96ZW4gKGNhbm5vdCBoYXZlIG5ldyBwcm9wZXJ0aWVzIGFkZGVkIHRvIGl0XG4gICAqIGFuZCBpdHMgZXhpc3RpbmcgcHJvcGVydGllcyBjYW5ub3QgYmUgbW9kaWZpZWQpLlxuICAgKlxuICAgKiAgICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgKiAgICAgYXNzZXJ0LmZyb3plbihmcm96ZW5PYmplY3QpO1xuICAgKlxuICAgKiBAbmFtZSBpc0Zyb3plblxuICAgKiBAYWxpYXMgZnJvemVuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNGcm96ZW4gPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNGcm96ZW4sIHRydWUpLnRvLmJlLmZyb3plbjtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEZyb3plbihvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBfbm90XyBmcm96ZW4uXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3RGcm96ZW4oe30pO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdEZyb3plblxuICAgKiBAYWxpYXMgbm90RnJvemVuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RGcm96ZW4gPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RGcm96ZW4sIHRydWUpLnRvLm5vdC5iZS5mcm96ZW47XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNFbXB0eSh0YXJnZXQpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGRvZXMgbm90IGNvbnRhaW4gYW55IHZhbHVlcy5cbiAgICogRm9yIGFycmF5cyBhbmQgc3RyaW5ncywgaXQgY2hlY2tzIHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eS5cbiAgICogRm9yIGBNYXBgIGFuZCBgU2V0YCBpbnN0YW5jZXMsIGl0IGNoZWNrcyB0aGUgYHNpemVgIHByb3BlcnR5LlxuICAgKiBGb3Igbm9uLWZ1bmN0aW9uIG9iamVjdHMsIGl0IGdldHMgdGhlIGNvdW50IG9mIG93blxuICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzRW1wdHkoW10pO1xuICAgKiAgICAgYXNzZXJ0LmlzRW1wdHkoJycpO1xuICAgKiAgICAgYXNzZXJ0LmlzRW1wdHkobmV3IE1hcCk7XG4gICAqICAgICBhc3NlcnQuaXNFbXB0eSh7fSk7XG4gICAqXG4gICAqIEBuYW1lIGlzRW1wdHlcbiAgICogQGFsaWFzIGVtcHR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ3xNYXB8U2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRW1wdHksIHRydWUpLnRvLmJlLmVtcHR5O1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTm90RW1wdHkodGFyZ2V0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBjb250YWlucyB2YWx1ZXMuXG4gICAqIEZvciBhcnJheXMgYW5kIHN0cmluZ3MsIGl0IGNoZWNrcyB0aGUgYGxlbmd0aGAgcHJvcGVydHkuXG4gICAqIEZvciBgTWFwYCBhbmQgYFNldGAgaW5zdGFuY2VzLCBpdCBjaGVja3MgdGhlIGBzaXplYCBwcm9wZXJ0eS5cbiAgICogRm9yIG5vbi1mdW5jdGlvbiBvYmplY3RzLCBpdCBnZXRzIHRoZSBjb3VudCBvZiBvd25cbiAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc05vdEVtcHR5KFsxLCAyXSk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RFbXB0eSgnMzQnKTtcbiAgICogICAgIGFzc2VydC5pc05vdEVtcHR5KG5ldyBTZXQoWzUsIDZdKSk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RFbXB0eSh7IGtleTogNyB9KTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RFbXB0eVxuICAgKiBAYWxpYXMgbm90RW1wdHlcbiAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl8U3RyaW5nfE1hcHxTZXR9IHRhcmdldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdEVtcHR5ID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RFbXB0eSwgdHJ1ZSkudG8ubm90LmJlLmVtcHR5O1xuICB9O1xuXG4gIC8qIVxuICAgKiBBbGlhc2VzLlxuICAgKi9cblxuICAoZnVuY3Rpb24gYWxpYXMobmFtZSwgYXMpe1xuICAgIGFzc2VydFthc10gPSBhc3NlcnRbbmFtZV07XG4gICAgcmV0dXJuIGFsaWFzO1xuICB9KVxuICAoJ2lzT2snLCAnb2snKVxuICAoJ2lzTm90T2snLCAnbm90T2snKVxuICAoJ3Rocm93cycsICd0aHJvdycpXG4gICgndGhyb3dzJywgJ1Rocm93JylcbiAgKCdpc0V4dGVuc2libGUnLCAnZXh0ZW5zaWJsZScpXG4gICgnaXNOb3RFeHRlbnNpYmxlJywgJ25vdEV4dGVuc2libGUnKVxuICAoJ2lzU2VhbGVkJywgJ3NlYWxlZCcpXG4gICgnaXNOb3RTZWFsZWQnLCAnbm90U2VhbGVkJylcbiAgKCdpc0Zyb3plbicsICdmcm96ZW4nKVxuICAoJ2lzTm90RnJvemVuJywgJ25vdEZyb3plbicpXG4gICgnaXNFbXB0eScsICdlbXB0eScpXG4gICgnaXNOb3RFbXB0eScsICdub3RFbXB0eScpO1xufTtcbiIsICIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgdXNlZCA9IFtdO1xuXG4vKiFcbiAqIENoYWkgdmVyc2lvblxuICovXG5cbmV4cG9ydHMudmVyc2lvbiA9ICc0LjMuMyc7XG5cbi8qIVxuICogQXNzZXJ0aW9uIEVycm9yXG4gKi9cblxuZXhwb3J0cy5Bc3NlcnRpb25FcnJvciA9IHJlcXVpcmUoJ2Fzc2VydGlvbi1lcnJvcicpO1xuXG4vKiFcbiAqIFV0aWxzIGZvciBwbHVnaW5zIChub3QgZXhwb3J0ZWQpXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL2NoYWkvdXRpbHMnKTtcblxuLyoqXG4gKiAjIC51c2UoZnVuY3Rpb24pXG4gKlxuICogUHJvdmlkZXMgYSB3YXkgdG8gZXh0ZW5kIHRoZSBpbnRlcm5hbHMgb2YgQ2hhaS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICogQHJldHVybnMge3RoaXN9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnVzZSA9IGZ1bmN0aW9uIChmbikge1xuICBpZiAoIX51c2VkLmluZGV4T2YoZm4pKSB7XG4gICAgZm4oZXhwb3J0cywgdXRpbCk7XG4gICAgdXNlZC5wdXNoKGZuKTtcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzO1xufTtcblxuLyohXG4gKiBVdGlsaXR5IEZ1bmN0aW9uc1xuICovXG5cbmV4cG9ydHMudXRpbCA9IHV0aWw7XG5cbi8qIVxuICogQ29uZmlndXJhdGlvblxuICovXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NoYWkvY29uZmlnJyk7XG5leHBvcnRzLmNvbmZpZyA9IGNvbmZpZztcblxuLyohXG4gKiBQcmltYXJ5IGBBc3NlcnRpb25gIHByb3RvdHlwZVxuICovXG5cbnZhciBhc3NlcnRpb24gPSByZXF1aXJlKCcuL2NoYWkvYXNzZXJ0aW9uJyk7XG5leHBvcnRzLnVzZShhc3NlcnRpb24pO1xuXG4vKiFcbiAqIENvcmUgQXNzZXJ0aW9uc1xuICovXG5cbnZhciBjb3JlID0gcmVxdWlyZSgnLi9jaGFpL2NvcmUvYXNzZXJ0aW9ucycpO1xuZXhwb3J0cy51c2UoY29yZSk7XG5cbi8qIVxuICogRXhwZWN0IGludGVyZmFjZVxuICovXG5cbnZhciBleHBlY3QgPSByZXF1aXJlKCcuL2NoYWkvaW50ZXJmYWNlL2V4cGVjdCcpO1xuZXhwb3J0cy51c2UoZXhwZWN0KTtcblxuLyohXG4gKiBTaG91bGQgaW50ZXJmYWNlXG4gKi9cblxudmFyIHNob3VsZCA9IHJlcXVpcmUoJy4vY2hhaS9pbnRlcmZhY2Uvc2hvdWxkJyk7XG5leHBvcnRzLnVzZShzaG91bGQpO1xuXG4vKiFcbiAqIEFzc2VydCBpbnRlcmZhY2VcbiAqL1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnLi9jaGFpL2ludGVyZmFjZS9hc3NlcnQnKTtcbmV4cG9ydHMudXNlKGFzc2VydCk7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9jaGFpJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuZXhwb3J0IHtCYXNlfVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZnJvbSB3aGljaCBhbGwgbW9uc3RlciBjbGFzc2VzIGFyZSBkZXJpdmVkLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0Jhc2V9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL2Jhc2UubWpzJztcbiAqIG5ldyBCYXNlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogVGhlIGNsYXNzIHdhcyBmb3JtZXJseSBjYWxsZWQgT2JqZWN0LlxuICpcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbiBjbGFzcyBCYXNlIGV4dGVuZHMgT2JqZWN0IHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgIH07XG5cblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmV4cG9ydCB7aXNJdGVyYWJsZSwgaXNQcmltaXRpdmUsIGlzU3ltYm9sLCBpc0Jvb2xlYW4sIGlzU3RyaW5nLCBpc09iamVjdCwgaXNJbnN0YW5jZSwgaXNBcnJheSwgaXNGdW5jdGlvbiwgaXNJbnRlZ2VyfVxuXG5cbi8qKlxuICogV2l0aCB0aGlzIGZ1bmN0aW9uIHlvdSBjYW4gY2hlY2sgaWYgYSB2YWx1ZSBpcyBpdGVyYWJsZS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBsaWJyYXJ5IHRvIGhhdmUgY29uc2lzdGVudCBuYW1lcy5cbiAqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIG1ldGhvZCB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLlR5cGVzLmlzUHJpbWl0aXZlKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2lzSXRlcmFibGV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL2lzLm1qcyc7XG4gKiBpc0l0ZXJhYmxlKG51bGwpICAvLyBcdTIxQTYgZmFsc2VcbiAqIGlzSXRlcmFibGUoJ2hlbGxvJykgIC8vIFx1MjFBNiB0cnVlXG4gKiBpc0l0ZXJhYmxlKFtdKSAgLy8gXHUyMUE2IHRydWVcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAc2luY2UgMS4yLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBwcmltaXRpdmUgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBOYU4sIHVuZGVmaW5lZCwgbnVsbCBvciBzeW1ib2wpXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7aXNQcmltaXRpdmV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL2lzLm1qcyc7XG4gKiBpc1ByaW1pdGl2ZSgnMicpKSAgLy8gXHUyMUE2IHRydWVcbiAqIGlzUHJpbWl0aXZlKFtdKSkgIC8vIFx1MjFBNiBmYWxzZVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgdmFyIHR5cGU7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIHBhc3NlZCBpcyBhIHN5bWJvbFxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2lzU3ltYm9sfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9pcy5tanMnO1xuICogaXNTeW1ib2woU3ltYm9sKCdhJykpKSAgLy8gXHUyMUE2IHRydWVcbiAqIGlzU3ltYm9sKFtdKSAgLy8gXHUyMUE2IGZhbHNlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgICByZXR1cm4gKCdzeW1ib2wnID09PSB0eXBlb2YgdmFsdWUpID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBib29sZWFuLlxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2lzQm9vbGVhbn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvaXMubWpzJztcbiAqIGlzQm9vbGVhbignMicpKSAgLy8gXHUyMUE2IGZhbHNlXG4gKiBpc0Jvb2xlYW4oW10pKSAgLy8gXHUyMUE2IGZhbHNlXG4gKiBpc0Jvb2xlYW4oMj40KSkgIC8vIFx1MjFBNiB0cnVlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG5cbiAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgcGFzc2VkIGlzIGEgc3RyaW5nXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7aXNTdHJpbmd9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL2lzLm1qcyc7XG4gKiBpc1N0cmluZygnMicpKSAgLy8gXHUyMUE2IHRydWVcbiAqIGlzU3RyaW5nKFtdKSkgIC8vIFx1MjFBNiBmYWxzZVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBvYmplY3RcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBsaWJyYXJ5IHRvIGhhdmUgY29uc2lzdGVudCBuYW1lcy5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtpc09iamVjdH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvaXMubWpzJztcbiAqIGlzT2JqZWN0KCcyJykpICAvLyBcdTIxQTYgZmFsc2VcbiAqIGlzT2JqZWN0KFtdKSkgIC8vIFx1MjFBNiBmYWxzZVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG5cbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIHBhc3NlZCBpcyBhIG9iamVjdCBhbmQgaW5zdGFuY2Ugb2YgaW5zdGFuY2UuXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7aXNJbnN0YW5jZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvaXMubWpzJztcbiAqIGlzSW5zdGFuY2UoJzInKSkgIC8vIFx1MjFBNiBmYWxzZVxuICogaXNJbnN0YW5jZShbXSkpICAvLyBcdTIxQTYgZmFsc2VcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHsqfSBpbnN0YW5jZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5mdW5jdGlvbiBpc0luc3RhbmNlKHZhbHVlLCBpbnN0YW5jZSkge1xuICAgIGlmICghaXNPYmplY3QodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGluc3RhbmNlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghaW5zdGFuY2UuaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIGluc3RhbmNlKSA/IHRydWUgOiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgcGFzc2VkIGlzIGEgYXJyYXlcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBsaWJyYXJ5IHRvIGhhdmUgY29uc2lzdGVudCBuYW1lcy5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtpc0FycmF5fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9pcy5tanMnO1xuICogaXNBcnJheSgnMicpKSAgLy8gXHUyMUE2IGZhbHNlXG4gKiBpc0FycmF5KFtdKSkgIC8vIFx1MjFBNiB0cnVlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZGUvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaXNBcnJheVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBmdW5jdGlvblxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2lzRnVuY3Rpb259IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL2lzLm1qcyc7XG4gKiBpc0Z1bmN0aW9uKCgpPT57fSkgLy8gXHUyMUE2IHRydWVcbiAqIGlzRnVuY3Rpb24oJzInKSkgIC8vIFx1MjFBNiBmYWxzZVxuICogaXNGdW5jdGlvbihbXSkpICAvLyBcdTIxQTYgZmFsc2VcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG5cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgcGFzc2VkIGlzIGFuIGludGVnZXIuXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7aXNJbnRlZ2VyfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9pcy5tanMnO1xuICogaXNJbnRlZ2VyKCgpPT57fSkgLy8gXHUyMUE2IHRydWVcbiAqIGlzSW50ZWdlcignMicpKSAgLy8gXHUyMUE2IGZhbHNlXG4gKiBpc0ludGVnZXIoMikpICAvLyBcdTIxQTYgdHJ1ZVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBzaW5jZSAxLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbn1cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7XG4gICAgaXNBcnJheSxcbiAgICBpc0Jvb2xlYW4sXG4gICAgaXNGdW5jdGlvbixcbiAgICBpc0luc3RhbmNlLFxuICAgIGlzSW50ZWdlcixcbiAgICBpc0l0ZXJhYmxlLFxuICAgIGlzT2JqZWN0LFxuICAgIGlzUHJpbWl0aXZlLFxuICAgIGlzU3RyaW5nLFxuICAgIGlzU3ltYm9sXG59IGZyb20gJy4vaXMubWpzJztcblxuZXhwb3J0IHtcbiAgICB2YWxpZGF0ZUl0ZXJhYmxlLFxuICAgIHZhbGlkYXRlUHJpbWl0aXZlLFxuICAgIHZhbGlkYXRlQm9vbGVhbixcbiAgICB2YWxpZGF0ZVN0cmluZyxcbiAgICB2YWxpZGF0ZU9iamVjdCxcbiAgICB2YWxpZGF0ZUluc3RhbmNlLFxuICAgIHZhbGlkYXRlQXJyYXksXG4gICAgdmFsaWRhdGVTeW1ib2wsXG4gICAgdmFsaWRhdGVGdW5jdGlvbixcbiAgICB2YWxpZGF0ZUludGVnZXJcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgcHJpbWl0aXZlIHR5cGUuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzUHJpbWl0aXZlKCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlSXRlcmFibGV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUl0ZXJhYmxlKCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUl0ZXJhYmxlKFtdKSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQHNpbmNlIDEuMi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgcHJpbWl0aXZlXG4gKiBAc2VlIHtAbGluayBpc1ByaW1pdGl2ZX1cbiAqIEBzZWUge0BsaW5rIE1vbnN0ZXIuVHlwZXMuaXNQcmltaXRpdmV9XG4gKiBAc2VlIHtAbGluayBNb25zdGVyLlR5cGVzI2lzUHJpbWl0aXZlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUl0ZXJhYmxlKHZhbHVlKSB7XG4gICAgaWYgKCFpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgaXRlcmFibGUnKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgcHJpbWl0aXZlIHR5cGUuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzUHJpbWl0aXZlKCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlUHJpbWl0aXZlfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVQcmltaXRpdmUoJzInKSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVQcmltaXRpdmUoW10pKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgcHJpbWl0aXZlXG4gKiBAc2VlIHtAbGluayBpc1ByaW1pdGl2ZX1cbiAqIEBzZWUge0BsaW5rIE1vbnN0ZXIuVHlwZXMuaXNQcmltaXRpdmV9XG4gKiBAc2VlIHtAbGluayBNb25zdGVyLlR5cGVzI2lzUHJpbWl0aXZlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByaW1pdGl2ZSh2YWx1ZSkge1xuICAgIGlmICghaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbHVlIGlzIG5vdCBhIHByaW1pdGl2ZScpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdHlwZSBtYXRjaGVzIHRoZSBib29sZWFuIHR5cGUuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzQm9vbGVhbigpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZUJvb2xlYW59IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUJvb2xlYW4oZmFsc2UpKSAgLy8gXHUyMUE2IHZhbHVlXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUJvb2xlYW4oJzInKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlQm9vbGVhbihbXSkpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9ICB2YWx1ZSBpcyBub3QgcHJpbWl0aXZlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQm9vbGVhbih2YWx1ZSkge1xuICAgIGlmICghaXNCb29sZWFuKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgYSBib29sZWFuJylcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIHN0cmluZyB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc1N0cmluZygpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZVN0cmluZ30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlU3RyaW5nKCcyJykpICAvLyBcdTIxQTYgdmFsdWVcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlU3RyaW5nKFtdKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyh2YWx1ZSkge1xuICAgIGlmICghaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbHVlIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuXG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIG9iamVjdCB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc09iamVjdCgpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlT2JqZWN0KHt9KSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVPYmplY3QoJzInKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlT2JqZWN0KFtdKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU9iamVjdCh2YWx1ZSkge1xuICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbHVlIGlzIG5vdCBhIG9iamVjdCcpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdHlwZSBtYXRjaGVzIHRoZSBvYmplY3QgaW5zdGFuY2UuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlSW5zdGFuY2Uoe30sIE9iamVjdCkpIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVJbnN0YW5jZSgnMicsIE9iamVjdCkpIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlSW5zdGFuY2UoW10sIE9iamVjdCkpIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUluc3RhbmNlKHZhbHVlLCBpbnN0YW5jZSkge1xuICAgIGlmICghaXNJbnN0YW5jZSh2YWx1ZSwgaW5zdGFuY2UpKSB7XG4gICAgICAgIGxldCBuID0gXCJcIjtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGluc3RhbmNlKSB8fCBpc0Z1bmN0aW9uKGluc3RhbmNlKSkge1xuICAgICAgICAgICAgbiA9IGluc3RhbmNlPy5bJ25hbWUnXVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIG4gPSBcIiBcIiArIG47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YnICsgbilcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIGFycmF5IHR5cGUuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzQXJyYXkoKSBleGNlcHQgdGhhdCBhIFR5cGVFcnJvciBpcyB0aHJvd24uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dmFsaWRhdGVBcnJheX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlQXJyYXkoJzInKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlQXJyYXkoW10pKSAgLy8gXHUyMUE2IHZhbHVlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gYXJyYXlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBcnJheSh2YWx1ZSkge1xuICAgIGlmICghaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGFuIGFycmF5JylcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIHN5bWJvbCB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc1N5bWJvbCgpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZVN5bWJvbH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlU3ltYm9sKCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZVN5bWJvbCgpKSAgLy8gXHUyMUE2IHZhbHVlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gc3ltYm9sXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3ltYm9sKHZhbHVlKSB7XG4gICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGFuIHN5bWJvbCcpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdHlwZSBtYXRjaGVzIHRoZSBmdW5jdGlvbiB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc0Z1bmN0aW9uKCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlRnVuY3Rpb259IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUZ1bmN0aW9uKCgpPT57fSkpIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVGdW5jdGlvbignMicpKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogY29uc29sZS5sb2codmFsaWRhdGVGdW5jdGlvbihbXSkpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgYSBmdW5jdGlvbicpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdHlwZSBpcyBhbiBpbnRlZ2VyLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc0ludGVnZXIoKSBleGNlcHQgdGhhdCBhIFR5cGVFcnJvciBpcyB0aHJvd24uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dmFsaWRhdGVGdW5jdGlvbn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlSW50ZWdlcih0cnVlKSkgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogY29uc29sZS5sb2codmFsaWRhdGVJbnRlZ2VyKCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUludGVnZXIoMikpICAvLyBcdTIxQTYgdmFsdWVcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBzaW5jZSAxLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlSW50ZWdlcih2YWx1ZSkge1xuICAgIGlmICghaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgYW4gaW50ZWdlcicpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7dmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVPYmplY3QsIHZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtnZXRHbG9iYWwsIGdldEdsb2JhbE9iamVjdCwgZ2V0R2xvYmFsRnVuY3Rpb259XG5cbi8qKlxuICogQHR5cGUge29iamVjfVxuICogQHByaXZhdGVcbiAqL1xubGV0IGdsb2JhbFJlZmVyZW5jZTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGVudmlyb25tZW50LlxuICovXG4oZnVuY3Rpb24gKCkge1xuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBnbG9iYWxSZWZlcmVuY2UgPSBnbG9iYWxUaGlzO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBnbG9iYWxSZWZlcmVuY2UgPSBzZWxmO1xuICAgICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBnbG9iYWxSZWZlcmVuY2UgPSB3aW5kb3c7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgJ19fbW9uc3Rlcl9fJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgX19tb25zdGVyX18gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIF9fbW9uc3Rlcl9fLmdsb2JhbFRoaXMgPSBfX21vbnN0ZXJfXztcbiAgICAgICAgZGVsZXRlIE9iamVjdC5wcm90b3R5cGUuX19tb25zdGVyX187XG5cbiAgICAgICAgZ2xvYmFsUmVmZXJlbmNlID0gZ2xvYmFsVGhpcztcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGdsb2JhbFJlZmVyZW5jZSA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQuXCIpXG5cblxufSgpKTtcblxuLyoqXG4gKiBSZXR1cm4gZ2xvYmFsVGhpc1xuICpcbiAqIElmIGdsb2JhbFRoaXMgaXMgbm90IGF2YWlsYWJsZSwgaXQgd2lsbCBiZSBwb2x5ZmlsbGVkXG4gKlxuICogQHNpbmNlIDEuNi4wXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHJldHVybnMge29iamVjfSBnbG9iYWxUaGlzXG4gKi9cbmZ1bmN0aW9uIGdldEdsb2JhbCgpIHtcbiAgICByZXR1cm4gZ2xvYmFsUmVmZXJlbmNlO1xufVxuXG4vKipcbiAqIFJldHVybiBnbG9iYWwgb2JqZWN0IG9yIHRocm93IEVycm9yXG4gKlxuICogWW91IGNhbiBjYWxsIHRoZSBtZXRob2QgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5UeXBlcy5nZXRHbG9iYWxPYmplY3QoKWAuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7TW9uc3Rlcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQDEuMzAuMC9kaXN0L21vbnN0ZXIubWpzJztcbiAqIE1vbnN0ZXIuVHlwZXMuZ2V0R2xvYmFsT2JqZWN0KCdkb2N1bWVudCcpXG4gKiAvLyBcdTIxQTYgeyB9XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyBpbnRlZ3JhdGUgdGhpcyBmdW5jdGlvbiBpbmRpdmlkdWFsbHkuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Z2V0R2xvYmFsT2JqZWN0fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAMS4zMC4wL2Rpc3QvbW9kdWxlcy90eXBlcy9nbG9iYWwubWpzJztcbiAqIGdldEdsb2JhbE9iamVjdCgnZG9jdW1lbnQnKVxuICogLy8gXHUyMUE2IHsgfVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS42LjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge29iamVjfVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBvYmplY3QgaXMgbm90IGRlZmluZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRHbG9iYWxPYmplY3QobmFtZSkge1xuICAgIHZhbGlkYXRlU3RyaW5nKG5hbWUpO1xuICAgIGxldCBvID0gZ2xvYmFsUmVmZXJlbmNlPy5bbmFtZV07XG4gICAgaWYgKHR5cGVvZiBvID09PSAndW5kZWZpbmVkJykgdGhyb3cgbmV3IEVycm9yKCd0aGUgb2JqZWN0ICcgKyBuYW1lICsgJyBpcyBub3QgZGVmaW5lZCcpO1xuICAgIHZhbGlkYXRlT2JqZWN0KG8pO1xuICAgIHJldHVybiBvO1xufVxuXG4vKipcbiAqIFJldHVybiBnbG9iYWwgZnVuY3Rpb24gb3IgdGhyb3cgRXJyb3JcbiAqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIG1ldGhvZCB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLlR5cGVzLmdldEdsb2JhbEZ1bmN0aW9uKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge01vbnN0ZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckAxLjMwLjAvZGlzdC9tb25zdGVyLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhNb25zdGVyLlR5cGVzLmdldEdsb2JhbEZ1bmN0aW9uKCdwYXJzZUludCcpKSAvLyBcdTIxQTYgZiBwYXJzZUludCgpIHsgfVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gaW50ZWdyYXRlIHRoaXMgZnVuY3Rpb24gaW5kaXZpZHVhbGx5LlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2dldEdsb2JhbEZ1bmN0aW9ufSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAMS4zMC4wL2Rpc3QvbW9kdWxlcy90eXBlcy9nbG9iYWwubWpzJztcbiAqIGNvbnNvbGUubG9nKGdldEdsb2JhbEZ1bmN0aW9uKCdwYXJzZUludCcpKSAvLyBcdTIxQTYgZiBwYXJzZUludCgpIHsgfVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS42LjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybiB7b2JqZWN9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRHbG9iYWxGdW5jdGlvbihuYW1lKSB7XG4gICAgdmFsaWRhdGVTdHJpbmcobmFtZSk7XG4gICAgbGV0IGYgPSBnbG9iYWxSZWZlcmVuY2U/LltuYW1lXTtcbiAgICBpZiAodHlwZW9mIGYgPT09ICd1bmRlZmluZWQnKSB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBmdW5jdGlvbiAnICsgbmFtZSArICcgaXMgbm90IGRlZmluZWQnKTtcbiAgICB2YWxpZGF0ZUZ1bmN0aW9uKGYpO1xuICAgIHJldHVybiBmO1xufVxuXG5cblxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFByb3BlcnR5LUtleXNcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuZXhwb3J0IHtcbiAgICBpbnRlcm5hbFN5bWJvbCxcbiAgICBpbnRlcm5hbFN0YXRlU3ltYm9sXG59XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBtZW1iZXJPZiBNb25zdGVyXG4gKiBAc2luY2UgMS4yNC4wXG4gKi9cbmNvbnN0IGludGVybmFsU3ltYm9sID0gU3ltYm9sKCdpbnRlcm5hbERhdGEnKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBtZW1iZXJPZiBNb25zdGVyXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IGludGVybmFsU3RhdGVTeW1ib2wgPSBTeW1ib2woJ3N0YXRlJyk7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5leHBvcnQge3R5cGVPZn1cblxuLyoqXG4gKiBUaGUgYnVpbHQtaW4gdHlwZW9mIG1ldGhvZCBpcyBrbm93biB0byBoYXZlIHNvbWUgaGlzdG9yaWNhbCB3ZWFrbmVzc2VzLiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHByb3ZpZGUgYSBiZXR0ZXIgYW5kIG1vcmUgYWNjdXJhdGUgcmVzdWx0LlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3R5cGVPZn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdHlwZW9mLm1qcyc7XG4gKiBjb25zb2xlLmxvZyh0eXBlT2YoKSlcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQge3R5cGVPZn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdHlwZW9mLm1qcyc7XG4gKlxuICogY29uc29sZS5sb2codHlwZU9mKHVuZGVmaW5lZCkpOyAvLyBcdTIxQTYgdW5kZWZpbmVkXG4gKiBjb25zb2xlLmxvZyh0eXBlT2YoXCJcIikpOyAvLyBcdTIxQTYgc3RyaW5nXG4gKiBjb25zb2xlLmxvZyh0eXBlT2YoNSkpOyAvLyBcdTIxQTYgbnVtYmVyXG4gKiBjb25zb2xlLmxvZyh0eXBlT2Yoe30pKTsgLy8gXHUyMUE2IG9iamVjdFxuICogY29uc29sZS5sb2codHlwZU9mKFtdKSk7IC8vIFx1MjFBNiBhcnJheVxuICogY29uc29sZS5sb2codHlwZU9mKG5ldyBNYXApKTsgLy8gXHUyMUE2IG1hcFxuICogY29uc29sZS5sb2codHlwZU9mKHRydWUpKTsgLy8gXHUyMUE2IGJvb2xlYW5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBwcmltaXRpdmVcbiAqL1xuZnVuY3Rpb24gdHlwZU9mKHZhbHVlKSB7XG4gICAgbGV0IHR5cGUgPSAoe30pLnRvU3RyaW5nLmNhbGwodmFsdWUpLm1hdGNoKC9cXHMoW2EtekEtWl0rKS8pWzFdO1xuICAgIGlmICgnT2JqZWN0JyA9PT0gdHlwZSkge1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbmFtZT12YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9ICgvXihjbGFzc3xmdW5jdGlvbilcXHMrKFxcdyspLykuZXhlYyh2YWx1ZS5jb25zdHJ1Y3Rvci50b1N0cmluZygpKTtcbiAgICAgICAgdHlwZSA9IChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID4gMikgPyByZXN1bHRzWzJdIDogJyc7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0eXBlLnRvTG93ZXJDYXNlKCk7XG59XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2lzQXJyYXksIGlzT2JqZWN0fSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVvZi5tanNcIjtcblxuZXhwb3J0IHtleHRlbmR9XG5cbi8qKlxuICogRXh0ZW5kIGNvcGllcyBhbGwgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvclxuICogbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhIHRhcmdldCBvYmplY3QuIEl0IHJldHVybnMgdGhlIG1vZGlmaWVkIHRhcmdldCBvYmplY3QuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7ZXh0ZW5kfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kYXRhL2V4dGVuZC5tanMnO1xuICogZXh0ZW5kKGEsIGIpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fVxuICogQHJldHVybiB7b2JqZWN0fVxuICogQHNpbmNlIDEuMTAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBhcmd1bWVudFxuICogQHRocm93cyB7RXJyb3J9IHR5cGUgbWlzbWF0Y2hcbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIGxldCBvLCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgYSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgICBpZiAoIShpc09iamVjdChhKSB8fCBpc0FycmF5KGEpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBhcmd1bWVudCAnICsgSlNPTi5zdHJpbmdpZnkoYSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbyA9IGE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGsgaW4gYSkge1xuXG4gICAgICAgICAgICBsZXQgdiA9IGE/LltrXTtcblxuICAgICAgICAgICAgaWYgKHYgPT09IG8/LltrXSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKGlzT2JqZWN0KHYpJiZ0eXBlT2Yodik9PT0nb2JqZWN0JykgfHwgaXNBcnJheSh2KSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG9ba10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSh2KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb1trXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb1trXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVPZihvW2tdKSAhPT0gdHlwZU9mKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIG1pc21hdGNoOiBcIiArIEpTT04uc3RyaW5naWZ5KG9ba10pICsgXCIoXCIgKyB0eXBlT2Yob1trXSkgKyBcIikgIT0gXCIgKyBKU09OLnN0cmluZ2lmeSh2KSArIFwiKFwiICsgdHlwZU9mKHYpICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb1trXSA9IGV4dGVuZChvW2tdLCB2KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvW2tdID0gdjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG87XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuL2Jhc2UubWpzJztcbmltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge0lEfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgaW50ZWdlcj59XG4gKi9cbmxldCBpbnRlcm5hbENvdW50ZXIgPSBuZXcgTWFwO1xuXG4vKipcbiAqIFdpdGggdGhlIGlkIGNsYXNzLCBzZXF1ZW5jZXMgb2YgaWRzIGNhbiBiZSBjcmVhdGVkLiBmb3IgdGhpcyBwdXJwb3NlLCBhbiBpbnRlcm5hbCBjb3VudGVyIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIHByZWZpeC5cbiAqIHRodXMsIHRoZSBmaXJzdCBpZCB3aXRoIHRoZSBwcmVmaXggYG15aWRgIHdpbGwgYmUgYG15aWQxYCBhbmQgdGhlIHNlY29uZCBpZCBgbXlpZDJgLlxuICogVGhlIGlkcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5IGNhbGwsIGZvciBleGFtcGxlIG9uIGEgd2ViIHBhZ2UuXG4gKlxuICogU28gdGhlIGlkcyBjYW4gYWxzbyBiZSB1c2VkIGZvciBuYXZpZ2F0aW9uLiB5b3UganVzdCBoYXZlIHRvIHRha2UgY2FyZSB0aGF0IHRoZSBvcmRlciBzdGF5cyB0aGUgc2FtZS5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtJRH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvaWQubWpzJztcbiAqIGNvbnNvbGUubG9nKG5ldyBJRCgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBcyBvZiB2ZXJzaW9uIDEuNi4wIHRoZXJlIGlzIHRoZSBuZXcgUmFuZG9tSUQuIHRoaXMgSUQgY2xhc3MgaXMgY29udGludW91cyBmcm9tIG5vdyBvbi5cbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHN1bW1hcnkgQXV0b21hdGljIGdlbmVyYXRpb24gb2YgaWRzXG4gKi9cbiBjbGFzcyBJRCBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogY3JlYXRlIG5ldyBpZCB3aXRoIHByZWZpeFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByZWZpeCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcHJlZml4ID0gXCJpZFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocHJlZml4KTtcblxuICAgICAgICBpZiAoIWludGVybmFsQ291bnRlci5oYXMocHJlZml4KSkge1xuICAgICAgICAgICAgaW50ZXJuYWxDb3VudGVyLnNldChwcmVmaXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvdW50ID0gaW50ZXJuYWxDb3VudGVyLmdldChwcmVmaXgpO1xuICAgICAgICB0aGlzLmlkID0gcHJlZml4ICsgY291bnQ7XG5cbiAgICAgICAgaW50ZXJuYWxDb3VudGVyLnNldChwcmVmaXgsICsrY291bnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuXG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSAnLi4vdHlwZXMvZ2xvYmFsLm1qcyc7XG5pbXBvcnQge2lzQXJyYXksIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZX0gZnJvbSAnLi4vdHlwZXMvaXMubWpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tIFwiLi4vdHlwZXMvdHlwZW9mLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge2Nsb25lfVxuXG4vKipcbiAqIFdpdGggdGhpcyBmdW5jdGlvbiwgb2JqZWN0cyBjYW4gYmUgY2xvbmVkLlxuICogVGhlIGVudGlyZSBvYmplY3QgdHJlZSBpcyBydW4gdGhyb3VnaC5cbiAqXG4gKiBQcm94eSwgRWxlbWVudCwgSFRNTERvY3VtZW50IGFuZCBEb2N1bWVudEZyYWdtZW50IGluc3RhbmNlcyBhcmUgbm90IGNsb25lZC5cbiAqIEdsb2JhbCBvYmplY3RzIHN1Y2ggYXMgd2luZG93cyBhcmUgYWxzbyBub3QgY2xvbmVkLFxuICpcbiAqIElmIGFuIG9iamVjdCBoYXMgYSBtZXRob2QgYGdldENsb25lKClgLCB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xvbmUuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Y2xvbmV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3V0aWwvY2xvbmUubWpzJztcbiAqIGNsb25lKHt9KVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IG9iaiBvYmplY3QgdG8gYmUgY2xvbmVkXG4gKiBAcmV0dXJucyB7Kn1cbiAqIEBzaW5jZSAxLjAuMFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVXRpbFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bmFibGUgdG8gY2xvbmUgb2JqISBpdHMgdHlwZSBpc24ndCBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNsb25lKG9iaikge1xuXG4gICAgLy8gdHlwZW9mIG51bGwgcmVzdWx0cyBpbiAnb2JqZWN0Jy4gIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDEzLzEwL3R5cGVvZi1udWxsLmh0bWxcbiAgICBpZiAobnVsbCA9PT0gb2JqKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSB0d28gc2ltcGxlIHR5cGVzLCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgdHdvIHNpbXBsZSB0eXBlcywgbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBBcnJheVxuICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgbGV0IGNvcHkgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9iai5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29weVtpXSA9IGNsb25lKG9ialtpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qob2JqKSkge1xuXG5cbiAgICAgICAgLy8gSGFuZGxlIERhdGVcbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGxldCBjb3B5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGNvcHkuc2V0VGltZShvYmouZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIHJldHVybiBjb3B5O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIERvIG5vdCBjbG9uZSBET00gbm9kZXMgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogaW5zdGFuY2VvZiBFbGVtZW50KSByZXR1cm4gb2JqO1xuICAgICAgICBpZiAodHlwZW9mIEhUTUxEb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqIGluc3RhbmNlb2YgSFRNTERvY3VtZW50KSByZXR1cm4gb2JqO1xuICAgICAgICBpZiAodHlwZW9mIERvY3VtZW50RnJhZ21lbnQgIT09ICd1bmRlZmluZWQnICYmIG9iaiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHJldHVybiBvYmo7XG5cbiAgICAgICAgLyoqIERvIG5vdCBjbG9uZSBnbG9iYWwgb2JqZWN0cyAqL1xuICAgICAgICBpZiAob2JqID09PSBnZXRHbG9iYWwoKSkgcmV0dXJuIG9iajtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxDb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IGdsb2JhbENvbnRleHQpIHJldHVybiBvYmo7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IHdpbmRvdykgcmV0dXJuIG9iajtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBkb2N1bWVudCkgcmV0dXJuIG9iajtcbiAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gbmF2aWdhdG9yKSByZXR1cm4gb2JqO1xuICAgICAgICBpZiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gSlNPTikgcmV0dXJuIG9iajtcblxuICAgICAgICAvLyBIYW5kbGUgUHJveHktT2JqZWN0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB0cnkvY2F0Y2ggYmVjYXVzZSBwb3NzaWJsZTogVHlwZUVycm9yOiBGdW5jdGlvbiBoYXMgbm9uLW9iamVjdCBwcm90b3R5cGUgJ3VuZGVmaW5lZCcgaW4gaW5zdGFuY2VvZiBjaGVja1xuICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFByb3h5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb25lT2JqZWN0KG9iailcblxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBjbG9uZSBvYmohIGl0cyB0eXBlIGlzbid0IHN1cHBvcnRlZC5cIik7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbG9uZU9iamVjdChvYmopIHtcbiAgICBcbiAgICB2YWxpZGF0ZU9iamVjdChvYmopO1xuICAgIFxuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gb2JqPy5bJ2NvbnN0cnVjdG9yJ107XG5cbiAgICAvKiogT2JqZWN0IGhhcyBjbG9uZSBtZXRob2QgKi9cbiAgICBpZih0eXBlT2YoY29uc3RydWN0b3IpPT09J2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBwcm90b3R5cGUgPSBjb25zdHJ1Y3Rvcj8ucHJvdG90eXBlO1xuICAgICAgICBpZih0eXBlb2YgcHJvdG90eXBlPT09J29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmKHByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnZ2V0Q2xvbmUnKSYmIHR5cGVPZihvYmouZ2V0Q2xvbmUpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRDbG9uZSgpOyAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY29weSA9IHt9O1xuICAgIGlmICh0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBvYmouY29uc3RydWN0b3IuY2FsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb3B5ID0gbmV3IG9iai5jb25zdHJ1Y3RvcigpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcblxuICAgICAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb3B5W2tleV0gPSBjbG9uZShvYmpba2V5XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcHk7XG59XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4vYmFzZS5tanMnO1xuXG5leHBvcnQge1N0YWNrfVxuXG4vKipcbiAqIFlvdSBjYW4gY2FsbCB0aGUgbWV0aG9kIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLlF1ZXVlKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0lEfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9zdGFjay5tanMnO1xuICogY29uc29sZS5sb2cobmV3IFN0YWNrKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmNsYXNzIFN0YWNrIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9va3MgYXQgdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgcGVlaygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YT8uW3RoaXMuZGF0YS5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAgICovXG4gICAgcHVzaCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaCh2YWx1ZSlcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIGFsbCBlbnRyaWVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmVzIHRoZSBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrIGFuZCByZXR1cm5zXG4gICAgICogdGhhdCBvYmplY3QgYXMgdGhlIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24uIGlzIHRoZSBzdGFjayBlbXB0eVxuICAgICAqIHRoZSByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Kn1cbiAgICAgKi9cbiAgICBwb3AoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnBvcCgpO1xuICAgIH1cblxuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge2lzQXJyYXksIGlzSW50ZWdlciwgaXNPYmplY3QsIGlzUHJpbWl0aXZlfSBmcm9tICcuLi90eXBlcy9pcy5tanMnO1xuaW1wb3J0IHtTdGFja30gZnJvbSBcIi4uL3R5cGVzL3N0YWNrLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUludGVnZXIsIHZhbGlkYXRlU3RyaW5nfSBmcm9tICcuLi90eXBlcy92YWxpZGF0ZS5tanMnO1xuXG5leHBvcnQge1BhdGhmaW5kZXIsIERFTElNSVRFUiwgV0lMRENBUkR9XG5cbi8qKlxuICogcGF0aCBzZXBhcmF0b3JcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgREVMSU1JVEVSID0gJy4nO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBXSUxEQ0FSRCA9ICcqJztcblxuLyoqXG4gKiBQYXRoZmluZGVyIGlzIGEgY2xhc3MgdG8gZmluZCBhIHBhdGggdG8gYW4gb2JqZWN0LlxuICogXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kYXRhL3BhdGhmaW5kZXIubWpzJztcbiAqIGNvbnNvbGUubG9nKG5ldyBQYXRoZmluZGVyKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhlIHBhdGhmaW5kZXIsIHZhbHVlcyBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBmcm9tIGFuIG9iamVjdCBjb25zdHJ1Y3QuXG4gKlxuICogYGBgXG4gKiBuZXcgUGF0aGZpbmRlcih7XG4gKiBhOiB7XG4gKiAgICAgYjoge1xuICogICAgICAgICBmOiBbXG4gKiAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgZzogZmFsc2UsXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIF0sXG4gKiAgICAgfVxuICogfVxuICogfSkuZ2V0VmlhKFwiYS5iLmYuMC5nXCIpOyAvLyBcdTIxQTYgZmFsc2VcbiAqIGBgYFxuICpcbiAqIGlmIGEgdmFsdWUgaXMgbm90IHByZXNlbnQgb3IgaGFzIHRoZSB3cm9uZyB0eXBlLCBhIGNvcnJlc3BvbmRpbmcgZXhjZXB0aW9uIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIG5ldyBQYXRoZmluZGVyKHt9KS5nZXRWaWEoXCJhLmIuZi4wLmdcIik7IC8vIFx1MjFBNiBFcnJvclxuICogYGBgXG4gKlxuICogVGhlIGBQYXRoZmluZGVyLmV4aXN0cygpYCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhY2Nlc3MgdG8gdGhlIHBhdGggaXMgcG9zc2libGUuXG4gKlxuICogYGBgXG4gKiBuZXcgUGF0aGZpbmRlcih7fSkuZXhpc3RzKFwiYS5iLmYuMC5nXCIpOyAvLyBcdTIxQTYgZmFsc2VcbiAqIGBgYFxuICpcbiAqIHBhdGhmaW5kZXIgY2FuIGFsc28gYmUgdXNlZCB0byBidWlsZCBvYmplY3Qgc3RydWN0dXJlcy4gdG8gZG8gdGhpcywgdGhlIGBQYXRoZmluZGVyLnNldFZpYSgpYCBtZXRob2QgbXVzdCBiZSB1c2VkLlxuICpcbiAqIGBgYFxuICogb2JqID0ge307XG4gKiBuZXcgUGF0aGZpbmRlcihvYmopLnNldFZpYSgnYS5iLjAuYycsIHRydWUpOyAvLyBcdTIxQTYge2E6e2I6W3tjOnRydWV9XX19XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7UGF0aGZpbmRlcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS9wYXRoZmluZGVyLm1qcyc7XG4gKlxuICogbGV0IHZhbHVlID0gbmV3IFBhdGhmaW5kZXIoe1xuICogYToge1xuICogICAgIGI6IHtcbiAqICAgICAgICAgZjogW1xuICogICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgIGc6IGZhbHNlLFxuICogICAgICAgICAgICAgfVxuICogICAgICAgICBdLFxuICogICAgIH1cbiAqIH1cbiAqIH0pLmdldFZpYShcImEuYi5mLjAuZ1wiKTtcbiAqXG4gKiAgY29uc29sZS5sb2codmFsdWUpO1xuICogIC8vIFx1MjFBNiBmYWxzZVxuICpcbiAqIHRyeSB7XG4gKiAgIG5ldyBQYXRoZmluZGVyKHt9KS5nZXRWaWEoXCJhLmIuZi4wLmdcIik7ICBcbiAqIH0gY2F0Y2goZSkge1xuICogICBjb25zb2xlLmxvZyhlLnRvU3RyaW5nKCkpO1xuICogICAvLyBcdTIxQTYgRXJyb3I6IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kIChiLmYuMC5nKVxuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kYXRhL3BhdGhmaW5kZXIubWpzJztcbiAqXG4gKiBsZXQgcCA9IG5ldyBQYXRoZmluZGVyKHtcbiAqICAgICAgICAgICAgICAgIGE6IHtcbiAqICAgICAgICAgICAgICAgICAgICB4OiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHtjOiAxfSwge2M6IDJ9XG4gKiAgICAgICAgICAgICAgICAgICAgXSxcbiAqICAgICAgICAgICAgICAgICAgICB5OiB0cnVlXG4gKiAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgYjoge1xuICogICAgICAgICAgICAgICAgICAgIHg6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAge2M6IDEsIGQ6IGZhbHNlfSwge2M6IDJ9XG4gKiAgICAgICAgICAgICAgICAgICAgXSxcbiAqICAgICAgICAgICAgICAgICAgICB5OiB0cnVlXG4gKiAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICB9KTtcbiAqXG4gKiBsZXQgciA9IHAuZ2V0VmlhKFwiKi54LiouY1wiKTtcbiAqIGNvbnNvbGUubG9nKHIpO1xuICpcbiAqIEBzaW5jZSAxLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqL1xuY2xhc3MgUGF0aGZpbmRlciBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthcnJheXxvYmplY3R8TWFwfFNldH0gdmFsdWVcbiAgICAgKiBAc2luY2UgMS40LjBcbiAgICAgKiBAdGhyb3dzICB7RXJyb3J9IHRoZSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgYSBzaW1wbGUgdHlwZVxuICAgICAqKi9cbiAgICBjb25zdHJ1Y3RvcihvYmplY3QpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAoaXNQcmltaXRpdmUob2JqZWN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgcGFyYW1ldGVyIG11c3Qgbm90IGJlIGEgc2ltcGxlIHR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuICAgICAgICB0aGlzLndpbGRDYXJkID0gV0lMRENBUkQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0IHdpbGRjYXJkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gd2lsZGNhcmRcbiAgICAgKiBAcmV0dXJuIHtQYXRoZmluZGVyfVxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIHNldFdpbGRDYXJkKHdpbGRjYXJkKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHdpbGRjYXJkKTtcbiAgICAgICAgdGhpcy53aWxkQ2FyZCA9IHdpbGRjYXJkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHNpbmNlIDEuNC4wXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGFjdGlvbiBmb3IgdGhpcyBkYXRhIHR5cGVcbiAgICAgKi9cbiAgICBnZXRWaWEocGF0aCkge1xuICAgICAgICByZXR1cm4gZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgdGhpcy5vYmplY3QsIHZhbGlkYXRlU3RyaW5nKHBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtQYXRoZmluZGVyfVxuICAgICAqIEBzaW5jZSAxLjQuMFxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBhY3Rpb24gZm9yIHRoaXMgZGF0YSB0eXBlXG4gICAgICovXG4gICAgc2V0VmlhKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgpO1xuICAgICAgICBzZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCB0aGlzLm9iamVjdCwgcGF0aCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgVmlhIFBhdGhcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHJldHVybnMge1BhdGhmaW5kZXJ9XG4gICAgICogQHNpbmNlIDEuNi4wXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGFjdGlvbiBmb3IgdGhpcyBkYXRhIHR5cGVcbiAgICAgKi9cbiAgICBkZWxldGVWaWEocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoKTtcbiAgICAgICAgZGVsZXRlVmFsdWVWaWFQYXRoLmNhbGwodGhpcywgdGhpcy5vYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHJldHVybiB7Ym9vbH1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGludGVnZXJcbiAgICAgKiBAc2luY2UgMS40LjBcbiAgICAgKi9cbiAgICBleGlzdHMocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIHRoaXMub2JqZWN0LCBwYXRoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cblxuXG4vKipcbiAqXG4gKiBAcGFyYW0geyp9IHN1YmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hlY2tcbiAqIEByZXR1cm4ge01hcH1cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXRlcmF0ZShzdWJqZWN0LCBwYXRoLCBjaGVjaykge1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDtcblxuICAgIGlmIChpc09iamVjdChzdWJqZWN0KSB8fCBpc0FycmF5KHN1YmplY3QpKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmplY3QpKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgdmFsdWUsIHBhdGgsIGNoZWNrKSlcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXRoLnNwbGl0KERFTElNSVRFUikuc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0LnNldChrZXksIGdldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIHN1YmplY3QsIHBhdGgsIGNoZWNrKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcblxuXG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7Kn0gc3ViamVjdFxuICogQHBhcmFtIFtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSBbYm9vbGVhbn0gY2hlY2sgXG4gKiBAcmV0dXJucyB7Kn1cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVWaWFQYXRoKHN1YmplY3QsIHBhdGgsIGNoZWNrKSB7XG5cbiAgICBpZiAocGF0aCA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gc3ViamVjdDtcbiAgICB9XG5cbiAgICBsZXQgcGFydHMgPSBwYXRoLnNwbGl0KERFTElNSVRFUilcbiAgICBsZXQgY3VycmVudCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoY3VycmVudCA9PT0gdGhpcy53aWxkQ2FyZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZS5jYWxsKHRoaXMsIHN1YmplY3QsIHBhcnRzLmpvaW4oREVMSU1JVEVSKSwgY2hlY2spO1xuICAgIH1cblxuICAgIGlmIChpc09iamVjdChzdWJqZWN0KSB8fCBpc0FycmF5KHN1YmplY3QpKSB7XG5cbiAgICAgICAgbGV0IGFuY2hvcjtcbiAgICAgICAgaWYgKHN1YmplY3QgaW5zdGFuY2VvZiBNYXAgfHwgc3ViamVjdCBpbnN0YW5jZW9mIFdlYWtNYXApIHtcbiAgICAgICAgICAgIGFuY2hvciA9IHN1YmplY3QuZ2V0KGN1cnJlbnQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoc3ViamVjdCBpbnN0YW5jZW9mIFNldCB8fCBzdWJqZWN0IGluc3RhbmNlb2YgV2Vha1NldCkge1xuICAgICAgICAgICAgY3VycmVudCA9IHBhcnNlSW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgdmFsaWRhdGVJbnRlZ2VyKGN1cnJlbnQpXG4gICAgICAgICAgICBhbmNob3IgPSBbLi4uc3ViamVjdF0/LltjdXJyZW50XTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIHN1YmplY3QgaW5zdGFuY2VvZiBXZWFrUmVmKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcigndW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZScpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShzdWJqZWN0KSkge1xuICAgICAgICAgICAgY3VycmVudCA9IHBhcnNlSW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgdmFsaWRhdGVJbnRlZ2VyKGN1cnJlbnQpXG4gICAgICAgICAgICBhbmNob3IgPSBzdWJqZWN0Py5bY3VycmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IgPSBzdWJqZWN0Py5bY3VycmVudF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNPYmplY3QoYW5jaG9yKSB8fCBpc0FycmF5KGFuY2hvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCBhbmNob3IsIHBhcnRzLmpvaW4oREVMSU1JVEVSKSwgY2hlY2spXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJ0aGUgam91cm5leSBpcyBub3QgYXQgaXRzIGVuZCAoXCIgKyBwYXJ0cy5qb2luKERFTElNSVRFUikgKyBcIilcIik7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChjaGVjayA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKHN1YmplY3QpLCBjdXJyZW50KTtcblxuICAgICAgICAgICAgaWYgKCFzdWJqZWN0Lmhhc093blByb3BlcnR5KGN1cnJlbnQpICYmIGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCd1bmtub3duIHZhbHVlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbmNob3I7XG5cbiAgICB9XG5cbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCB0eXBlIFwiICsgdHlwZW9mIHN1YmplY3QpXG5cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIG9iamVjdFxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0VmFsdWVWaWFQYXRoKG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcblxuICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgpO1xuXG4gICAgbGV0IHBhcnRzID0gcGF0aC5zcGxpdChERUxJTUlURVIpXG4gICAgbGV0IGxhc3QgPSBwYXJ0cy5wb3AoKTtcbiAgICBsZXQgc3VicGF0aCA9IHBhcnRzLmpvaW4oREVMSU1JVEVSKTtcblxuICAgIGxldCBzdGFjayA9IG5ldyBTdGFjaygpXG4gICAgbGV0IGN1cnJlbnQgPSBzdWJwYXRoO1xuICAgIHdoaWxlICh0cnVlKSB7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIG9iamVjdCwgY3VycmVudCwgdHJ1ZSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWNrLnB1c2goY3VycmVudCk7XG4gICAgICAgIHBhcnRzLnBvcCgpO1xuICAgICAgICBjdXJyZW50ID0gcGFydHMuam9pbihERUxJTUlURVIpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBcIlwiKSBicmVhaztcbiAgICB9XG5cbiAgICB3aGlsZSAoIXN0YWNrLmlzRW1wdHkoKSkge1xuICAgICAgICBjdXJyZW50ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGxldCBvYmogPSB7fTtcblxuICAgICAgICBpZiAoIXN0YWNrLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgbGV0IG4gPSBzdGFjay5wZWVrKCkuc3BsaXQoREVMSU1JVEVSKS5wb3AoKTtcbiAgICAgICAgICAgIGlmIChpc0ludGVnZXIocGFyc2VJbnQobikpKSB7XG4gICAgICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHNldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIG9iamVjdCwgY3VycmVudCwgb2JqKTtcbiAgICB9XG5cbiAgICBsZXQgYW5jaG9yID0gZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgb2JqZWN0LCBzdWJwYXRoKTtcblxuICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSAmJiAhaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHR5cGU6IFwiICsgdHlwZW9mIG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGFuY2hvciBpbnN0YW5jZW9mIE1hcCB8fCBhbmNob3IgaW5zdGFuY2VvZiBXZWFrTWFwKSB7XG4gICAgICAgIGFuY2hvci5zZXQobGFzdCwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoYW5jaG9yIGluc3RhbmNlb2YgU2V0IHx8IGFuY2hvciBpbnN0YW5jZW9mIFdlYWtTZXQpIHtcbiAgICAgICAgYW5jaG9yLmFwcGVuZCh2YWx1ZSlcblxuICAgIH0gZWxzZSBpZiAodHlwZW9mIFdlYWtSZWYgPT09ICdmdW5jdGlvbicgJiYgYW5jaG9yIGluc3RhbmNlb2YgV2Vha1JlZikge1xuICAgICAgICB0aHJvdyBFcnJvcigndW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZScpO1xuXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGFuY2hvcikpIHtcbiAgICAgICAgbGFzdCA9IHBhcnNlSW50KGxhc3QpO1xuICAgICAgICB2YWxpZGF0ZUludGVnZXIobGFzdClcbiAgICAgICAgYXNzaWduUHJvcGVydHkoYW5jaG9yLCBsYXN0LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduUHJvcGVydHkoYW5jaG9yLCBsYXN0LCB2YWx1ZSk7XG4gICAgfVxuXG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5mdW5jdGlvbiBhc3NpZ25Qcm9wZXJ0eShvYmplY3QsIGtleSwgdmFsdWUpIHtcblxuICAgIGlmICghb2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuXG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBvYmplY3RcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGpvdXJuZXkgaXMgbm90IGF0IGl0cyBlbmRcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBhY3Rpb24gZm9yIHRoaXMgZGF0YSB0eXBlXG4gKiBAc2luY2UgMS42LjBcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVZhbHVlVmlhUGF0aChvYmplY3QsIHBhdGgpIHtcblxuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChERUxJTUlURVIpXG4gICAgbGV0IGxhc3QgPSBwYXJ0cy5wb3AoKTtcbiAgICBjb25zdCBzdWJwYXRoID0gcGFydHMuam9pbihERUxJTUlURVIpO1xuXG4gICAgY29uc3QgYW5jaG9yID0gZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgb2JqZWN0LCBzdWJwYXRoKTtcblxuICAgIGlmIChhbmNob3IgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgYW5jaG9yLmRlbGV0ZShsYXN0KTtcbiAgICB9IGVsc2UgaWYgKGFuY2hvciBpbnN0YW5jZW9mIFNldCB8fCBhbmNob3IgaW5zdGFuY2VvZiBXZWFrTWFwIHx8IGFuY2hvciBpbnN0YW5jZW9mIFdlYWtTZXQgfHwgKHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIGFuY2hvciBpbnN0YW5jZW9mIFdlYWtSZWYpKSB7XG4gICAgICAgIHRocm93IEVycm9yKCd1bnN1cHBvcnRlZCBhY3Rpb24gZm9yIHRoaXMgZGF0YSB0eXBlJyk7XG5cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoYW5jaG9yKSkge1xuICAgICAgICBsYXN0ID0gcGFyc2VJbnQobGFzdCk7XG4gICAgICAgIHZhbGlkYXRlSW50ZWdlcihsYXN0KVxuICAgICAgICBkZWxldGUgYW5jaG9yW2xhc3RdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBhbmNob3JbbGFzdF07XG4gICAgfVxuXG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcbmltcG9ydCB7Z2V0R2xvYmFsLCBnZXRHbG9iYWxPYmplY3R9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge0lEfSBmcm9tICcuLi90eXBlcy9pZC5tanMnO1xuaW1wb3J0IHtpc0FycmF5LCBpc09iamVjdCwgaXNTdHJpbmd9IGZyb20gJy4uL3R5cGVzL2lzLm1qcyc7XG5pbXBvcnQge1xuICAgIHZhbGlkYXRlRnVuY3Rpb24sXG4gICAgdmFsaWRhdGVJbnRlZ2VyLFxuICAgIHZhbGlkYXRlT2JqZWN0LFxuICAgIHZhbGlkYXRlUHJpbWl0aXZlLFxuICAgIHZhbGlkYXRlU3RyaW5nXG59IGZyb20gJy4uL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG5pbXBvcnQge2Nsb25lfSBmcm9tIFwiLi4vdXRpbC9jbG9uZS5tanNcIjtcbmltcG9ydCB7UGF0aGZpbmRlcn0gZnJvbSBcIi4vcGF0aGZpbmRlci5tanNcIjtcblxuZXhwb3J0IHtUcmFuc2Zvcm1lcn1cblxuLyoqXG4gKiBUaGUgdHJhbnNmb3JtZXIgY2xhc3MgaXMgYSBzd2lzcyBhcm15IGtuaWZlIGZvciBtYW5pcHVsYXRpbmcgdmFsdWVzLiBlc3BlY2lhbGx5IGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHBpcGUsIHByb2Nlc3NpbmcgY2hhaW5zIGNhbiBiZSBidWlsdCB1cC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtUcmFuc2Zvcm1lcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS90cmFuc2Zvcm1lci5tanMnO1xuICogbmV3IFRyYW5zZm9ybWVyKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQSBzaW1wbGUgZXhhbXBsZSBpcyB0aGUgY29udmVyc2lvbiBvZiBhbGwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UuIGZvciB0aGlzIHB1cnBvc2UgdGhlIGNvbW1hbmQgYHRvbG93ZXJgIG11c3QgYmUgdXNlZC5cbiAqXG4gKiBgYGBcbiAqIGxldCB0ID0gbmV3IFRyYW5zZm9ybWVyKCd0b2xvd2VyJykucnVuKCdBQkMnKTsgLy8gXHUyMUE2IGFiY1xuICogYGBgXG4gKlxuICogKiphbGwgY29tbWFuZHMqKlxuICpcbiAqIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYWxsIGNvbW1hbmRzLCBwYXJhbWV0ZXJzIGFuZCBleGlzdGluZyBhbGlhc2VzIGFyZSBkZXNjcmliZWQuXG4gKlxuICogfCBjb21tYW5kICAgICAgfCBwYXJhbWV0ZXIgICAgICAgICAgICAgICAgICB8IGFsaWFzICAgICAgICAgICAgICAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8Oi0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgdG8tYmFzZTY0ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYXNlNjQsIGJ0b2IgICAgICAgICAgICB8IENvbnZlcnRzIHRoZSB2YWx1ZSB0byBiYXNlNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBmcm9tLWJhc2U2NCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGF0b2IgICAgICAgICAgICAgICAgICAgIHwgQ29udmVydHMgdGhlIHZhbHVlIGZyb20gYmFzZTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGNhbGwgICAgICAgICB8IGZ1bmN0aW9uOnBhcmFtMTpwYXJhbTI6Li4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBjYW4gYmUgZGVmaW5lZCBpbiB0aHJlZSBwbGFjZXM6IGVpdGhlciBnbG9iYWxseSwgaW4gdGhlIGNvbnRleHQgYGFkZENhbGxiYWNrYCBvciBpbiB0aGUgcGFzc2VkIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgZGVmYXVsdCAgICAgIHwgdmFsdWU6dHlwZSAgICAgICAgICAgICAgICAgfCA/PyAgICAgICAgICAgICAgICAgICAgICB8IElmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHZhbHVlLiBUaGUgdGhpcmQgb3B0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZGVzaXJlZCB0eXBlLiBJZiBubyB0eXBlIGlzIHNwZWNpZmllZCwgc3RyaW5nIGlzIHVzZWQuIFZhbGlkIHR5cGVzIGFyZSBib29sLCBzdHJpbmcsIGludCwgZmxvYXQsIHVuZGVmaW5lZCBhbmQgb2JqZWN0LiBBbiBvYmplY3QgZGVmYXVsdCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIGJhc2U2NCBlbmNvZGVkIGpzb24gc3RyaW5nLiAoc2luY2UgMS4xMi4wKSAgICAgICAgICAgICAgICAgfFxuICogfCBkZWJ1ZyAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIHBhc3NlZCB2YWx1ZSBpcyBvdXRwdXQgKGNvbnNvbGUpIGFuZCByZXR1cm5lZCAgfFxuICogfCBlbXB0eSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmV0dXJuIGVtcHR5IFN0cmluZyBcIlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgZmlyc3Qta2V5ICAgIHwgZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IENhbiBiZSBhcHBsaWVkIHRvIG9iamVjdHMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBrZXkuIEFsbCBrZXlzIG9mIHRoZSBvYmplY3QgYXJlIGZldGNoZWQgYW5kIHNvcnRlZC4gICAgKHNpbmNlIDEuMjMuMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBmcm9tanNvbiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHlwZSBjb252ZXJzaW9uIGZyb20gYSBKU09OIHN0cmluZyAoc2luY2UgMS4xMi4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGlmICAgICAgICAgICB8IHN0YXRlbWVudDE6c3RhdGVtZW50MiAgICAgIHwgPyAgICAgICAgICAgICAgICAgICAgICAgfCBJcyB0aGUgdGVybmFyeSBvcGVyYXRvciwgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgdmFsaWQgc3RhdGVtZW50LCB0aGUgc2Vjb25kIGlzIHRoZSBmYWxzZSBwYXJ0LiBUbyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHF1ZXVlLCB5b3UgY2FuIHNldCB0aGUgdmFsdWUga2V5d29yZC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSB3YW50IHRvIGhhdmUgdGhlIHN0YXRpYyBzdHJpbmcgXCJ2YWx1ZVwiLCB5b3UgaGF2ZSB0byBwdXQgb25lIGJhY2tzbGFzaCBcXFxcIGluIGZyb250IG9mIGl0IGFuZCB3cml0ZSB2YWx1ZS4gdGhlIGZvbGxvdyB2YWx1ZXMgYXJlIHRydWU6ICdvbicsIHRydWUsICd0cnVlJy4gSWYgeW91IHdhbnQgdG8gaGF2ZSBhIHNwYWNlLCB5b3UgYWxzbyBoYXZlIHRvIHdyaXRlIFxcXFwgaW4gZnJvbnQgb2YgdGhlIHNwYWNlLiAgfFxuICogfCBpbmRleCAgICAgICAgfCBrZXk6ZGVmYXVsdCAgICAgICAgICAgICAgICB8IHByb3BlcnR5LCBrZXkgICAgICAgICAgIHwgRmV0Y2hlcyBhIHZhbHVlIGZyb20gYW4gb2JqZWN0LCBhbiBhcnJheSwgYSBtYXAgb3IgYSBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGxhc3Qta2V5ICAgICB8IGRlZmF1bHQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDYW4gYmUgYXBwbGllZCB0byBvYmplY3RzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBrZXkuIEFsbCBrZXlzIG9mIHRoZSBvYmplY3QgYXJlIGZldGNoZWQgYW5kIHNvcnRlZC4gKHNpbmNlIDEuMjMuMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgbGVuZ3RoICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb3VudCAgICAgICAgICAgICAgICAgICB8IExlbmd0aCBvZiB0aGUgc3RyaW5nIG9yIGVudHJpZXMgb2YgYW4gYXJyYXkgb3Igb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBub3AgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgRG8gbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IG50aC1rZXkgICAgICB8IGluZGV4OmRlZmF1bHQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDYW4gYmUgYXBwbGllZCB0byBvYmplY3RzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbnRoIGtleS4gQWxsIGtleXMgb2YgdGhlIG9iamVjdCBhcmUgZmV0Y2hlZCBhbmQgc29ydGVkLiAoc2luY2UgMS4yMy4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgbnRoLWxhc3Qta2V5IHwgaW5kZXg6ZGVmYXVsdCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IENhbiBiZSBhcHBsaWVkIHRvIG9iamVjdHMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBudGgga2V5IGZyb20gYmVoaW5kLiBBbGwga2V5cyBvZiB0aGUgb2JqZWN0IGFyZSBmZXRjaGVkIGFuZCBzb3J0ZWQuIChzaW5jZSAxLjIzLjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBwYXRoICAgICAgICAgfCBwYXRoICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGFjY2VzcyB0byBhbiBvYmplY3QgaXMgZG9uZSB2aWEgYSBQYXRoZmluZGVyIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHBhdGgtZXhpc3RzICB8IHBhdGggICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIHBhdGggaXMgYXZhaWxhYmxlIGluIHRoZSB2YWx1ZSAoc2luY2UgMS4yNC4wKSAgICB8XG4gKiB8IHBsYWludGV4dCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhaW4gICAgICAgICAgICAgICAgICAgfCBBbGwgSFRNTCB0YWdzIGFyZSByZW1vdmVkICgqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgcHJlZml4ICAgICAgIHwgdGV4dCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkZHMgYSBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCByYXd1cmxlbmNvZGUgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgVVJMIGNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHN0YXRpYyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbm9uZSAgICAgICAgICAgICAgICAgICAgfCBUaGUgQXJndW1lbnRzIHZhbHVlIGlzIHVzZWQgYW5kIHBhc3NlZCB0byB0aGUgdmFsdWUuIFNwZWNpYWwgY2hhcmFjdGVycyBcXCA8c3BhY2U+IGFuZCA6IGNhbiBiZSBxdW90ZXQgYnkgYSBwcmVjZWRpbmcgXFwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBzdWJzdHJpbmcgICAgfCBzdGFydDpsZW5ndGggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmV0dXJucyBhIHN1YnN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHN1ZmZpeCAgICAgICB8IHRleHQgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZGRzIGEgc3VmZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgdG9pbnRlZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IFR5cGUgY29udmVyc2lvbiB0byBhbiBpbnRlZ2VyIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB0b2pzb24gICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHlwZSBjb252ZXJzaW9uIHRvIGEgSlNPTiBzdHJpbmcgKHNpbmNlIDEuOC4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHRvbG93ZXIgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydG9sb3dlciwgdG9sb3dlcmNhc2UgfCBUaGUgaW5wdXQgdmFsdWUgaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBsZXR0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgdG9zdHJpbmcgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IFR5cGUgY29udmVyc2lvbiB0byBhIHN0cmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB0b3VwcGVyICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnRvdXBwZXIsIHRvdXBwZXJjYXNlIHwgVGhlIGlucHV0IHZhbHVlIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgbGV0dGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHRyaW0gICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZW1vdmUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgdWNmaXJzdCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpcnN0IGNoYXJhY3RlciBsYXJnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB1Y3dvcmRzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgQW55IHdvcmQgYmVnaW5uaW5nIGxhcmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHVuZGVmaW5lZCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXR1cm4gdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgdW5pcWlkICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZXMgYSBzdHJpbmcgd2l0aCBhIHVuaXF1ZSB2YWx1ZSAoKiopXG4gKlxuICogICgqKSBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5IHRoZSBleHRlbnNpb24gW2pzZG9tXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9qc2RvbSkgbXVzdCBiZSBsb2FkZWQgaW4gdGhlIG5vZGVqcyBjb250ZXh0LlxuICpcbiAqIGBgYFxuICogIC8vIHBvbHlmaWxsXG4gKiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwib2JqZWN0XCIpIHtcbiAqICAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTSgnJywge1xuICogICAgICAgICB1cmw6ICdodHRwOi8vZXhhbXBsZS5jb20vJyxcbiAqICAgICAgICAgcHJldGVuZFRvQmVWaXN1YWw6IHRydWVcbiAqICAgICB9KTtcbiAqIFxuICogICAgIFtcbiAqICAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICAnZG9jdW1lbnQnLFxuICogICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgICdFbGVtZW50JyxcbiAqICAgICAgICAgJ0hUTUxFbGVtZW50JyxcbiAqICAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICAnRE9NUGFyc2VyJyxcbiAqICAgICAgICAgJ1hNTFNlcmlhbGl6ZXInLFxuICogICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgICdJbnB1dEV2ZW50JyxcbiAqICAgICAgICAgJ0N1c3RvbUV2ZW50J1xuICogICAgIF0uZm9yRWFjaChrZXkgPT4gKGdsb2JhbFtrZXldID0gd2luZG93W2tleV0pKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICgqKikgZm9yIHRoaXMgY29tbWFuZCB0aGUgY3J5cHQgbGlicmFyeSBpcyBuZWNlc3NhcnkgaW4gdGhlIG5vZGVqcyBjb250ZXh0LlxuICpcbiAqIGBgYFxuICogaW1wb3J0ICogYXMgQ3J5cHRvIGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG4gKiBnbG9iYWxbJ2NyeXB0byddID0gbmV3IENyeXB0by5DcnlwdG8oKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtUcmFuc2Zvcm1lcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS90cmFuc2Zvcm1lci5tanMnO1xuICpcbiAqIGNvbnN0IHRyYW5zZm9ybWVyID0gbmV3IFRyYW5zZm9ybWVyKFwidG9sb3dlclwiKVxuICpcbiAqIGNvbnNvbGUubG9nKHRyYW5zZm9ybWVyLnJ1bihcIkhFTExPXCIpKVxuICogLy8gXHUyMUE2IGhlbGxvXG4gKlxuICogY29uc29sZS5sb2codHJhbnNmb3JtZXIucnVuKFwiV09STERcIikpXG4gKiAvLyBcdTIxQTYgd29ybGRcbiAqXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKi9cbmNsYXNzIFRyYW5zZm9ybWVyIGV4dGVuZHMgQmFzZSB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVmaW5pdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRlZmluaXRpb24pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hcmdzID0gZGlzYXNzZW1ibGUoZGVmaW5pdGlvbik7XG4gICAgICAgIHRoaXMuY29tbWFuZCA9IHRoaXMuYXJncy5zaGlmdCgpXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICAgKiBAcmV0dXJucyB7VHJhbnNmb3JtZXJ9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gICAgICovXG4gICAgc2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcobmFtZSlcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjaylcblxuICAgICAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZU9iamVjdChjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldChuYW1lLCB7XG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdW5rbm93biBjb21tYW5kXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gICAgICogQHRocm93cyB7RXJyb3J9IHR5cGUgbm90IHN1cHBvcnRlZFxuICAgICAqL1xuICAgIHJ1bih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIFt2YWx1ZV0pXG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZFxuICogQHJldHVybnMge2FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGlzYXNzZW1ibGUoY29tbWFuZCkge1xuXG4gICAgdmFsaWRhdGVTdHJpbmcoY29tbWFuZCk7XG5cbiAgICBsZXQgcGxhY2Vob2xkZXIgPSBuZXcgTWFwO1xuICAgIGNvbnN0IHJlZ2V4ID0gLygoPzxwYXR0ZXJuPlxcXFwoPzxjaGFyPi4pKXsxfSkvbWlnO1xuXG4gICAgLy8gVGhlIHNlcGFyYXRvciBmb3IgYXJncyBtdXN0IGJlIGVzY2FwZWRcbiAgICAvLyB1bmRlZmluZWQgc3RyaW5nIHdoaWNoIHNob3VsZCBub3Qgb2NjdXIgbm9ybWFsbHkgYW5kIGlzIGFsc28gbm90IGEgcmVnZXhcbiAgICBsZXQgcmVzdWx0ID0gY29tbWFuZC5tYXRjaEFsbChyZWdleClcblxuICAgIGZvciAobGV0IG0gb2YgcmVzdWx0KSB7XG4gICAgICAgIGxldCBnID0gbT8uWydncm91cHMnXTtcbiAgICAgICAgaWYgKCFpc09iamVjdChnKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcCA9IGc/LlsncGF0dGVybiddO1xuICAgICAgICBsZXQgYyA9IGc/LlsnY2hhciddO1xuXG4gICAgICAgIGlmIChwICYmIGMpIHtcbiAgICAgICAgICAgIGxldCByID0gJ19fJyArIG5ldyBJRCgpLnRvU3RyaW5nKCkgKyAnX18nO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuc2V0KHIsIGMpO1xuICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQucmVwbGFjZShwLCByKTtcbiAgICAgICAgfVxuXG4gICAgfVxuICAgIGxldCBwYXJ0cyA9IGNvbW1hbmQuc3BsaXQoJzonKTtcblxuICAgIHBhcnRzID0gcGFydHMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBsZXQgdiA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgZm9yIChsZXQgayBvZiBwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgdiA9IHYucmVwbGFjZShrWzBdLCBrWzFdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcblxuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFydHNcbn1cblxuLyoqXG4gKiB0cmllcyB0byBtYWtlIGEgc3RyaW5nIG91dCBvZiB2YWx1ZSBhbmQgaWYgdGhpcyBzdWNjZWVkcyB0byByZXR1cm4gaXQgYmFja1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb252ZXJ0VG9TdHJpbmcodmFsdWUpIHtcblxuICAgIGlmIChpc09iamVjdCh2YWx1ZSkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMgeyp9XG4gKiBAcHJpdmF0ZVxuICogQHRocm93cyB7RXJyb3J9IHVua25vd24gY29tbWFuZFxuICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gKiBAdGhyb3dzIHtFcnJvcn0gdHlwZSBub3Qgc3VwcG9ydGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gbWlzc2luZyBrZXkgcGFyYW1ldGVyXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybSh2YWx1ZSkge1xuXG4gICAgY29uc3QgY29uc29sZSA9IGdldEdsb2JhbE9iamVjdCgnY29uc29sZScpO1xuXG4gICAgbGV0IGFyZ3MgPSBjbG9uZSh0aGlzLmFyZ3MpO1xuICAgIGxldCBrZXksIGRlZmF1bHRWYWx1ZTtcblxuICAgIHN3aXRjaCAodGhpcy5jb21tYW5kKSB7XG5cbiAgICAgICAgY2FzZSAnc3RhdGljJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFyZ3Muam9pbignOicpO1xuXG4gICAgICAgIGNhc2UgJ3RvbG93ZXInOlxuICAgICAgICBjYXNlICdzdHJ0b2xvd2VyJzpcbiAgICAgICAgY2FzZSAndG9sb3dlcmNhc2UnOlxuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBjYXNlICd0b3VwcGVyJzpcbiAgICAgICAgY2FzZSAnc3RydG91cHBlcic6XG4gICAgICAgIGNhc2UgJ3RvdXBwZXJjYXNlJzpcbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgY2FzZSAndG9zdHJpbmcnOlxuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcblxuICAgICAgICBjYXNlICd0b2ludGVnZXInOlxuICAgICAgICAgICAgbGV0IG4gPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgICB2YWxpZGF0ZUludGVnZXIobik7XG4gICAgICAgICAgICByZXR1cm4gblxuXG4gICAgICAgIGNhc2UgJ3RvanNvbic6XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG4gICAgICAgIGNhc2UgJ2Zyb21qc29uJzpcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcblxuICAgICAgICBjYXNlICd0cmltJzpcbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICBjYXNlICdyYXd1cmxlbmNvZGUnOlxuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8hL2csICclMjEnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICclMjcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCgvZywgJyUyOCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcKS9nLCAnJTI5JylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwqL2csICclMkEnKTtcblxuXG4gICAgICAgIGNhc2UgICdjYWxsJzpcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBjYWxsYmFjay1kZWZpbml0aW9uXG4gICAgICAgICAgICAgKiBmdW5jdGlvbiBjYWxsYmFjayh2YWx1ZSwgLi4uYXJncykge1xuICAgICAgICAgICAgICogICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgKiB9XG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgbGV0IGNhbGxiYWNrO1xuICAgICAgICAgICAgbGV0IGNhbGxiYWNrTmFtZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCBjb250ZXh0ID0gZ2V0R2xvYmFsKCk7XG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoY2FsbGJhY2tOYW1lKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gdmFsdWVbY2FsbGJhY2tOYW1lXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYWxsYmFja3MuaGFzKGNhbGxiYWNrTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IHRoaXMuY2FsbGJhY2tzLmdldChjYWxsYmFja05hbWUpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcz8uWydjYWxsYmFjayddO1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBzPy5bJ2NvbnRleHQnXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiYgd2luZG93Lmhhc093blByb3BlcnR5KGNhbGxiYWNrTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHdpbmRvd1tjYWxsYmFja05hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjayk7XG5cbiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChjb250ZXh0LCAuLi5hcmdzKTtcblxuICAgICAgICBjYXNlICAncGxhaW4nOlxuICAgICAgICBjYXNlICAncGxhaW50ZXh0JzpcbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHZhbHVlLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICByZXR1cm4gZG9jLmJvZHkudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICBjYXNlICAnaWYnOlxuICAgICAgICBjYXNlICAnPyc6XG5cbiAgICAgICAgICAgIHZhbGlkYXRlUHJpbWl0aXZlKHZhbHVlKTtcblxuICAgICAgICAgICAgbGV0IHRydWVTdGF0ZW1lbnQgPSAoYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBsZXQgZmFsc2VTdGF0ZW1lbnQgPSAoYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICAgIGlmICh0cnVlU3RhdGVtZW50ID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgdHJ1ZVN0YXRlbWVudCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRydWVTdGF0ZW1lbnQgPT09ICdcXFxcdmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgdHJ1ZVN0YXRlbWVudCA9ICd2YWx1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmFsc2VTdGF0ZW1lbnQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICBmYWxzZVN0YXRlbWVudCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZhbHNlU3RhdGVtZW50ID09PSAnXFxcXHZhbHVlJykge1xuICAgICAgICAgICAgICAgIGZhbHNlU3RhdGVtZW50ID0gJ3ZhbHVlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNvbmRpdGlvbiA9ICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09ICdvZmYnICYmIHZhbHVlICE9PSAnZmFsc2UnICYmIHZhbHVlICE9PSBmYWxzZSkgfHwgdmFsdWUgPT09ICdvbicgfHwgdmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uID8gdHJ1ZVN0YXRlbWVudCA6IGZhbHNlU3RhdGVtZW50O1xuXG5cbiAgICAgICAgY2FzZSAndWNmaXJzdCc6XG4gICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cbiAgICAgICAgICAgIGxldCBmaXJzdGNoYXIgPSB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdGNoYXIgKyB2YWx1ZS5zdWJzdHIoMSk7XG4gICAgICAgIGNhc2UgJ3Vjd29yZHMnOlxuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodmFsdWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXihbYS16XFx1MDBFMC1cXHUwMEZDXSl8XFxzKyhbYS16XFx1MDBFMC1cXHUwMEZDXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdi50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSAgJ2NvdW50JzpcbiAgICAgICAgY2FzZSAgJ2xlbmd0aCc6XG5cbiAgICAgICAgICAgIGlmICgoaXNTdHJpbmcodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSB8fCBpc0FycmF5KHZhbHVlKSkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoJ2xlbmd0aCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHR5cGUgXCIgKyB0eXBlb2YgdmFsdWUpO1xuXG4gICAgICAgIGNhc2UgJ3RvLWJhc2U2NCc6XG4gICAgICAgIGNhc2UgJ2J0b2EnOlxuICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgICAgcmV0dXJuIGJ0b2EoY29udmVydFRvU3RyaW5nKHZhbHVlKSk7XG5cbiAgICAgICAgY2FzZSAnYXRvYic6XG4gICAgICAgIGNhc2UgJ2Zyb20tYmFzZTY0JzpcbiAgICAgICAgICAgIHJldHVybiBhdG9iKGNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpO1xuXG4gICAgICAgIGNhc2UgJ2VtcHR5JzpcbiAgICAgICAgICAgIHJldHVybiAnJztcblxuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjYXNlICdkZWJ1Zyc6XG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChjb25zb2xlKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgJ3ByZWZpeCc6XG4gICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgcHJlZml4ID0gYXJncz8uWzBdO1xuICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgJ3N1ZmZpeCc6XG4gICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgc3VmZml4ID0gYXJncz8uWzBdO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgc3VmZml4O1xuXG4gICAgICAgIGNhc2UgJ3VuaXFpZCc6XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBJRCgpKS50b1N0cmluZygpO1xuXG4gICAgICAgIGNhc2UgJ2ZpcnN0LWtleSc6XG4gICAgICAgIGNhc2UgJ2xhc3Qta2V5JzpcbiAgICAgICAgY2FzZSAnbnRoLWxhc3Qta2V5JzpcbiAgICAgICAgY2FzZSAnbnRoLWtleSc6XG5cbiAgICAgICAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBub3Qgc3VwcG9ydGVkXCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbW1hbmQgPT09ICdmaXJzdC1rZXknKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kID09PSAnbGFzdC1rZXknKSB7XG4gICAgICAgICAgICAgICAga2V5ID0ga2V5cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIGtleSA9IHZhbGlkYXRlSW50ZWdlcihwYXJzZUludChhcmdzLnNoaWZ0KCkpKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbW1hbmQgPT09ICdudGgtbGFzdC1rZXknKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXMubGVuZ3RoIC0ga2V5IC0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IChhcmdzLnNoaWZ0KCkgfHwgJycpO1xuXG4gICAgICAgICAgICBsZXQgdXNlS2V5ID0ga2V5cz8uW2tleV07XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZT8uW3VzZUtleV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU/Llt1c2VLZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG5cbiAgICAgICAgY2FzZSAna2V5JzpcbiAgICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICBjYXNlICdpbmRleCc6XG5cbiAgICAgICAgICAgIGtleSA9IGFyZ3Muc2hpZnQoKSB8fCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pc3Npbmcga2V5IHBhcmFtZXRlclwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSAoYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldChrZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUpIHx8IGlzQXJyYXkodmFsdWUpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWU/LltrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZT8uW2tleV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBub3Qgc3VwcG9ydGVkXCIpXG5cbiAgICAgICAgY2FzZSAncGF0aC1leGlzdHMnOlxuXG4gICAgICAgICAgICBrZXkgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIGtleSBwYXJhbWV0ZXJcIilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoZmluZGVyKHZhbHVlKS5leGlzdHMoa2V5KTtcblxuICAgICAgICBjYXNlICdwYXRoJzpcblxuICAgICAgICAgICAga2V5ID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBrZXkgcGFyYW1ldGVyXCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwZiA9IG5ldyBQYXRoZmluZGVyKHZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKCFwZi5leGlzdHMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwZi5nZXRWaWEoa2V5KTtcblxuXG4gICAgICAgIGNhc2UgJ3N1YnN0cmluZyc6XG5cbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKTtcblxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcGFyc2VJbnQoYXJnc1swXSkgfHwgMDtcbiAgICAgICAgICAgIGxldCBlbmQgPSAocGFyc2VJbnQoYXJnc1sxXSkgfHwgMCkgKyBzdGFydDtcblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyhzdGFydCwgZW5kKTtcblxuICAgICAgICBjYXNlICdub3AnOlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgICc/Pyc6XG4gICAgICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VHlwZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFR5cGUgPSAnc3RyaW5nJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ludCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgY2FzZSAnYm9vbCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGRlZmF1bHRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVmYXVsdFZhbHVlICE9PSAnJyAmJiBkZWZhdWx0VmFsdWUgIT09ICdvZmYnICYmIGRlZmF1bHRWYWx1ZSAhPT0gJ2ZhbHNlJyAmJiBkZWZhdWx0VmFsdWUgIT09ICdmYWxzZScpIHx8IGRlZmF1bHRWYWx1ZSA9PT0gJ29uJyB8fCBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyB8fCBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhdG9iKGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIG5vdCBzdXBwb3J0ZWRcIilcblxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGNvbW1hbmQgXCIgKyB0aGlzLmNvbW1hbmQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcbmltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gJy4uL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG5pbXBvcnQge1RyYW5zZm9ybWVyfSBmcm9tICcuL3RyYW5zZm9ybWVyLm1qcyc7XG5cbmV4cG9ydCB7UGlwZX1cblxuY29uc3QgREVMSU1JVEVSID0gJ3wnO1xuXG4vKipcbiAqIFRoZSBwaXBlIGNsYXNzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNvbWJpbmUgc2V2ZXJhbCBwcm9jZXNzaW5nIHN0ZXBzLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1BpcGV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RhdGEvcGlwZS5tanMnO1xuICogbmV3IFBpcGUoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBIHBpcGUgY29uc2lzdHMgb2YgY29tbWFuZHMgd2hvc2UgaW5wdXQgYW5kIG91dHB1dCBhcmUgY29ubmVjdGVkIHdpdGggdGhlIHBpcGUgc3ltYm9sIGB8YC5cbiAqXG4gKiBXaXRoIHRoZSBQaXBlLCBwcm9jZXNzaW5nIHN0ZXBzIGNhbiBiZSBjb21iaW5lZC4gSGVyZSwgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcyBhY2Nlc3NlZCB2aWEgdGhlIHBhdGhmaW5kZXIgKHBhdGggY29tbWFuZCkuXG4gKiB0aGUgd29yZCBpcyB0aGVuIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgbGV0dGVycyBhbmQgYSBwcmVmaXggSGVsbG8gaXMgYWRkZWQuIHRoZSB0d28gYmFja3NsYXNoIHNhZmUgdGhlIHNwYWNlIGNoYXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7UGlwZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS9waXBlLm1qcyc7XG4gKlxuICogbGV0IG9iaiA9IHtcbiAqICAgIGE6IHtcbiAqICAgICAgICBiOiB7XG4gKiAgICAgICAgICAgIGM6IHtcbiAqICAgICAgICAgICAgICAgIGQ6IFwid29ybGRcIlxuICogICAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgfVxuICogfVxuICpcbiAqIGNvbnNvbGUubG9nKG5ldyBQaXBlKCdwYXRoOmEuYi5jLmQgfCB0b3VwcGVyIHwgcHJlZml4OkhlbGxvXFxcXCAnKS5ydW4ob2JqKSk7XG4gKiAvLyBcdTIxQTYgSGVsbG8gV09STERcbiAqXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKi9cbmNsYXNzIFBpcGUgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBpcGUgYSBwaXBlIGNvbnNpc3RzIG9mIGNvbW1hbmRzIHdob3NlIGlucHV0IGFuZCBvdXRwdXQgYXJlIGNvbm5lY3RlZCB3aXRoIHRoZSBwaXBlIHN5bWJvbCBgfGAuXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBpcGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGlwZSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnBpcGUgPSBwaXBlLnNwbGl0KERFTElNSVRFUikubWFwKCh2KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVyKHYpO1xuICAgICAgICB9KTtcblxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICAgKiBAcmV0dXJucyB7VHJhbnNmb3JtZXJ9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gICAgICovXG4gICAgc2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcblxuICAgICAgICBmb3IgKGNvbnN0IFssIHRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucGlwZSkpIHtcbiAgICAgICAgICAgIHQuc2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcnVuIGEgcGlwZVxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHJ1bih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5waXBlLnJlZHVjZSgoYWNjdW11bGF0b3IsIHRyYW5zZm9ybWVyLCBjdXJyZW50SW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIucnVuKGFjY3VtdWxhdG9yKTtcbiAgICAgICAgfSwgdmFsdWUpO1xuICAgIH1cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmV4cG9ydCB7XG4gICAgREVGQVVMVF9USEVNRSxcbiAgICBBVFRSSUJVVEVfUFJFRklYLFxuICAgIEFUVFJJQlVURV9PUFRJT05TLFxuICAgIEFUVFJJQlVURV9PUFRJT05TX1NFTEVDVE9SLFxuICAgIEFUVFJJQlVURV9USEVNRV9QUkVGSVgsXG4gICAgQVRUUklCVVRFX1RIRU1FX05BTUUsXG4gICAgQVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFUyxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9TRUxFQ1RfVEhJUyxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9SRVBMQUNFLFxuICAgIEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVCxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlRfUkVGRVJFTkNFLFxuICAgIEFUVFJJQlVURV9VUERBVEVSX1JFTU9WRSxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9CSU5ELFxuICAgIEFUVFJJQlVURV9URU1QTEFURV9QUkVGSVgsXG4gICAgQVRUUklCVVRFX1JPTEUsXG4gICAgQVRUUklCVVRFX0RJU0FCTEVELFxuICAgIEFUVFJJQlVURV9WQUxVRSxcbiAgICBBVFRSSUJVVEVfT0JKRUNUTElOSyxcbiAgICBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuICAgIFRBR19TQ1JJUFQsXG4gICAgVEFHX1NUWUxFLFxuICAgIFRBR19MSU5LLFxuICAgIEFUVFJJQlVURV9JRCxcbiAgICBBVFRSSUJVVEVfQ0xBU1MsXG4gICAgQVRUUklCVVRFX1RJVExFLFxuICAgIEFUVFJJQlVURV9TUkMsXG4gICAgQVRUUklCVVRFX0hSRUYsXG4gICAgQVRUUklCVVRFX1RZUEUsXG4gICAgQVRUUklCVVRFX05PTkNFLFxuICAgIEFUVFJJQlVURV9UUkFOU0xBVEUsXG4gICAgQVRUUklCVVRFX1RBQklOREVYLFxuICAgIEFUVFJJQlVURV9TUEVMTENIRUNLLFxuICAgIEFUVFJJQlVURV9TTE9ULFxuICAgIEFUVFJJQlVURV9QQVJULFxuICAgIEFUVFJJQlVURV9MQU5HLFxuICAgIEFUVFJJQlVURV9JVEVNVFlQRSxcbiAgICBBVFRSSUJVVEVfSVRFTVNDT1BFLFxuICAgIEFUVFJJQlVURV9JVEVNUkVGLFxuICAgIEFUVFJJQlVURV9JVEVNSUQsXG4gICAgQVRUUklCVVRFX0lURU1QUk9QLFxuICAgIEFUVFJJQlVURV9JUyxcbiAgICBBVFRSSUJVVEVfSU5QVVRNT0RFLFxuICAgIEFUVFJJQlVURV9BQ0NFU1NLRVksXG4gICAgQVRUUklCVVRFX0FVVE9DQVBJVEFMSVpFLFxuICAgIEFUVFJJQlVURV9BVVRPRk9DVVMsXG4gICAgQVRUUklCVVRFX0NPTlRFTlRFRElUQUJMRSxcbiAgICBBVFRSSUJVVEVfRElSLFxuICAgIEFUVFJJQlVURV9EUkFHR0FCTEUsXG4gICAgQVRUUklCVVRFX0VOVEVSS0VZSElOVCxcbiAgICBBVFRSSUJVVEVfRVhQT1JUUEFSVFMsXG4gICAgQVRUUklCVVRFX0hJRERFTixcbiAgICBvYmplY3RVcGRhdGVyTGlua1N5bWJvbCxcblxufVxuXG4vKipcbiAqIGRlZmF1bHQgdGhlbWVcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgREVGQVVMVF9USEVNRSA9ICdtb25zdGVyJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBzaW5jZSAxLjguMFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQVRUUklCVVRFX1BSRUZJWCA9ICdkYXRhLW1vbnN0ZXItJztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcGFzcyBvcHRpb25zIHRvIGEgY29udHJvbFxuICpcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHNpbmNlIDEuOC4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfT1BUSU9OUyA9IEFUVFJJQlVURV9QUkVGSVggKyAnb3B0aW9ucyc7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHBhc3Mgb3B0aW9ucyB0byBhIGNvbnRyb2xcbiAqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBzaW5jZSAxLjMwLjBcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9PUFRJT05TX1NFTEVDVE9SID0gQVRUUklCVVRFX1BSRUZJWCArICdvcHRpb25zLXNlbGVjdG9yJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1RIRU1FX1BSRUZJWCA9IEFUVFJJQlVURV9QUkVGSVggKyAndGhlbWUtJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9USEVNRV9OQU1FID0gQVRUUklCVVRFX1RIRU1FX1BSRUZJWCArICduYW1lJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFUyA9IEFUVFJJQlVURV9QUkVGSVggKyAnYXR0cmlidXRlcyc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjcuMVxuICovXG5jb25zdCBBVFRSSUJVVEVfVVBEQVRFUl9TRUxFQ1RfVEhJUyA9IEFUVFJJQlVURV9QUkVGSVggKyAnc2VsZWN0LXRoaXMnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjguMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVVBEQVRFUl9SRVBMQUNFID0gQVRUUklCVVRFX1BSRUZJWCArICdyZXBsYWNlJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfSU5TRVJUID0gQVRUUklCVVRFX1BSRUZJWCArICdpbnNlcnQnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjguMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlRfUkVGRVJFTkNFID0gQVRUUklCVVRFX1BSRUZJWCArICdpbnNlcnQtcmVmZXJlbmNlJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfUkVNT1ZFID0gQVRUUklCVVRFX1BSRUZJWCArICdyZW1vdmUnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjkuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVVBEQVRFUl9CSU5EID0gQVRUUklCVVRFX1BSRUZJWCArICdiaW5kJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS4yNy4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9URU1QTEFURV9QUkVGSVggPSBBVFRSSUJVVEVfUFJFRklYICsgJ3RlbXBsYXRlLXByZWZpeCc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMTQuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfUk9MRSA9IEFUVFJJQlVURV9QUkVGSVggKyAncm9sZSc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjQuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfRElTQUJMRUQgPSAnZGlzYWJsZWQnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI0LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1ZBTFVFID0gJ3ZhbHVlJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS45LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX09CSkVDVExJTksgPSBBVFRSSUJVVEVfUFJFRklYICsgJ29iamVjdGxpbmsnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI0LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0VSUk9STUVTU0FHRSA9IEFUVFJJQlVURV9QUkVGSVggKyAnZXJyb3InO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBzaW5jZSAxLjI0LjBcbiAqL1xuY29uc3Qgb2JqZWN0VXBkYXRlckxpbmtTeW1ib2wgPSBTeW1ib2woJ21vbnN0ZXJVcGRhdGVyJyk7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBUQUdfU0NSSVBUID0gJ3NjcmlwdCc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBUQUdfU1RZTEUgPSAnc3R5bGUnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgVEFHX0xJTksgPSAnbGluayc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5cbmNvbnN0IEFUVFJJQlVURV9JRCA9ICdpZCc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5cbmNvbnN0IEFUVFJJQlVURV9DTEFTUyA9ICdjbGFzcyc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVElUTEUgPSAndGl0bGUnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1NSQyA9ICdzcmMnO1xuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9IUkVGID0gJ2hyZWYnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1RZUEUgPSAndHlwZSc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfTk9OQ0UgPSAnbm9uY2UnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1RSQU5TTEFURSA9ICd0cmFuc2xhdGUnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVEFCSU5ERVggPSAndGFiaW5kZXgnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfU1BFTExDSEVDSyA9ICdzcGVsbGNoZWNrJztcblxuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1NMT1QgPSAnc2xvdCc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9QQVJUID0gJ3BhcnQnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfTEFORyA9ICdsYW5nJztcblxuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1UWVBFID0gJ2l0ZW10eXBlJztcblxuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1TQ09QRSA9ICdpdGVtc2NvcGUnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSVRFTVJFRiA9ICdpdGVtcmVmJztcblxuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1JRCA9ICdpdGVtaWQnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSVRFTVBST1AgPSAnaXRlbXByb3AnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSVMgPSAnaXMnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSU5QVVRNT0RFID0gJ2lucHV0bW9kZSc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9BQ0NFU1NLRVkgPSAnYWNjZXNza2V5JztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9BVVRPQ0FQSVRBTElaRSA9ICdhdXRvY2FwaXRhbGl6ZSc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfQVVUT0ZPQ1VTID0gJ2F1dG9mb2N1cyc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfQ09OVEVOVEVESVRBQkxFID0gJ2NvbnRlbnRlZGl0YWJsZSc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfRElSID0gJ2Rpcic7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfRFJBR0dBQkxFID0gJ2RyYWdnYWJsZSc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9FTlRFUktFWUhJTlQgPSAnZW50ZXJrZXloaW50Jztcbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfRVhQT1JUUEFSVFMgPSAnZXhwb3J0cGFydHMnO1xuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9ISURERU4gPSAnaGlkZGVuJztcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2lzSXRlcmFibGUsIGlzU3RyaW5nfSBmcm9tICcuLi90eXBlcy9pcy5tanMnO1xuaW1wb3J0IHt2YWxpZGF0ZUZ1bmN0aW9uLCB2YWxpZGF0ZVN0cmluZ30gZnJvbSAnLi4vdHlwZXMvdmFsaWRhdGUubWpzJztcbmltcG9ydCB7QmFzZX0gZnJvbSAnLi9iYXNlLm1qcyc7XG5cbmV4cG9ydCB7VG9rZW5MaXN0fVxuXG4vKipcbiAqIEEgdG9rZW5saXN0IGFsbG93cyB5b3UgdG8gbWFuYWdlIHRva2VucyAoaW5kaXZpZHVhbCBjaGFyYWN0ZXIgc3RyaW5ncyBzdWNoIGFzIGNzcyBjbGFzc2VzIGluIGFuIGF0dHJpYnV0ZSBzdHJpbmcpLlxuICpcbiAqIFRoZSB0b2tlbmxpc3Qgb2ZmZXJzIHZhcmlvdXMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdmFsdWVzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBhZGQsIHJlbW92ZSBvciByZXBsYWNlIGEgY2xhc3MgaW4gYSBDU1MgbGlzdC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtUb2tlbkxpc3R9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3Rva2VubGlzdC5tanMnO1xuICogbmV3IFRva2VuTGlzdChcIm15Y2xhc3Mgcm93XCIpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgW2l0ZXJhdGlvbiBwcm90b2NvbF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvSXRlcmF0aW9uX3Byb3RvY29scykuXG4gKlxuICogYGBgXG4gKiB0eXBlb2YgbmV3IFRva2VuTGlzdChcIm15Y2xhc3Mgcm93XCIpW1N5bWJvbC5pdGVyYXRvcl07IFxuICogLy8gXHUyMUE2IFwiZnVuY3Rpb25cIlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuMi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuY2xhc3MgVG9rZW5MaXN0IGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfGl0ZXJhdGFibGV9IGluaXRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihpbml0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudG9rZW5zID0gbmV3IFNldCgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5pdCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5hZGQoaW5pdCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdG9yIHByb3RvY29sXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3ltYm9sLml0ZXJhdG9yfVxuICAgICAqL1xuICAgIGdldEl0ZXJhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0b3JcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt7bmV4dDogKChmdW5jdGlvbigpOiAoe3ZhbHVlOiAqLCBkb25lOiBib29sZWFufSkpfCopfX1cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgLy8gVXNlIGEgbmV3IGluZGV4IGZvciBlYWNoIGl0ZXJhdG9yLiBUaGlzIG1ha2VzIG11bHRpcGxlXG4gICAgICAgIC8vIGl0ZXJhdGlvbnMgb3ZlciB0aGUgaXRlcmFibGUgc2FmZSBmb3Igbm9uLXRyaXZpYWwgY2FzZXMsXG4gICAgICAgIC8vIHN1Y2ggYXMgdXNlIG9mIGJyZWFrIG9yIG5lc3RlZCBsb29waW5nIG92ZXIgdGhlIHNhbWUgaXRlcmFibGUuXG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIGxldCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IGVudHJpZXM/LltpbmRleCsrXSwgZG9uZTogZmFsc2V9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtkb25lOiB0cnVlfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpdCBjb250YWlucyB0b2tlbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBuZXcgVG9rZW5MaXN0KFwic3RhcnQgbWlkZGxlIGVuZFwiKS5jb250YWlucygnc3RhcnQnKSk7IC8vIFx1MjFBNiB0cnVlXG4gICAgICogbmV3IFRva2VuTGlzdChcInN0YXJ0IG1pZGRsZSBlbmRcIikuY29udGFpbnMoJ2VuZCcpKTsgLy8gXHUyMUE2IHRydWVcbiAgICAgKiBuZXcgVG9rZW5MaXN0KFwic3RhcnQgbWlkZGxlIGVuZFwiKS5jb250YWlucygneHl6JykpOyAvLyBcdTIxQTYgZmFsc2VcbiAgICAgKiBuZXcgVG9rZW5MaXN0KFwic3RhcnQgbWlkZGxlIGVuZFwiKS5jb250YWlucyhbJ2VuZCcsJ3N0YXJ0JywnbWlkZGxlJ10pKTsgLy8gXHUyMUE2IHRydWVcbiAgICAgKiBuZXcgVG9rZW5MaXN0KFwic3RhcnQgbWlkZGxlIGVuZFwiKS5jb250YWlucyhbJ2VuZCcsJ3N0YXJ0JywneHl6J10pKTsgLy8gXHUyMUE2IGZhbHNlXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2FycmF5fHN0cmluZ3xpdGVyYXRhYmxlfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNvbnRhaW5zKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpXG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICB2YWx1ZS5zcGxpdChcIiBcIikuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudG9rZW5zLmhhcyh0b2tlbi50cmltKCkpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyID4gMCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgdG9rZW4gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh0b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudG9rZW5zLmhhcyh0b2tlbi50cmltKCkpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvdW50ZXIgPiAwID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGFkZCB0b2tlbnNcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIG5ldyBUb2tlbkxpc3QoKS5hZGQoXCJhYmMgeHl6XCIpLnRvU3RyaW5nKCk7IC8vIFx1MjFBNiBcImFiYyB4eXpcIlxuICAgICAqIG5ldyBUb2tlbkxpc3QoKS5hZGQoW1wiYWJjXCIsXCJ4eXpcIl0pLnRvU3RyaW5nKCk7IC8vIFx1MjFBNiBcImFiYyB4eXpcIlxuICAgICAqIG5ldyBUb2tlbkxpc3QoKS5hZGQodW5kZWZpbmVkKTsgLy8gXHUyMUE2IGFkZCBub3RoaW5nXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2FycmF5fHN0cmluZ3xpdGVyYXRhYmxlfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtUb2tlbkxpc3R9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB2YWx1ZVxuICAgICAqL1xuICAgIGFkZCh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZS5zcGxpdChcIiBcIikuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbnMuYWRkKHRva2VuLnRyaW0oKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0b2tlbiBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5hZGQodG9rZW4udHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCB2YWx1ZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhbGwgdG9rZW5zXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7VG9rZW5MaXN0fVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRva2Vucy5jbGVhcigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRva2VuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBuZXcgVG9rZW5MaXN0KFwiYWJjIHh5elwiKS5yZW1vdmUoXCJ4eXpcIikudG9TdHJpbmcoKTsgLy8gXHUyMUE2IFwiYWJjXCJcbiAgICAgKiBuZXcgVG9rZW5MaXN0KFwiYWJjIHh5elwiKS5yZW1vdmUoW1wieHl6XCJdKS50b1N0cmluZygpOyAvLyBcdTIxQTYgXCJhYmNcIlxuICAgICAqIG5ldyBUb2tlbkxpc3QoXCJhYmMgeHl6XCIpLnJlbW92ZSh1bmRlZmluZWQpOyAvLyBcdTIxQTYgcmVtb3ZlIG5vdGhpbmdcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfGl0ZXJhdGFibGV9IHZhbHVlXG4gICAgICogQHJldHVybnMge1Rva2VuTGlzdH1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHZhbHVlXG4gICAgICovXG4gICAgcmVtb3ZlKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlLnNwbGl0KFwiIFwiKS5mb3JFYWNoKHRva2VuID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5kZWxldGUodG9rZW4udHJpbSgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRva2VuIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zLmRlbGV0ZSh0b2tlbi50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHZhbHVlXCIsIFwidHlwZXMvdG9rZW5saXN0Lm1qc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJlcGxhY2VzIGEgdG9rZW4gd2l0aCBhIG5ldyB0b2tlbi5cbiAgICAgKlxuICAgICAqIGlmIHRoZSBwYXNzZWQgdG9rZW4gZXhpc3RzLCBpdCBpcyByZXBsYWNlZCB3aXRoIG5ld1Rva2VuIGFuZCBUb2tlbkxpc3QgaXMgcmV0dXJuZWQuXG4gICAgICogaWYgdGhlIHRva2VuIGRvZXMgbm90IGV4aXN0LCBuZXdUb2tlbiBpcyBub3Qgc2V0IGFuZCBUb2tlbkxpc3QgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3VG9rZW5cbiAgICAgKiBAcmV0dXJucyB7VG9rZW5MaXN0fVxuICAgICAqL1xuICAgIHJlcGxhY2UodG9rZW4sIG5ld1Rva2VuKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHRva2VuKTtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcobmV3VG9rZW4pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnModG9rZW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhID0gQXJyYXkuZnJvbSh0aGlzLnRva2VucylcbiAgICAgICAgbGV0IGkgPSBhLmluZGV4T2YodG9rZW4pO1xuICAgICAgICBpZiAoaSA9PT0gLTEpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGEuc3BsaWNlKGksIDEsIG5ld1Rva2VuKTtcbiAgICAgICAgdGhpcy50b2tlbnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuYWRkKGEpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRva2VuIGZyb20gc3RyaW5nLiBJZiB0b2tlbiBkb2Vzbid0IGV4aXN0IGl0J3MgYWRkZWQuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBuZXcgVG9rZW5MaXN0KFwiYWJjIGRlZiBnaGlcIikudG9nZ2xlKFwiZGVmIHh5elwiKS50b1N0cmluZygpOyAvLyBcdTIxQTYgXCJhYmMgZ2hpIHh5elwiXG4gICAgICogbmV3IFRva2VuTGlzdChcImFiYyBkZWYgZ2hpXCIpLnRvZ2dsZShbXCJhYmNcIixcInh5elwiXSkudG9TdHJpbmcoKTsgLy8gXHUyMUE2IFwiZGVmIGdoaSB4eXpcIlxuICAgICAqIG5ldyBUb2tlbkxpc3QoKS50b2dnbGUodW5kZWZpbmVkKTsgLy8gXHUyMUE2IG5vdGhpbmdcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfGl0ZXJhdGFibGV9IHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB2YWx1ZVxuICAgICAqL1xuICAgIHRvZ2dsZSh2YWx1ZSkge1xuXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlLnNwbGl0KFwiIFwiKS5mb3JFYWNoKHRva2VuID0+IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVWYWx1ZS5jYWxsKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRva2VuIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlVmFsdWUuY2FsbCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgdmFsdWVcIiwgXCJ0eXBlcy90b2tlbmxpc3QubWpzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIHRva2Vuc1xuICAgICAqXG4gICAgICogQHJldHVybnMge2FycmF5fVxuICAgICAqL1xuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudG9rZW5zKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3aXRoIGVhY2ggdmFsdWUgb2YgdGhlIHNldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAcmV0dXJucyB7VG9rZW5MaXN0fVxuICAgICAqL1xuICAgIGZvckVhY2goY2FsbGJhY2spIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjayk7XG4gICAgICAgIHRoaXMudG9rZW5zLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHRoZSBpbmRpdmlkdWFsIHRva2VucyBzZXBhcmF0ZWQgYnkgYSBibGFuayBjaGFyYWN0ZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKS5qb2luKCcgJyk7XG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB0b2tlblxuICogQHJldHVybnMge3RvZ2dsZVZhbHVlfVxuICogQHRocm93cyB7RXJyb3J9IG11c3QgYmUgY2FsbGVkIHdpdGggVG9rZW5MaXN0LmNhbGxcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlVmFsdWUodG9rZW4pIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVG9rZW5MaXN0KSkgdGhyb3cgRXJyb3IoXCJtdXN0IGJlIGNhbGxlZCB3aXRoIFRva2VuTGlzdC5jYWxsXCIpXG4gICAgdmFsaWRhdGVTdHJpbmcodG9rZW4pO1xuICAgIHRva2VuID0gdG9rZW4udHJpbSgpO1xuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRva2VuKSkge1xuICAgICAgICB0aGlzLnJlbW92ZSh0b2tlbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLmFkZCh0b2tlbik7XG4gICAgcmV0dXJuIHRoaXM7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuL2Jhc2UubWpzJztcblxuZXhwb3J0IHtRdWV1ZX1cblxuLyoqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGUgaW5zdGFuY2UgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgbmV3IE1vbnN0ZXIuVHlwZXMuUXVldWUoKWAuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7UXVldWV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3F1ZXVlLm1qcyc7XG4gKiBuZXcgUXVldWUoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7UXVldWV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3F1ZXVlLm1qcyc7XG4gKlxuICogY29uc3QgcXVldWUgPSBuZXcgUXVldWU7XG4gKlxuICogcXVldWUuYWRkKDIpO1xuICogcXVldWUuYWRkKHRydWUpO1xuICogcXVldWUuYWRkKFwiSGVsbG9cIik7XG4gKiBxdWV1ZS5hZGQoNC41KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhxdWV1ZS5wb2xsKCkpO1xuICogLy8gXHUyMUE2IDJcbiAqIGNvbnNvbGUubG9nKHF1ZXVlLnBvbGwoKSk7XG4gKiAvLyBcdTIxQTYgdHJ1ZVxuICogY29uc29sZS5sb2cocXVldWUucG9sbCgpKTtcbiAqIC8vIFx1MjFBNiBcIkhlbGxvXCJcbiAqIGNvbnNvbGUubG9nKHF1ZXVlLnBvbGwoKSk7XG4gKiAvLyBcdTIxQTYgNC41XG4gKiBjb25zb2xlLmxvZyhxdWV1ZS5wb2xsKCkpO1xuICogLy8gXHUyMUE2IHVuZGVmaW5lZFxuICpcbiAqXG4gKiBAc2luY2UgMS40LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHN1bW1hcnkgQSBRdWV1ZSAoRmlmbylcbiAqL1xuY2xhc3MgUXVldWUgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUgd2l0aG91dCByZW1vdmluZyBpdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgcGVlaygpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAgICovXG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKHZhbHVlKVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYWxsIGVudHJpZXNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtRdWV1ZX1cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgZWxlbWVudCBhdCB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlXG4gICAgICogSWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Kn1cbiAgICAgKi9cbiAgICBwb2xsKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaGlmdCgpO1xuICAgIH1cblxuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtRdWV1ZX0gZnJvbSBcIi4vcXVldWUubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlT2JqZWN0fSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtVbmlxdWVRdWV1ZX1cblxuLyoqXG4gKiBBIFVuaXF1ZVF1ZXVlIGlzIGEgcXVldWUgdGhhdCBjb250YWlucyBpdGVtcyBvbmx5IG9uY2UuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7VW5pcXVlUXVldWV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3VuaXF1ZXF1ZXVlLm1qcyc7XG4gKiBuZXcgVW5pcXVlUXVldWUoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS40LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHN1bW1hcnkgQSBxdWV1ZSBmb3IgdW5pcXVlIHZhbHVlc1xuICovXG4gY2xhc3MgVW5pcXVlUXVldWUgZXh0ZW5kcyBRdWV1ZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnVuaXF1ZSA9IG5ldyBXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAgICAgKi9cbiAgICBhZGQodmFsdWUpIHtcblxuICAgICAgICB2YWxpZGF0ZU9iamVjdCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnVuaXF1ZS5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnVuaXF1ZS5hZGQodmFsdWUpO1xuICAgICAgICAgICAgc3VwZXIuYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhbGwgZW50cmllc1xuICAgICAqXG4gICAgICogQHJldHVybnMge1F1ZXVlfVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICBzdXBlci5jbGVhcigpO1xuICAgICAgICB0aGlzLnVuaXF1ZSA9IG5ldyBXZWFrU2V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGVsZW1lbnQgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZVxuICAgICAqIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge29iamVjdH1cbiAgICAgKi9cbiAgICBwb2xsKCkge1xuXG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmRhdGEuc2hpZnQoKTtcbiAgICAgICAgdGhpcy51bmlxdWUuZGVsZXRlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuL2Jhc2UubWpzJztcbmltcG9ydCB7aXNPYmplY3R9IGZyb20gJy4vaXMubWpzJztcbmltcG9ydCB7VG9rZW5MaXN0fSBmcm9tICcuL3Rva2VubGlzdC5tanMnO1xuaW1wb3J0IHtVbmlxdWVRdWV1ZX0gZnJvbSAnLi91bmlxdWVxdWV1ZS5tanMnO1xuXG5leHBvcnQge09ic2VydmVyfVxuXG4vKipcbiAqIEFuIG9ic2VydmVyIG1hbmFnZXMgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzJztcbiAqIG5ldyBPYnNlcnZlcigpXG4gKiBgYGBcbiAqXG4gKiBUaGUgdXBkYXRlIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgc3ViamVjdCBvYmplY3QgYXMgdGhpcyBwb2ludGVyLiBGb3IgdGhpcyByZWFzb24gdGhlIGNhbGxiYWNrIHNob3VsZCBub3RcbiAqIGJlIGFuIGFycm93IGZ1bmN0aW9uLCBiZWNhdXNlIGl0IGdldHMgdGhlIHRoaXMgcG9pbnRlciBvZiBpdHMgb3duIGNvbnRleHQuXG4gKlxuICogYGBgXG4gKiBuZXcgT2JzZXJ2ZXIoKCk9PntcbiAqICAgICAvLyB0aGlzIGlzIG5vdCBzdWJqZWN0XG4gKiB9KVxuICpcbiAqIG5ldyBPYnNlcnZlcihmdW5jdGlvbigpIHtcbiAqICAgICAvLyB0aGlzIGlzIHN1YmplY3RcbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4gVG8gZG8gdGhpcywgc2ltcGx5IHNwZWNpZnkgdGhlbS5cbiAqXG4gKiBgYGBcbiAqIE9ic2VydmVyKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAqICAgICBjb25zb2xlLmxvZyhhLCBiLCBjKTsgLy8gXHUyMUE2IFwiYVwiLCAyLCB0cnVlIFxuICogfSwgXCJhXCIsIDIsIHRydWUpXG4gKiBgYGBcbiAqXG4gKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBoYXZlIGFzIG1hbnkgcGFyYW1ldGVycyBhcyBhcmd1bWVudHMgYXJlIGdpdmVuLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzJztcbiAqXG4gKiBjb25zdCBvYnNlcnZlciA9IG5ldyBPYnNlcnZlcihmdW5jdGlvbihhLCBiLCBjKSB7XG4gKiAgICAgIGNvbnNvbGUubG9nKHRoaXMsIGEsIGIsIGMpOyAvLyBcdTIxQTYgXCJhXCIsIDIsIHRydWUgXG4gKiB9LCBcImFcIiwgMiwgdHJ1ZSk7XG4gKlxuICogb2JzZXJ2ZXIudXBkYXRlKHt2YWx1ZTp0cnVlfSkudGhlbigoKT0+e30pO1xuICogLy8gXHUyMUE2IHt2YWx1ZTogdHJ1ZX0gXCJhXCIgMiB0cnVlXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuY2xhc3MgT2JzZXJ2ZXIgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0geyp9IGFyZ3NcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9ic2VydmVyIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIHRoaXMudGFncyA9IG5ldyBUb2tlbkxpc3Q7XG4gICAgICAgIHRoaXMucXVldWUgPSBuZXcgVW5pcXVlUXVldWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICAgKiBAcmV0dXJucyB7T2JzZXJ2ZXJ9XG4gICAgICovXG4gICAgYWRkVGFnKHRhZykge1xuICAgICAgICB0aGlzLnRhZ3MuYWRkKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgICAqIEByZXR1cm5zIHtPYnNlcnZlcn1cbiAgICAgKi9cbiAgICByZW1vdmVUYWcodGFnKSB7XG4gICAgICAgIHRoaXMudGFncy5yZW1vdmUodGFnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZ2V0VGFncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFncy5lbnRyaWVzKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNUYWcodGFnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZ3MuY29udGFpbnModGFnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHN1YmplY3RcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICB1cGRhdGUoc3ViamVjdCkge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGlmICghaXNPYmplY3Qoc3ViamVjdCkpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoXCJzdWJqZWN0IG11c3QgYmUgYW4gb2JqZWN0XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5xdWV1ZS5hZGQoc3ViamVjdCk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGFuZCB0aGUgc2V0dGltZW91dCBlbnN1cmUgdGhhdCBhbiBvYmplY3QgaXMgbm90IFxuICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1lZCBvZiB0aGUgc2FtZSBjaGFuZ2UgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnF1ZXVlLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSBzZWxmLnF1ZXVlLnBvbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHNlbGYuY2FsbGJhY2suYXBwbHkocywgc2VsZi5hcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChyZXN1bHQpICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG5cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKVxuXG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi9iYXNlLm1qcyc7XG5pbXBvcnQge09ic2VydmVyfSBmcm9tIFwiLi9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZX0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7T2JzZXJ2ZXJMaXN0fVxuXG4vKipcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhlIE9ic2VydmVyTGlzdCBjbGFzcywgb2JzZXJ2ZXIgY2FuIGJlIG1hbmFnZWQuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7T2JzZXJ2ZXJMaXN0fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9vYnNlcnZlcmxpc3QubWpzJztcbiAqIGNvbnNvbGUubG9nKE9ic2VydmVyTGlzdCgpKVxuICogY29uc29sZS5sb2coT2JzZXJ2ZXJMaXN0KCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmNsYXNzIE9ic2VydmVyTGlzdCBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVybiB7T2JzZXJ2ZXJMaXN0fVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIE9ic2VydmVyXG4gICAgICovXG4gICAgYXR0YWNoKG9ic2VydmVyKSB7XG4gICAgICAgIHZhbGlkYXRlSW5zdGFuY2Uob2JzZXJ2ZXIsIE9ic2VydmVyKVxuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgICAqIEByZXR1cm4ge09ic2VydmVyTGlzdH1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBPYnNlcnZlclxuICAgICAqL1xuICAgIGRldGFjaChvYnNlcnZlcikge1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKG9ic2VydmVyLCBPYnNlcnZlcilcblxuICAgICAgICB2YXIgaSA9IDAsIGwgPSB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlcnNbaV0gPT09IG9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIE9ic2VydmVyXG4gICAgICovXG4gICAgY29udGFpbnMob2JzZXJ2ZXIpIHtcbiAgICAgICAgdmFsaWRhdGVJbnN0YW5jZShvYnNlcnZlciwgT2JzZXJ2ZXIpXG4gICAgICAgIHZhciBpID0gMCwgbCA9IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDtcbiAgICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9ic2VydmVyc1tpXSA9PT0gb2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHN1YmplY3RcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIG5vdGlmeShzdWJqZWN0KSB7XG5cbiAgICAgICAgbGV0IHBvbWlzZXMgPSBbXVxuXG4gICAgICAgIGxldCBpID0gMCwgbCA9IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDtcbiAgICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHBvbWlzZXMucHVzaCh0aGlzLm9ic2VydmVyc1tpXS51cGRhdGUoc3ViamVjdCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBvbWlzZXMpO1xuICAgIH07XG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4vYmFzZS5tanMnO1xuaW1wb3J0IHtpc0FycmF5LCBpc09iamVjdCwgaXNQcmltaXRpdmV9IGZyb20gXCIuL2lzLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4vb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge09ic2VydmVyTGlzdH0gZnJvbSBcIi4vb2JzZXJ2ZXJsaXN0Lm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuXG5leHBvcnQge1Byb3h5T2JzZXJ2ZXJ9XG5cbi8qKlxuICogQW4gb2JzZXJ2ZXIgbWFuYWdlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7UHJveHlPYnNlcnZlcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvcHJveHlvYnNlcnZlci5tanMnO1xuICogbmV3IFByb3h5T2JzZXJ2ZXIoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBXaXRoIHRoZSBQcm94eU9ic2VydmVyIHlvdSBjYW4gYXR0YWNoIG9ic2VydmVyIGZvciBvYnNlcnZhdGlvbi4gd2l0aCBlYWNoIGNoYW5nZSBhdCB0aGUgb2JqZWN0IHRvIGJlIG9ic2VydmVkIGFuIHVwZGF0ZSB0YWtlcyBwbGFjZS5cbiAqXG4gKiB0aGlzIGFsc28gYXBwbGllcyB0byBuZXN0ZWQgb2JqZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7UHJveHlPYnNlcnZlcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvcHJveHlvYnNlcnZlci5tanMnO1xuICogaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzJztcbiAqIGltcG9ydCB7aXNPYmplY3R9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL2lzLm1qcyc7XG4gKlxuICogY29uc3QgbyA9IG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7IFxuICogICBpZiAoaXNPYmplY3QodGhpcykgJiYgdGhpcyBpbnN0YW5jZW9mIFByb3h5T2JzZXJ2ZXIpIHtcbiAqICAgICAgIC8vIGRvIHNvbWV0aGluZyAodGhpcyBpc3QgUHJveHlPYnNlcnZlcilcbiAqICAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLmdldFN1YmplY3QoKTtcbiAqICAgICAgIGNvbnNvbGUubG9nKHN1YmplY3QpO1xuICogICB9XG4gKiB9KTtcbiAqXG4gKiBsZXQgcmVhbFN1YmplY3QgPSB7XG4gKiAgIGE6IHtcbiAqICAgICAgIGI6IHtcbiAqICAgICAgICAgICBjOiB0cnVlXG4gKiAgICAgICB9LFxuICogICAgICAgZDogOVxuICogICB9XG4gKiB9XG4gKlxuICogY29uc3QgcCA9IG5ldyBQcm94eU9ic2VydmVyKHJlYWxTdWJqZWN0KTtcbiAqIHAuYXR0YWNoT2JzZXJ2ZXIobyk7XG4gKiBjb25zdCBzID0gcC5nZXRTdWJqZWN0KCk7XG4gKiBzLmEuYi5jID0gZmFsc2U7XG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuIGNsYXNzIFByb3h5T2JzZXJ2ZXIgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob2JqZWN0KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5yZWFsU3ViamVjdCA9IHZhbGlkYXRlT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHRoaXMuc3ViamVjdCA9IG5ldyBQcm94eShvYmplY3QsIGdldEhhbmRsZXIuY2FsbCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5vYmplY3RNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLm9iamVjdE1hcC5zZXQodGhpcy5yZWFsU3ViamVjdCwgdGhpcy5zdWJqZWN0KTtcblxuICAgICAgICB0aGlzLnByb3h5TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgdGhpcy5wcm94eU1hcC5zZXQodGhpcy5zdWJqZWN0LCB0aGlzLnJlYWxTdWJqZWN0KTtcblxuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG5ldyBPYnNlcnZlckxpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSByZWFsIG9iamVjdFxuICAgICAqXG4gICAgICogY2hhbmdlcyB0byB0aGlzIG9iamVjdCBhcmUgbm90IG5vdGljZWQgYnkgdGhlIG9ic2VydmVycywgc28geW91IGNhbiBtYWtlIGEgbGFyZ2UgbnVtYmVyIG9mIGNoYW5nZXMgYW5kIGluZm9ybSB0aGUgb2JzZXJ2ZXJzIGxhdGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBnZXRTdWJqZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJqZWN0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHNpbmNlIDEuMjQuMFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLlR5cGVzLlByb3h5T2JzZXJ2ZXJ9XG4gICAgICovXG4gICAgc2V0U3ViamVjdChvYmopIHtcblxuICAgICAgICBsZXQgaSwgayA9IE9iamVjdC5rZXlzKHRoaXMuc3ViamVjdCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJqZWN0W2tbaV1dO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJqZWN0ID0gZXh0ZW5kKHRoaXMuc3ViamVjdCwgb2JqKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSBwcm94aWVkIG9iamVjdFxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBnZXRSZWFsU3ViamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhbFN1YmplY3RcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhdHRhY2ggYSBuZXcgb2JzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVybnMge1Byb3h5T2JzZXJ2ZXJ9XG4gICAgICovXG4gICAgYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMuYXR0YWNoKG9ic2VydmVyKVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZXRhY2ggYSBvYnNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7UHJveHlPYnNlcnZlcn1cbiAgICAgKi9cbiAgICBkZXRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuICAgICAgICB0aGlzLm9ic2VydmVycy5kZXRhY2gob2JzZXJ2ZXIpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG5vdGlmeSBhbGwgb2JzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIG5vdGlmeU9ic2VydmVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLm5vdGlmeSh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNvbnRhaW5zT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmNvbnRhaW5zKG9ic2VydmVyKVxuICAgIH1cblxufVxuXG4vKipcbiAqXG4gKiBAcmV0dXJucyB7e2RlZmluZVByb3BlcnR5OiAoZnVuY3Rpb24oKj0sICo9LCAqPSk6ICopLCBzZXRQcm90b3R5cGVPZjogKGZ1bmN0aW9uKCosICo9KTogYm9vbGVhbiksIHNldDogKGZ1bmN0aW9uKCosICosICosICopOiBib29sZWFuKSwgZ2V0OiAoKGZ1bmN0aW9uKCo9LCAqPSwgKj0pOiAodW5kZWZpbmVkKSl8KiksIGRlbGV0ZVByb3BlcnR5OiAoKGZ1bmN0aW9uKCosICopOiAoYm9vbGVhbikpfCopfX1cbiAqIEBwcml2YXRlXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS8tL3NuaXBwZXRzLzQ5fVxuICovXG5mdW5jdGlvbiBnZXRIYW5kbGVyKCkge1xuXG4gICAgY29uc3QgcHJveHkgPSB0aGlzO1xuXG4gICAgLy8gaHR0cHM6Ly8yNjIuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy85LjAvI3NlYy1wcm94eS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICBjb25zdCBoYW5kbGVyID0ge1xuXG4gICAgICAgIC8vIGh0dHBzOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvOS4wLyNzZWMtcHJveHktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzLWdldC1wLXJlY2VpdmVyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKHRhcmdldCwga2V5LCByZWNlaXZlcikge1xuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZXQgdmFsdWUgYXMgcHJveHkgaWYgb2JqZWN0IG9yIGFycmF5XG4gICAgICAgICAgICBpZiAoKGlzQXJyYXkodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJveHkub2JqZWN0TWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5Lm9iamVjdE1hcC5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJveHkucHJveHlNYXAuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHAgPSBuZXcgUHJveHkodmFsdWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICBwcm94eS5vYmplY3RNYXAuc2V0KHZhbHVlLCBwKTtcbiAgICAgICAgICAgICAgICAgICAgcHJveHkucHJveHlNYXAuc2V0KHAsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIGh0dHBzOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvOS4wLyNzZWMtcHJveHktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzLXNldC1wLXYtcmVjZWl2ZXIgXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpIHtcblxuICAgICAgICAgICAgaWYgKHByb3h5LnByb3h5TWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3h5LnByb3h5TWFwLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm94eS5wcm94eU1hcC5oYXModGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHByb3h5LnByb3h5TWFwLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG4gICAgICAgICAgICBpZiAocHJveHkucHJveHlNYXAuaGFzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHByb3h5LnByb3h5TWFwLmdldChjdXJyZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICBsZXQgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcblxuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc2NyaXB0b3JbJ3ZhbHVlJ10gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgICAgIHByb3h5Lm9ic2VydmVycy5ub3RpZnkocHJveHkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLy8gaHR0cHM6Ly8yNjIuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy85LjAvI3NlYy1wcm94eS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHMtZGVsZXRlLXBcbiAgICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W2tleV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm94eS5vYnNlcnZlcnMubm90aWZ5KHByb3h5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBodHRwczovLzI2Mi5lY21hLWludGVybmF0aW9uYWwub3JnLzkuMC8jc2VjLXByb3h5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90cy1kZWZpbmVvd25wcm9wZXJ0eS1wLWRlc2NcbiAgICAgICAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgICAgIHByb3h5Lm9ic2VydmVycy5ub3RpZnkocHJveHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBodHRwczovLzI2Mi5lY21hLWludGVybmF0aW9uYWwub3JnLzkuMC8jc2VjLXByb3h5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90cy1zZXRwcm90b3R5cGVvZi12XG4gICAgICAgIHNldFByb3RvdHlwZU9mOiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBSZWZsZWN0LnNldFByb3RvdHlwZU9mKG9iamVjdDEsIGtleSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICAgICAgcHJveHkub2JzZXJ2ZXJzLm5vdGlmeShwcm94eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH07XG5cblxuICAgIHJldHVybiBoYW5kbGVyO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHtpc1N0cmluZ30gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlQXJyYXksIHZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtNZWRpYVR5cGUsIHBhcnNlTWVkaWFUeXBlfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbCA9IFN5bWJvbCgnaW50ZXJuYWwnKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZVxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuXG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgYW4gb2JqZWN0IHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLk1lZGlhVHlwZSgpYC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtNZWRpYVR5cGV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL21lZGlhdHlwZS5tanMnO1xuICogY29uc29sZS5sb2cobmV3IE1lZGlhVHlwZSgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS44LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5jbGFzcyBNZWRpYVR5cGUgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3VidHlwZVxuICAgICAqIEBwYXJhbSB7TW9uc3Rlci5UeXBlcy5QYXJhbWV0ZXJbXX0gcGFyYW1ldGVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZSwgc3VidHlwZSwgcGFyYW1ldGVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpc1tpbnRlcm5hbF0gPSB7XG4gICAgICAgICAgICB0eXBlOiB2YWxpZGF0ZVN0cmluZyh0eXBlKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgc3VidHlwZTogdmFsaWRhdGVTdHJpbmcoc3VidHlwZSkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIHBhcmFtZXRlcjogW11cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJhbWV0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpc1tpbnRlcm5hbF1bJ3BhcmFtZXRlciddID0gdmFsaWRhdGVBcnJheShwYXJhbWV0ZXIpO1xuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxdLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldCBzdWJ0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbF0uc3VidHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLlR5cGVzLlBhcmFtZXRlcltdfVxuICAgICAqL1xuICAgIGdldCBwYXJhbWV0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsXS5wYXJhbWV0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge01hcH1cbiAgICAgKi9cbiAgICBnZXQgcGFyYW1ldGVyKCkge1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXBcblxuICAgICAgICB0aGlzW2ludGVybmFsXVsncGFyYW1ldGVyJ10uZm9yRWFjaChwID0+IHtcblxuICAgICAgICAgICAgbGV0IHZhbHVlID0gcC52YWx1ZTtcblxuICAgICAgICAgICAgLy8gaW50ZXJuYWxseSBzcGVjaWFsIHZhbHVlcyBhcmUgcGFydGx5IHN0b3JlZCB3aXRoIHF1b3RlcywgdGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZW0uXG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWx1ZS5lbmRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQuc2V0KHAua2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pXG5cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuXG4gICAgICAgIGxldCBwYXJhbWV0ZXIgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgYSBvZiB0aGlzW2ludGVybmFsXS5wYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgIHBhcmFtZXRlci5wdXNoKGEua2V5ICsgJz0nICsgYS52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbF0udHlwZSArICcvJyArIHRoaXNbaW50ZXJuYWxdLnN1YnR5cGUgKyAocGFyYW1ldGVyLmxlbmd0aCA+IDAgPyAnOycgKyBwYXJhbWV0ZXIuam9pbignOycpIDogJycpO1xuICAgIH1cblxufVxuXG4vKipcbiAqIFlvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5UeXBlcy5wYXJzZU1lZGlhVHlwZSgpYC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtNb25zdGVyfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS8vbW9uc3Rlci5tanMnO1xuICogY29uc29sZS5sb2coTW9uc3Rlci5UeXBlcy5wYXJzZU1lZGlhVHlwZSgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gaW50ZWdyYXRlIHRoaXMgZnVuY3Rpb24gaW5kaXZpZHVhbGx5LlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3BhcnNlTWVkaWFUeXBlfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhwYXJzZU1lZGlhVHlwZSgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBTcGVjaWZpY2F0aW9uOlxuICpcbiAqIGBgYFxuICogZGF0YXVybCAgICA6PSBcImRhdGE6XCIgWyBtZWRpYXR5cGUgXSBbIFwiO2Jhc2U2NFwiIF0gXCIsXCIgZGF0YVxuICogbWVkaWF0eXBlICA6PSBbIHR5cGUgXCIvXCIgc3VidHlwZSBdICooIFwiO1wiIHBhcmFtZXRlciApXG4gKiBkYXRhICAgICAgIDo9ICp1cmxjaGFyXG4gKiBwYXJhbWV0ZXIgIDo9IGF0dHJpYnV0ZSBcIj1cIiB2YWx1ZVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lZGlhdHlwZVxuICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5NZWRpYVR5cGV9XG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjA0NSNzZWN0aW9uLTUuMVxuICogQHRocm93cyB7VHlwZUVycm9yfSB0aGUgbWltZXR5cGUgY2FuIG5vdCBiZSBwYXJzZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gYmxhbmsgdmFsdWUgaXMgbm90IGFsbG93ZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gbWFsZm9ybWVkIGRhdGEgdXJsXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5mdW5jdGlvbiBwYXJzZU1lZGlhVHlwZShtZWRpYXR5cGUpIHtcblxuICAgIGNvbnN0IHJlZ2V4ID0gLyg/PHR5cGU+W0EtWmEtel0rfFxcKilcXC8oPzxzdWJ0eXBlPihbYS16QS1aMC05LlxcK19cXC1dKyl8XFwqfCkoPzxwYXJhbWV0ZXI+XFxzKjtcXHMqKFthLXpBLVowLTldKylcXHMqKD1cXHMqKFwiP1tBLVphLXowLTlfXFwtXStcIj8pKT8pKi9nO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlZ2V4LmV4ZWModmFsaWRhdGVTdHJpbmcobWVkaWF0eXBlKSk7XG5cbiAgICBjb25zdCBncm91cHMgPSByZXN1bHQ/LlsnZ3JvdXBzJ107XG4gICAgaWYgKGdyb3VwcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoZSBtaW1ldHlwZSBjYW4gbm90IGJlIHBhcnNlZCcpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IGdyb3Vwcz8uWyd0eXBlJ107XG4gICAgY29uc3Qgc3VidHlwZSA9IGdyb3Vwcz8uWydzdWJ0eXBlJ107XG4gICAgY29uc3QgcGFyYW1ldGVyID0gZ3JvdXBzPy5bJ3BhcmFtZXRlciddO1xuXG4gICAgaWYgKHN1YnR5cGUgPT09IFwiXCIgfHwgdHlwZSA9PT0gXCJcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdibGFuayB2YWx1ZSBpcyBub3QgYWxsb3dlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTWVkaWFUeXBlKHR5cGUsIHN1YnR5cGUsIHBhcnNlUGFyYW1ldGVyKHBhcmFtZXRlcikpO1xuXG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuMTguMFxuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtZXRlclxuICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5QYXJhbWV0ZXJbXXx1bmRlZmluZWR9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5mdW5jdGlvbiBwYXJzZVBhcmFtZXRlcihwYXJhbWV0ZXIpIHtcblxuICAgIGlmICghaXNTdHJpbmcocGFyYW1ldGVyKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgIHBhcmFtZXRlci5zcGxpdCgnOycpLmZvckVhY2goKGVudHJ5KSA9PiB7XG5cbiAgICAgICAgZW50cnkgPSBlbnRyeS50cmltKCk7XG4gICAgICAgIGlmIChlbnRyeSA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga3YgPSBlbnRyeS5zcGxpdCgnPScpXG5cbiAgICAgICAgbGV0IGtleSA9IHZhbGlkYXRlU3RyaW5nKGt2Py5bMF0pLnRyaW0oKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdmFsaWRhdGVTdHJpbmcoa3Y/LlsxXSkudHJpbSgpO1xuXG4gICAgICAgIC8vIGlmIHZhbHVlcyBhcmUgcXVvdGVkLCB0aGV5IHJlbWFpbiBzbyBpbnRlcm5hbGx5XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pXG5cblxuICAgIH0pXG5cbiAgICByZXR1cm4gcmVzdWx0O1xuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQge2lzU3RyaW5nfSBmcm9tIFwiLi9pcy5tanNcIjtcbmltcG9ydCB7TWVkaWFUeXBlLCBwYXJzZU1lZGlhVHlwZX0gZnJvbSBcIi4vbWVkaWF0eXBlLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUJvb2xlYW4sIHZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtEYXRhVXJsLCBwYXJzZURhdGFVUkx9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGludGVybmFsID0gU3ltYm9sKCdpbnRlcm5hbCcpO1xuXG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgYW4gb2JqZWN0IHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLkRhdGFVcmwoKWAuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7RGF0YVVybH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanMnO1xuICogbmV3IERhdGFVcmwoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS44LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jhc2ljc19vZl9IVFRQL0RhdGFfVVJJc1xuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzIzOTdcbiAqL1xuY2xhc3MgRGF0YVVybCBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE1vbnN0ZXIuVHlwZXMuTWVkaWFUeXBlfSBtZWRpYXR5cGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJhc2U2ND10cnVlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29udGVudCwgbWVkaWF0eXBlLCBiYXNlNjQpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAoaXNTdHJpbmcobWVkaWF0eXBlKSkge1xuICAgICAgICAgICAgbWVkaWF0eXBlID0gcGFyc2VNZWRpYVR5cGUobWVkaWF0eXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxdID0ge1xuICAgICAgICAgICAgY29udGVudDogdmFsaWRhdGVTdHJpbmcoY29udGVudCksXG4gICAgICAgICAgICBtZWRpYXR5cGU6IHZhbGlkYXRlSW5zdGFuY2UobWVkaWF0eXBlLCBNZWRpYVR5cGUpLFxuICAgICAgICAgICAgYmFzZTY0OiB2YWxpZGF0ZUJvb2xlYW4oYmFzZTY0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogYmFzZTY0KVxuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIGdldCBjb250ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbF0uYmFzZTY0ID8gYXRvYih0aGlzW2ludGVybmFsXS5jb250ZW50KSA6IHRoaXNbaW50ZXJuYWxdLmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgZ2V0IG1lZGlhdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxdLm1lZGlhdHlwZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyMzk3XG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG5cbiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzW2ludGVybmFsXS5jb250ZW50O1xuXG4gICAgICAgIGlmICh0aGlzW2ludGVybmFsXS5iYXNlNjQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnO2Jhc2U2NCwnICsgY29udGVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnLCcgKyBlbmNvZGVVUklDb21wb25lbnQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJ2RhdGE6JyArIHRoaXNbaW50ZXJuYWxdLm1lZGlhdHlwZS50b1N0cmluZygpICsgY29udGVudDtcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIGZ1bmN0aW9uIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYE1vbnN0ZXIuVHlwZXMucGFyc2VEYXRhVVJMKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3BhcnNlRGF0YVVSTH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanMnO1xuICogcGFyc2VEYXRhVVJMKC4uLilcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogU3BlY2lmaWNhdGlvbjpcbiAqXG4gKiBgYGBcbiAqIGRhdGF1cmwgICAgOj0gXCJkYXRhOlwiIFsgbWVkaWF0eXBlIF0gWyBcIjtiYXNlNjRcIiBdIFwiLFwiIGRhdGFcbiAqIG1lZGlhdHlwZSAgOj0gWyB0eXBlIFwiL1wiIHN1YnR5cGUgXSAqKCBcIjtcIiBwYXJhbWV0ZXIgKVxuICogZGF0YSAgICAgICA6PSAqdXJsY2hhclxuICogcGFyYW1ldGVyICA6PSBhdHRyaWJ1dGUgXCI9XCIgdmFsdWVcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhdXJsXG4gKiBAcmV0dXJuIHtNb25zdGVyLlR5cGVzLkRhdGFVcmx9XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvRGF0YV9VUklzXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjM5N1xuICogQHRocm93cyB7VHlwZUVycm9yfSBpbmNvcnJlY3Qgb3IgbWlzc2luZyBkYXRhIHByb3RvY29sXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IG1hbGZvcm1lZCBkYXRhIHVybFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VEYXRhVVJMKGRhdGF1cmwpIHtcblxuICAgIHZhbGlkYXRlU3RyaW5nKGRhdGF1cmwpO1xuXG4gICAgZGF0YXVybCA9IGRhdGF1cmwudHJpbSgpO1xuXG4gICAgaWYgKGRhdGF1cmwuc3Vic3RyaW5nKDAsIDUpICE9PSAnZGF0YTonKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2luY29ycmVjdCBvciBtaXNzaW5nIGRhdGEgcHJvdG9jb2wnKVxuICAgIH1cblxuICAgIGRhdGF1cmwgPSBkYXRhdXJsLnN1YnN0cmluZyg1KTtcblxuICAgIGxldCBwID0gZGF0YXVybC5pbmRleE9mKCcsJyk7XG4gICAgaWYgKHAgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hbGZvcm1lZCBkYXRhIHVybCcpXG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnQgPSBkYXRhdXJsLnN1YnN0cmluZyhwICsgMSk7XG4gICAgbGV0IG1lZGlhdHlwZUFuZEJhc2U2NCA9IGRhdGF1cmwuc3Vic3RyaW5nKDAsIHApLnRyaW0oKTtcbiAgICBsZXQgbWVkaWF0eXBlID0gJ3RleHQvcGxhaW47Y2hhcnNldD1VUy1BU0NJSSc7XG4gICAgbGV0IGJhc2U2NEZsYWcgPSBmYWxzZTtcblxuICAgIGlmIChtZWRpYXR5cGVBbmRCYXNlNjQgIT09IFwiXCIpIHtcbiAgICAgICAgbWVkaWF0eXBlID0gbWVkaWF0eXBlQW5kQmFzZTY0O1xuICAgICAgICBpZiAobWVkaWF0eXBlQW5kQmFzZTY0LmVuZHNXaXRoKCdiYXNlNjQnKSkge1xuICAgICAgICAgICAgbGV0IGkgPSBtZWRpYXR5cGVBbmRCYXNlNjQubGFzdEluZGV4T2YoJzsnKTtcbiAgICAgICAgICAgIG1lZGlhdHlwZSA9IG1lZGlhdHlwZUFuZEJhc2U2NC5zdWJzdHJpbmcoMCwgaSk7XG4gICAgICAgICAgICBiYXNlNjRGbGFnID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBkZWNvZGVVUklDb21wb25lbnQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZWRpYXR5cGUgPSBwYXJzZU1lZGlhVHlwZShtZWRpYXR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSBkZWNvZGVVUklDb21wb25lbnQoY29udGVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRhVXJsKGNvbnRlbnQsIG1lZGlhdHlwZSwgYmFzZTY0RmxhZyk7XG5cblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cblxuaW1wb3J0IHtpc0FycmF5LCBpc09iamVjdH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gXCIuLi90eXBlcy90eXBlb2YubWpzXCI7XG5cbmV4cG9ydCB7ZGlmZn1cblxuLyoqXG4gKiBXaXRoIHRoZSBkaWZmIGZ1bmN0aW9uIHlvdSBjYW4gcGVyZm9ybSB0aGUgY2hhbmdlIG9mIG9uZSBvYmplY3QgdG8gYW5vdGhlci4gVGhlIHJlc3VsdCBzaG93cyB0aGUgY2hhbmdlcyBvZiB0aGUgc2Vjb25kIG9iamVjdCB0byB0aGUgZmlyc3Qgb2JqZWN0LlxuICpcbiAqIFRoZSBvcGVyYXRvciBgYWRkYCBtZWFucyB0aGF0IHNvbWV0aGluZyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc2Vjb25kIG9iamVjdC4gYGRlbGV0ZWAgbWVhbnMgdGhhdCBzb21ldGhpbmcgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBzZWNvbmQgb2JqZWN0IGNvbXBhcmVkIHRvIHRoZSBmaXJzdCBvYmplY3QuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7RGlmZn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS9kaWZmLm1qcyc7XG4gKiBEaWZmKGEsIGIpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtEaWZmfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kYXRhL2RpZmYubWpzJztcbiAqXG4gKiAvLyBnaXZlbiBhcmUgdHdvIG9iamVjdHMgeCBhbmQgeS5cbiAqXG4gKiBsZXQgeCA9IHtcbiAqICAgICBhOiAxLFxuICogICAgIGI6IFwiSGVsbG8hXCJcbiAqIH1cbiAqXG4gKiAgbGV0IHkgPSB7XG4gKiAgICAgYTogMixcbiAqICAgICBjOiB0cnVlXG4gKiB9XG4gKlxuICogLy8gVGhlc2UgdHdvIG9iamVjdHMgY2FuIGJlIGNvbXBhcmVkIHdpdGggZWFjaCBvdGhlci5cbiAqXG4gKiBjb25zb2xlLmxvZyhEaWZmKHgsIHkpKTtcbiAqXG4gKiAvLyB0aGUgcmVzdWx0IGlzIHRoZW4gdGhlIGZvbGxvd2luZ1xuICpcbiAqIC8vXG4gKiAvLyBbXG4gKiAvLyB7XG4gKiAvLyAgICAgICAgb3BlcmF0b3I6ICd1cGRhdGUnLFxuICogLy8gICAgICAgIHBhdGg6IFsgJ2EnIF0sXG4gKiAvLyAgICAgICAgZmlyc3Q6IHsgdmFsdWU6IDEsIHR5cGU6ICdudW1iZXInIH0sXG4gKiAvLyAgICAgICAgc2Vjb25kOiB7IHZhbHVlOiAyLCB0eXBlOiAnbnVtYmVyJyB9XG4gKiAvLyAgICB9LFxuICogLy8ge1xuICogLy8gICAgICAgIG9wZXJhdG9yOiAnZGVsZXRlJyxcbiAqIC8vICAgICAgICBwYXRoOiBbICdiJyBdLFxuICogLy8gICAgICAgIGZpcnN0OiB7IHZhbHVlOiAnSGVsbG8hJywgdHlwZTogJ3N0cmluZycgfVxuICogLy8gICAgfSxcbiAqIC8vIHtcbiAqIC8vICAgICAgICBvcGVyYXRvcjogJ2FkZCcsXG4gKiAvLyAgICAgICAgcGF0aDogWyAnYycgXSxcbiAqIC8vICAgICAgICBzZWNvbmQ6IHsgdmFsdWU6IHRydWUsIHR5cGU6ICdib29sZWFuJyB9XG4gKiAvLyAgICB9XG4gKiAvLyBdXG4gKlxuICogQHBhcmFtIHsqfSBmaXJzdFxuICogQHBhcmFtIHsqfSBzZWNvbmRcbiAqIEByZXR1cm4ge2FycmF5fVxuICogQHNpbmNlIDEuNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRGF0YVxuICovXG5mdW5jdGlvbiBkaWZmKGZpcnN0LCBzZWNvbmQpIHtcbiAgICByZXR1cm4gZG9EaWZmKGZpcnN0LCBzZWNvbmQpXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBhXG4gKiBAcGFyYW0gYlxuICogQHBhcmFtIHR5cGVcbiAqIEByZXR1cm4ge1NldDxzdHJpbmc+fFNldDxudW1iZXI+fVxuICovXG5mdW5jdGlvbiBnZXRLZXlzKGEsIGIsIHR5cGUpIHtcbiAgICBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gYS5sZW5ndGggPiBiLmxlbmd0aCA/IG5ldyBBcnJheShhLmxlbmd0aCkgOiBuZXcgQXJyYXkoYi5sZW5ndGgpO1xuICAgICAgICBrZXlzLmZpbGwoMCk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KGtleXMubWFwKChfLCBpKSA9PiBpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZXQoT2JqZWN0LmtleXMoYSkuY29uY2F0KE9iamVjdC5rZXlzKGIpKSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBhXG4gKiBAcGFyYW0gYlxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBkaWZmXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gZG9EaWZmKGEsIGIsIHBhdGgsIGRpZmYpIHtcblxuICAgIGxldCB0eXBlQSA9IHR5cGVPZihhKVxuICAgIGxldCB0eXBlQiA9IHR5cGVPZihiKVxuXG4gICAgY29uc3QgY3VyclBhdGggPSBwYXRoIHx8IFtdO1xuICAgIGNvbnN0IGN1cnJEaWZmID0gZGlmZiB8fCBbXTtcblxuICAgIGlmICh0eXBlQSA9PT0gdHlwZUIgJiYgKHR5cGVBID09PSAnb2JqZWN0JyB8fCB0eXBlQSA9PT0nYXJyYXknKSkgeyBcblxuICAgICAgICBnZXRLZXlzKGEsIGIsIHR5cGVBKS5mb3JFYWNoKCh2KSA9PiB7XG5cbiAgICAgICAgICAgIGlmICghKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCB2KSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyRGlmZi5wdXNoKGJ1aWxkUmVzdWx0KGFbdl0sIGJbdl0sICdhZGQnLCBjdXJyUGF0aC5jb25jYXQodikpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIShPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgdikpKSB7XG4gICAgICAgICAgICAgICAgY3VyckRpZmYucHVzaChidWlsZFJlc3VsdChhW3ZdLCBiW3ZdLCAnZGVsZXRlJywgY3VyclBhdGguY29uY2F0KHYpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvRGlmZihhW3ZdLCBiW3ZdLCBjdXJyUGF0aC5jb25jYXQodiksIGN1cnJEaWZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIGNvbnN0IG8gPSBnZXRPcGVyYXRvcihhLCBiLCB0eXBlQSwgdHlwZUIpO1xuICAgICAgICBpZiAobyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjdXJyRGlmZi5wdXNoKGJ1aWxkUmVzdWx0KGEsIGIsIG8sIHBhdGgpKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJEaWZmO1xuXG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0b3JcbiAqIEBwYXJhbSB7YXJyYXl9IHBhdGhcbiAqIEByZXR1cm4ge3twYXRoOiBhcnJheSwgb3BlcmF0b3I6IHN0cmluZ319XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBidWlsZFJlc3VsdChhLCBiLCBvcGVyYXRvciwgcGF0aCkge1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgcGF0aCxcbiAgICB9O1xuXG4gICAgaWYgKG9wZXJhdG9yICE9PSAnYWRkJykge1xuICAgICAgICByZXN1bHQuZmlyc3QgPSB7XG4gICAgICAgICAgICB2YWx1ZTogYSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGVvZiBhXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGlzT2JqZWN0KGEpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpPy5jb25zdHJ1Y3Rvcj8ubmFtZTtcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZmlyc3QuaW5zdGFuY2UgPSBuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdG9yID09PSAnYWRkJyB8fCBvcGVyYXRvciA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgcmVzdWx0LnNlY29uZCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBiLFxuICAgICAgICAgICAgdHlwZTogdHlwZW9mIGJcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaXNPYmplY3QoYikpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYik/LmNvbnN0cnVjdG9yPy5uYW1lO1xuICAgICAgICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZWNvbmQuaW5zdGFuY2UgPSBuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOb3RFcXVhbChhLCBiKSB7XG5cbiAgICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gYS5nZXRUaW1lKCkgIT09IGIuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBhICE9PSBiO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0b3IoYSwgYikge1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9XG4gICAgICovXG4gICAgbGV0IG9wZXJhdG9yO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgdHlwZUEgPSB0eXBlb2YgYTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgbGV0IHR5cGVCID0gdHlwZW9mIGI7XG5cbiAgICBpZiAodHlwZUEgPT09ICd1bmRlZmluZWQnICYmIHR5cGVCICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcGVyYXRvciA9ICdhZGQnO1xuICAgIH0gZWxzZSBpZiAodHlwZUEgIT09ICd1bmRlZmluZWQnICYmIHR5cGVCID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcGVyYXRvciA9ICdkZWxldGUnO1xuICAgIH0gZWxzZSBpZiAoaXNOb3RFcXVhbChhLCBiKSkge1xuICAgICAgICBvcGVyYXRvciA9ICd1cGRhdGUnO1xuICAgIH1cblxuICAgIHJldHVybiBvcGVyYXRvcjtcblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7SUR9IGZyb20gXCIuLi90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7aXNPYmplY3R9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHt0cmltU3BhY2VzfVxuXG4vKipcbiAqIFRoaXMgc3BlY2lhbCB0cmltIGZ1bmN0aW9uIGFsbG93cyB0byB0cmltIHNwYWNlcyB0aGF0IGhhdmUgYmVlbiBwcm90ZWN0ZWQgYnkgYSBzcGVjaWFsIGVzY2FwZSBjaGFyYWN0ZXIuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dHJpbVNwYWNlc30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdXRpbC90cmltc3BhY2VzLm1qcyc7XG4gKiB0cmltU3BhY2VzKCcgaGVsbG8gXFxcXCAnKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqIFxuICogSGludDogT25lIHN0cm9rZSBpcyBlc2NhcGVkIGJ5IHRoZSBqYXZhc2NyaXB0IGludGVycHJldGVyLCB0aGUgc2Vjb25kIHN0cm9rZSBlc2NhcGVzIHRoZSBzdHJva2UuXG4gKiBcbiAqIGBgYHRleHRcbiAqIGFcXCBiICBcdTIxQTYgYSBiXG4gKiBhXFxcXCBiIFx1MjFBNiBhXFwgYlxuICogYGBgXG4gKiBcbiAqIEBzaW5jZSAxLjI0LjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlV0aWxcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKi9cbiBmdW5jdGlvbiB0cmltU3BhY2VzKHZhbHVlKSB7XG5cbiAgICB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cbiAgICBsZXQgcGxhY2Vob2xkZXIgPSBuZXcgTWFwO1xuICAgIGNvbnN0IHJlZ2V4ID0gLygoPzxwYXR0ZXJuPlxcXFwoPzxjaGFyPi4pKXsxfSkvbWlnO1xuXG4gICAgLy8gVGhlIHNlcGFyYXRvciBmb3IgYXJncyBtdXN0IGJlIGVzY2FwZWRcbiAgICAvLyB1bmRlZmluZWQgc3RyaW5nIHdoaWNoIHNob3VsZCBub3Qgb2NjdXIgbm9ybWFsbHkgYW5kIGlzIGFsc28gbm90IGEgcmVnZXhcbiAgICBsZXQgcmVzdWx0ID0gdmFsdWUubWF0Y2hBbGwocmVnZXgpXG5cbiAgICBmb3IgKGxldCBtIG9mIHJlc3VsdCkge1xuICAgICAgICBsZXQgZyA9IG0/LlsnZ3JvdXBzJ107XG4gICAgICAgIGlmICghaXNPYmplY3QoZykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHAgPSBnPy5bJ3BhdHRlcm4nXTtcbiAgICAgICAgbGV0IGMgPSBnPy5bJ2NoYXInXTtcblxuICAgICAgICBpZiAocCAmJiBjKSB7XG4gICAgICAgICAgICBsZXQgciA9ICdfXycgKyBuZXcgSUQoKS50b1N0cmluZygpICsgJ19fJztcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLnNldChyLCBjKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShwLCByKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgcGxhY2Vob2xkZXIuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoaywgJ1xcXFwnICsgdilcbiAgICB9KVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuXG59XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtnZXREb2N1bWVudCwgZ2V0V2luZG93LCBnZXREb2N1bWVudEZyYWdtZW50RnJvbVN0cmluZ31cblxuLyoqXG4gKiB0aGlzIG1ldGhvZCBmZXRjaGVzIHRoZSBkb2N1bWVudCBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtnZXREb2N1bWVudH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3V0aWwubWpzJztcbiAqIGNvbnNvbGUubG9nKGdldERvY3VtZW50KCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIGluIG5vZGVqcyB0aGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHBlcmZvcm1lZCB3aXRoIFtqc2RvbV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvanNkb20pLlxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtKU0RPTX0gZnJvbSBcImpzZG9tXCJcbiAqIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcIm9iamVjdFwiKSB7XG4gKiAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTSgnJywge1xuICogICAgICAgIHVybDogJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLFxuICogICAgICAgIHByZXRlbmRUb0JlVmlzdWFsOiB0cnVlXG4gKiAgICB9KTtcbiAqXG4gKiAgICBbXG4gKiAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICdkb2N1bWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50JyxcbiAqICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgJ0VsZW1lbnQnLFxuICogICAgICAgICdIVE1MRWxlbWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICdET01QYXJzZXInLFxuICogICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAqICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgJ0lucHV0RXZlbnQnLFxuICogICAgICAgICdDdXN0b21FdmVudCdcbiAqICAgIF0uZm9yRWFjaChrZXkgPT4gKGdldEdsb2JhbCgpW2tleV0gPSB3aW5kb3dba2V5XSkpO1xuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge29iamVjdH1cbiAqIEBzaW5jZSAxLjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHRocm93cyB7RXJyb3J9IG5vdCBzdXBwb3J0ZWQgZW52aXJvbm1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgbGV0IGRvY3VtZW50ID0gZ2V0R2xvYmFsKCk/LlsnZG9jdW1lbnQnXTtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3VwcG9ydGVkIGVudmlyb25tZW50XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGRvY3VtZW50O1xufVxuXG4vKipcbiAqIHRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIHdpbmRvdyBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtnZXRXaW5kb3d9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS91dGlsLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhnZXRXaW5kb3cobnVsbCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIGluIG5vZGVqcyB0aGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHBlcmZvcm1lZCB3aXRoIFtqc2RvbV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvanNkb20pLlxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtKU0RPTX0gZnJvbSBcImpzZG9tXCJcbiAqIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcIm9iamVjdFwiKSB7XG4gKiAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTSgnJywge1xuICogICAgICAgIHVybDogJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLFxuICogICAgICAgIHByZXRlbmRUb0JlVmlzdWFsOiB0cnVlXG4gKiAgICB9KTtcbiAqXG4gKiAgICBnZXRHbG9iYWwoKVsnd2luZG93J109d2luZG93O1xuICogXG4gKiAgICBbXG4gKiAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICdkb2N1bWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50JyxcbiAqICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgJ0VsZW1lbnQnLFxuICogICAgICAgICdIVE1MRWxlbWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICdET01QYXJzZXInLFxuICogICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAqICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgJ0lucHV0RXZlbnQnLFxuICogICAgICAgICdDdXN0b21FdmVudCdcbiAqICAgIF0uZm9yRWFjaChrZXkgPT4gKGdldEdsb2JhbCgpW2tleV0gPSB3aW5kb3dba2V5XSkpO1xuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge29iamVjdH1cbiAqIEBzaW5jZSAxLjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHRocm93cyB7RXJyb3J9IG5vdCBzdXBwb3J0ZWQgZW52aXJvbm1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIGxldCB3aW5kb3cgPSBnZXRHbG9iYWwoKT8uWyd3aW5kb3cnXTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHN1cHBvcnRlZCBlbnZpcm9ubWVudFwiKVxuICAgIH1cblxuICAgIHJldHVybiB3aW5kb3c7XG59XG5cblxuLyoqXG4gKiB0aGlzIG1ldGhvZCBmZXRjaGVzIHRoZSBkb2N1bWVudCBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtnZXREb2N1bWVudEZyYWdtZW50RnJvbVN0cmluZ30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3V0aWwubWpzJztcbiAqIGNvbnNvbGUubG9nKGdldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nKCc8ZGl2PjwvZGl2PicpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBpbiBub2RlanMgdGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSBwZXJmb3JtZWQgd2l0aCBbanNkb21dKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2pzZG9tKS5cbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7SlNET019IGZyb20gXCJqc2RvbVwiXG4gKiBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJvYmplY3RcIikge1xuICogICAgY29uc3Qge3dpbmRvd30gPSBuZXcgSlNET00oJycsIHtcbiAqICAgICAgICB1cmw6ICdodHRwOi8vZXhhbXBsZS5jb20vJyxcbiAqICAgICAgICBwcmV0ZW5kVG9CZVZpc3VhbDogdHJ1ZVxuICogICAgfSk7XG4gKlxuICogICAgW1xuICogICAgICAgICdzZWxmJyxcbiAqICAgICAgICAnZG9jdW1lbnQnLFxuICogICAgICAgICdEb2N1bWVudCcsXG4gKiAgICAgICAgJ05vZGUnLFxuICogICAgICAgICdFbGVtZW50JyxcbiAqICAgICAgICAnSFRNTEVsZW1lbnQnLFxuICogICAgICAgICdEb2N1bWVudEZyYWdtZW50JyxcbiAqICAgICAgICAnRE9NUGFyc2VyJyxcbiAqICAgICAgICAnWE1MU2VyaWFsaXplcicsXG4gKiAgICAgICAgJ05vZGVGaWx0ZXInLFxuICogICAgICAgICdJbnB1dEV2ZW50JyxcbiAqICAgICAgICAnQ3VzdG9tRXZlbnQnXG4gKiAgICBdLmZvckVhY2goa2V5ID0+IChnZXRHbG9iYWwoKVtrZXldID0gd2luZG93W2tleV0pKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50fVxuICogQHNpbmNlIDEuNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnRGcmFnbWVudEZyb21TdHJpbmcoaHRtbCkge1xuICAgIHZhbGlkYXRlU3RyaW5nKGh0bWwpO1xuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2lzQXJyYXksIGlzT2JqZWN0fSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge2dldERvY3VtZW50fSBmcm9tIFwiLi91dGlsLm1qc1wiO1xuXG5leHBvcnQge2ZpcmVFdmVudCwgZmlyZUN1c3RvbUV2ZW50LCBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudH1cblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gc2VuZHMgYW4gZXZlbnRcbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtmaXJlRXZlbnR9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9ldmVudHMubWpzJztcbiAqIGZpcmVFdmVudCgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQHNpbmNlIDEuMTAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQgb3IgSFRNTENvbGxlY3Rpb25cbiAqIEBzdW1tYXJ5IENvbnN0cnVjdCBhbmQgc2VuZCBhbmQgZXZlbnRcbiAqL1xuZnVuY3Rpb24gZmlyZUV2ZW50KGVsZW1lbnQsIHR5cGUpIHtcblxuICAgIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICAgZWxlbWVudC5jbGljaygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHZhbGlkYXRlU3RyaW5nKHR5cGUpLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCkge1xuICAgICAgICBmb3IgKGxldCBlIG9mIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGZpcmVFdmVudChlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBvciBIVE1MQ29sbGVjdGlvbicpXG4gICAgfVxuXG59XG5cbi8qKlxuICogWW91IGNhbiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBuZXcgTW9uc3Rlci5ET00uZmlyZUN1c3RvbUV2ZW50KClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2ZpcmVDdXN0b21FdmVudH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL2V2ZW50cy5tanMnO1xuICogZmlyZUN1c3RvbUV2ZW50KClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAc2luY2UgMS4yOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBvciBIVE1MQ29sbGVjdGlvblxuICogQHN1bW1hcnkgQ29uc3RydWN0IGFuZCBzZW5kIGFuZCBldmVudFxuICovXG5mdW5jdGlvbiBmaXJlQ3VzdG9tRXZlbnQoZWxlbWVudCwgdHlwZSwgZGV0YWlsKSB7XG5cbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG5cbiAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgaWYgKCFpc09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7ZGV0YWlsfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBldmVudCA9IG5ldyBDdXN0b21FdmVudCh2YWxpZGF0ZVN0cmluZyh0eXBlKSwge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCkge1xuICAgICAgICBmb3IgKGxldCBlIG9mIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGZpcmVDdXN0b21FdmVudChlLCB0eXBlLCBkZXRhaWwpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IG9yIEhUTUxDb2xsZWN0aW9uJylcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHBhdGggYEV2ZW50LmNvbXBvc2VkUGF0aCgpYCBmcm9tIGFuIGV2ZW50IGFuZCB0cmllcyB0byBmaW5kIHRoZSBuZXh0IGVsZW1lbnRcbiAqIHVwIHRoZSB0cmVlIGBlbGVtZW50LmNsb3Nlc3QoKWAgd2l0aCB0aGUgYXR0cmlidXRlIGFuZCB2YWx1ZS4gSWYgbm8gdmFsdWUsIG9yIGEgdmFsdWUgdGhhdCBpcyB1bmRlZmluZWQgb3IgbnVsbCxcbiAqIGlzIHNwZWNpZmllZCwgb25seSB0aGUgYXR0cmlidXRlIGlzIHNlYXJjaGVkLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2ZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vZXZlbnRzLm1qcyc7XG4gKiBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudCgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjE0LjBcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICogQHBhcmFtIHtzdHJpbmd8bnVsbHx1bmRlZmluZWR9IGF0dHJpYnV0ZVZhbHVlXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgZXZlbnRcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50XG4gKiBAc3VtbWFyeSBIZWxwIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGNvbnRyb2xcbiAqL1xuZnVuY3Rpb24gZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQoZXZlbnQsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShldmVudCwgRXZlbnQpO1xuXG4gICAgaWYgKHR5cGVvZiBldmVudC5jb21wb3NlZFBhdGggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBldmVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcblxuICAgIC8vIGNsb3Nlc3QgY2Fubm90IGJlIHVzZWQgaGVyZSwgYmVjYXVzZSBjbG9zZXN0IGlzIG5vdCBjb3JyZWN0IGZvciBzbG90dGVkIGVsZW1lbnRzXG4gICAgaWYgKGlzQXJyYXkocGF0aCkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBvID0gcGF0aFtpXTtcblxuICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICAgICAgICAgIG8uaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpXG4gICAgICAgICAgICAgICAgJiYgKGF0dHJpYnV0ZVZhbHVlID09PSB1bmRlZmluZWQgfHwgby5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgPT09IGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi4vdHlwZXMvYmFzZS5tanMnO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gJy4uL3R5cGVzL2dsb2JhbC5tanMnO1xuaW1wb3J0IHt2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfVEhFTUVfTkFNRSwgREVGQVVMVF9USEVNRX0gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQge1RoZW1lLCBnZXREb2N1bWVudFRoZW1lfVxuXG4vKipcbiAqIFRoZSBUaGVtZSBjbGFzcyBwcm92aWRlcyB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHRoZW1lLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1RoZW1lfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vdGhlbWUubWpzJztcbiAqIGNvbnNvbGUubG9nKG5ldyBUaGVtZSgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7Z2V0RG9jdW1lbnRUaGVtZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3RoZW1lLm1qcyc7XG4gKlxuICogY29uc3QgdGhlbWUgPSBnZXREb2N1bWVudFRoZW1lKCk7XG4gKiBjb25zb2xlLmxvZyh0aGVtZS5nZXROYW1lKCkpO1xuICogLy8gXHUyMUE2IG1vbnN0ZXJcbiAqXG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBzdW1tYXJ5IEEgdGhlbWUgY2xhc3NcbiAqL1xuY2xhc3MgVGhlbWUgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcobmFtZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG59XG5cbi8qKlxuICogVGhlIHRoZW1pbmcgdXNlZCBpbiB0aGUgZG9jdW1lbnQgY2FuIGJlIGRlZmluZWQgdmlhIHRoZSBodG1sLXRhZy5cbiAqIFRoZSB0aGVtaW5nIGlzIHNwZWNpZmllZCB2aWEgdGhlIGF0dHJpYnV0ZSBgZGF0YS1tb25zdGVyLXRoZW1lLW5hbWVgLlxuICpcbiAqIEFzIG5hbWUgZm9yIGEgdGhlbWUgYWxsIGNoYXJhY3RlcnMgYXJlIHZhbGlkLCB3aGljaCBhcmUgYWxzbyBhbGxvd2VkIGZvciBhIEhUTUxFbGVtZW50LUlELlxuICpcbiAqIGBgYFxuICogPGh0bWwgZGF0YS1tb25zdGVyLXRoZW1lLW5hbWU9XCJteS10aGVtZVwiPlxuICogYGBgXG4gKlxuICogdGhlIGRlZmF1bHQgdGhlbWUgbmFtZSBpcyBgbW9uc3RlcmAuXG4gKlxuICogQHJldHVybiB7VGhlbWV9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBzaW5jZSAxLjcuMFxuICovXG5mdW5jdGlvbiBnZXREb2N1bWVudFRoZW1lKCkge1xuICAgIGxldCBkb2N1bWVudCA9IGdldEdsb2JhbE9iamVjdCgnZG9jdW1lbnQnKTtcbiAgICBsZXQgbmFtZSA9IERFRkFVTFRfVEhFTUU7XG5cbiAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKTtcbiAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGxldCB0aGVtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FKTtcbiAgICAgICAgaWYgKHRoZW1lKSB7XG4gICAgICAgICAgICBuYW1lID0gdGhlbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRoZW1lKG5hbWUpO1xuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge2dldEdsb2JhbEZ1bmN0aW9uLCBnZXRHbG9iYWxPYmplY3R9IGZyb20gJy4uL3R5cGVzL2dsb2JhbC5tanMnO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfVEVNUExBVEVfUFJFRklYfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2dldERvY3VtZW50VGhlbWV9IGZyb20gXCIuL3RoZW1lLm1qc1wiO1xuXG5leHBvcnQge1RlbXBsYXRlfVxuXG4vKipcbiAqIFRoZSB0ZW1wbGF0ZSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBjcmVhdGluZyB0ZW1wbGF0ZXMuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7VGVtcGxhdGV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS90ZW1wbGF0ZS5tanMnO1xuICogbmV3IFRlbXBsYXRlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAc3VtbWFyeSBBIHRlbXBsYXRlIGNsYXNzXG4gKi9cbmNsYXNzIFRlbXBsYXRlIGV4dGVuZHMgQmFzZSB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGNvbnN0IEhUTUxUZW1wbGF0ZUVsZW1lbnQgPSBnZXRHbG9iYWxGdW5jdGlvbignSFRNTFRlbXBsYXRlRWxlbWVudCcpO1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKHRlbXBsYXRlLCBIVE1MVGVtcGxhdGVFbGVtZW50KTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9XG4gICAgICovXG4gICAgZ2V0VGVtcGxhdGVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0RvY3VtZW50RnJhZ21lbnR9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAgICAgKi9cbiAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBsb2FkcyBhIHRlbXBsYXRlIHdpdGggdGhlIGdpdmVuIElEIGFuZCByZXR1cm5zIGl0LlxuICpcbiAqIFRvIGRvIHRoaXMsIGl0IGZpcnN0IHJlYWRzIHRoZSB0aGVtZSBvZiB0aGUgZG9jdW1lbnQgYW5kIGxvb2tzIGZvciB0aGUgYGRhdGEtbW9uc3Rlci10aGVtZS1uYW1lYCBhdHRyaWJ1dGUgaW4gdGhlIEhUTUwgdGFnLlxuICpcbiAqIGBgYFxuICogPGh0bWwgZGF0YS1tb25zdGVyLXRoZW1lLW5hbWU9XCJteS10aGVtZVwiPlxuICogYGBgXG4gKlxuICogSWYgbm8gdGhlbWUgd2FzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdGhlbWUgaXMgYG1vbnN0ZXJgLlxuICpcbiAqIE5vdyBpdCBpcyBsb29rZWQgaWYgdGhlcmUgaXMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgdGhlbWUgYGlkLXRoZW1lYCBhbmQgaWYgeWVzIGl0IGlzIHJldHVybmVkLlxuICogSWYgdGhlcmUgaXMgbm8gdGVtcGxhdGUgYSBzZWFyY2ggZm9yIGEgdGVtcGxhdGUgd2l0aCB0aGUgZ2l2ZW4gSUQgYGlkYCBpcyBkb25lLiBJZiB0aGlzIGlzIGFsc28gbm90IGZvdW5kLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogWW91IGNhbiBjYWxsIHRoZSBtZXRob2QgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5ET00uZmluZERvY3VtZW50VGVtcGxhdGUoKWAuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7ZmluZFRlbXBsYXRlfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vdGVtcGxhdGUubWpzJztcbiAqIGZpbmREb2N1bWVudFRlbXBsYXRlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQgeyBmaW5kRG9jdW1lbnRUZW1wbGF0ZSB9IGZyb20gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vdGVtcGxhdGUubWpzXCI7XG4gKlxuICogY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gKiB0ZW1wbGF0ZS5pZCA9IFwibXlUZW1wbGF0ZVwiO1xuICogdGVtcGxhdGUuaW5uZXJIVE1MID0gXCI8cD5teSBkZWZhdWx0IHRlbXBsYXRlPC9wPlwiO1xuICogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wbGF0ZSk7XG4gKlxuICogY29uc3QgdGhlbWVkVGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gKiB0aGVtZWRUZW1wbGF0ZS5pZCA9IFwibXlUZW1wbGF0ZS1teVRoZW1lXCI7XG4gKiB0aGVtZWRUZW1wbGF0ZS5pbm5lckhUTUwgPSBcIjxwPm15IHRoZW1lZCB0ZW1wbGF0ZTwvcD5cIjtcbiAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhlbWVkVGVtcGxhdGUpO1xuICpcbiAqIC8vIGxvYWRzIHRoZSB0ZW1wbGUgYW5kIHNpbmNlIG5vIHRoZW1lIGlzIHNldCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZVxuICogY29uc3QgdGVtcGxhdGUxID0gZmluZERvY3VtZW50VGVtcGxhdGUoXCJteVRlbXBsYXRlXCIpO1xuICogY29uc29sZS5sb2codGVtcGxhdGUxLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gKiAvLyBcdTIxQTYgJzxwPm15IGRlZmF1bHQgdGVtcGxhdGU8L3A+J1xuICpcbiAqIC8vIG5vdyB3ZSBzZXQgb3VyIG93biB0aGVtZVxuICogZG9jdW1lbnRcbiAqIC5xdWVyeVNlbGVjdG9yKFwiaHRtbFwiKVxuICogLnNldEF0dHJpYnV0ZShcImRhdGEtbW9uc3Rlci10aGVtZS1uYW1lXCIsIFwibXlUaGVtZVwiKTtcbiAqXG4gKiAvLyBub3cgd2UgZG9uJ3QgZ2V0IHRoZSBkZWZhdWx0IHRlbXBsYXRlLFxuICogLy8gYnV0IHRoZSB0ZW1wbGF0ZSB3aXRoIHRoZSB0aGVtZSBpbiB0aGUgaWRcbiAqIGNvbnN0IHRlbXBsYXRlMiA9IGZpbmREb2N1bWVudFRlbXBsYXRlKFwibXlUZW1wbGF0ZVwiKTtcbiAqIGNvbnNvbGUubG9nKHRlbXBsYXRlMi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICogLy8gXHUyMUE2ICc8cD5teSB0aGVtZWQgdGVtcGxhdGU8L3A+J1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICogQHBhcmFtIHtOb2RlfSBjdXJyZW50Tm9kZVxuICogQHJldHVybiB7TW9uc3Rlci5ET00uVGVtcGxhdGV9XG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0aHJvd3Mge0Vycm9yfSB0ZW1wbGF0ZSBpZCBub3QgZm91bmQuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZERvY3VtZW50VGVtcGxhdGUoaWQsIGN1cnJlbnROb2RlKSB7XG4gICAgdmFsaWRhdGVTdHJpbmcoaWQpO1xuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXRHbG9iYWxPYmplY3QoJ2RvY3VtZW50Jyk7XG4gICAgY29uc3QgSFRNTFRlbXBsYXRlRWxlbWVudCA9IGdldEdsb2JhbEZ1bmN0aW9uKCdIVE1MVGVtcGxhdGVFbGVtZW50Jyk7XG4gICAgY29uc3QgRG9jdW1lbnRGcmFnbWVudCA9IGdldEdsb2JhbEZ1bmN0aW9uKCdEb2N1bWVudEZyYWdtZW50Jyk7XG4gICAgY29uc3QgRG9jdW1lbnQgPSBnZXRHbG9iYWxGdW5jdGlvbignRG9jdW1lbnQnKTtcblxuXG4gICAgbGV0IHByZWZpeElEO1xuXG4gICAgaWYgKCEoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpKSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgTm9kZSkge1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9URU1QTEFURV9QUkVGSVgpKSB7XG4gICAgICAgICAgICAgICAgcHJlZml4SUQgPSBjdXJyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1RFTVBMQVRFX1BSRUZJWClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRSb290Tm9kZSgpO1xuXG4gICAgICAgICAgICBpZiAoIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBkb2N1bWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0ZW1wbGF0ZTtcbiAgICBsZXQgdGhlbWUgPSBnZXREb2N1bWVudFRoZW1lKClcblxuICAgIGlmIChwcmVmaXhJRCkge1xuICAgICAgICBsZXQgdGhlbWVkUHJlZml4SUQgPSBwcmVmaXhJRCArICctJyArIGlkICsgJy0nICsgdGhlbWUuZ2V0TmFtZSgpO1xuXG4gICAgICAgIC8vIGN1cnJlbnQgKyB0aGVtZWRQcmVmaXhJRFxuICAgICAgICB0ZW1wbGF0ZSA9IGN1cnJlbnROb2RlLmdldEVsZW1lbnRCeUlkKHRoZW1lZFByZWZpeElEKTtcbiAgICAgICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkb2N1bWVudCArIHRoZW1lZFByZWZpeElEXG4gICAgICAgIHRlbXBsYXRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhlbWVkUHJlZml4SUQpO1xuICAgICAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0aGVtZWRJRCA9IGlkICsgJy0nICsgdGhlbWUuZ2V0TmFtZSgpO1xuXG4gICAgLy8gY3VycmVudCArIHRoZW1lZElEXG4gICAgdGVtcGxhdGUgPSBjdXJyZW50Tm9kZS5nZXRFbGVtZW50QnlJZCh0aGVtZWRJRCk7XG4gICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICAvLyBkb2N1bWVudCArIHRoZW1lZElEXG4gICAgdGVtcGxhdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGVtZWRJRCk7XG4gICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICAvLyBjdXJyZW50ICsgSURcbiAgICB0ZW1wbGF0ZSA9IGN1cnJlbnROb2RlLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGVtcGxhdGUpO1xuICAgIH1cblxuICAgIC8vIGRvY3VtZW50ICsgSURcbiAgICB0ZW1wbGF0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGVtcGxhdGUpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcInRlbXBsYXRlIFwiICsgaWQgKyBcIiBub3QgZm91bmQuXCIpXG59XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtkaWZmfSBmcm9tIFwiLi4vZGF0YS9kaWZmLm1qc1wiO1xuaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tIFwiLi4vZGF0YS9wYXRoZmluZGVyLm1qc1wiO1xuaW1wb3J0IHtQaXBlfSBmcm9tIFwiLi4vZGF0YS9waXBlLm1qc1wiO1xuaW1wb3J0IHtcbiAgICBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuICAgIEFUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVMsXG4gICAgQVRUUklCVVRFX1VQREFURVJfQklORCxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlQsXG4gICAgQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9SRU1PVkUsXG4gICAgQVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9TRUxFQ1RfVEhJU1xufSBmcm9tIFwiLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7aXNBcnJheSwgaXNJbnN0YW5jZSwgaXNJdGVyYWJsZX0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uL3R5cGVzL29ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHtQcm94eU9ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVBcnJheSwgdmFsaWRhdGVJbnN0YW5jZX0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtjbG9uZX0gZnJvbSBcIi4uL3V0aWwvY2xvbmUubWpzXCI7XG5pbXBvcnQge3RyaW1TcGFjZXN9IGZyb20gXCIuLi91dGlsL3RyaW1zcGFjZXMubWpzXCI7XG5pbXBvcnQge2ZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50fSBmcm9tIFwiLi9ldmVudHMubWpzXCI7XG5pbXBvcnQge2ZpbmREb2N1bWVudFRlbXBsYXRlfSBmcm9tIFwiLi90ZW1wbGF0ZS5tanNcIjtcbmltcG9ydCB7Z2V0RG9jdW1lbnR9IGZyb20gXCIuL3V0aWwubWpzXCI7XG5cbmV4cG9ydCB7VXBkYXRlcn1cblxuLyoqXG4gKiBUaGUgdXBkYXRlciBjbGFzcyBjb25uZWN0cyBhbiBvYmplY3Qgd2l0aCB0aGUgZG9tLiBJbiB0aGlzIHdheSwgc3RydWN0dXJlcyBhbmQgY29udGVudHMgaW4gdGhlIERPTSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBhZGFwdGVkIHZpYSBhdHRyaWJ1dGVzLlxuICpcbiAqIEZvciBleGFtcGxlLCB0byBpbmNsdWRlIGEgc3RyaW5nIGZyb20gYW4gb2JqZWN0LCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItcmVwbGFjZWAgY2FuIGJlIHVzZWQuXG4gKiBhIGZ1cnRoZXIgZXhwbGFuYXRpb24gY2FuIGJlIGZvdW5kIHVuZGVyIHtAdHV0b3JpYWwgZG9tLWJhc2VkLXRlbXBsYXRpbmctaW1wbGVtZW50YXRpb259LlxuICpcbiAqIENoYW5nZXMgdG8gYXR0cmlidXRlcyBhcmUgbWFkZSBvbmx5IHdoZW4gdGhlIGRpcmVjdCB2YWx1ZXMgYXJlIGNoYW5nZWQuIElmIHlvdSB3YW50IHRvIGFzc2lnbiBjaGFuZ2VzIHRvIG90aGVyIHZhbHVlc1xuICogYXMgd2VsbCwgeW91IGhhdmUgdG8gaW5zZXJ0IHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1zZWxlY3QtdGhpc2AuIFRoaXMgc2hvdWxkIGJlIGRvbmUgd2l0aCBjYXJlLCBhcyBpdCBjYW4gcmVkdWNlIHBlcmZvcm1hbmNlLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1VwZGF0ZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS91cGRhdGVyLm1qcyc7XG4gKiBuZXcgVXBkYXRlcigpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtVcGRhdGVyfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vdXBkYXRlci5tanMnO1xuICpcbiAqIC8vIEZpcnN0IHdlIHByZXBhcmUgdGhlIGh0bWwgZG9jdW1lbnQuXG4gKiAvLyBUaGlzIGlzIGRvbmUgaGVyZSB2aWEgc2NyaXB0LCBidXQgY2FuIGFsc28gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1lbnQgYXMgcHVyZSBodG1sLlxuICogLy8gVG8gZG8gdGhpcywgc2ltcGx5IGluc2VydCB0aGUgdGFnIDxoMSBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6aGVhZGxpbmVcIj48L2gxPi5cbiAqIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG4gKiBjb25zdCBoZWFkbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gxJyk7XG4gKiBoZWFkbGluZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci1yZXBsYWNlJywncGF0aDpoZWFkbGluZScpXG4gKiBib2R5LmFwcGVuZENoaWxkKGhlYWRsaW5lKTtcbiAqXG4gKiAvLyB0aGUgZGF0YSBzdHJ1Y3R1cmVcbiAqIGxldCBvYmogPSB7XG4gKiAgICBoZWFkbGluZTogXCJIZWxsbyBXb3JsZFwiLFxuICogfTtcbiAqXG4gKiAvLyBOb3cgY29tZXMgdGhlIHJlYWwgbWFnaWMuIHdlIHBhc3MgdGhlIHVwZGF0ZXIgdGhlIHBhcmVudCBIVE1MRWxlbWVudFxuICogLy8gYW5kIHRoZSBkZXNpcmVkIGRhdGEgc3RydWN0dXJlLlxuICogY29uc3QgdXBkYXRlciA9IG5ldyBVcGRhdGVyKGJvZHksIG9iaik7XG4gKiB1cGRhdGVyLnJ1bigpO1xuICpcbiAqIC8vIE5vdyB5b3UgY2FuIGNoYW5nZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIHRoZSBIVE1MIHdpbGwgZm9sbG93IHRoZXNlIGNoYW5nZXMuXG4gKiBjb25zdCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG4gKiBzdWJqZWN0WydoZWFkbGluZSddID0gXCJIZWxsbyBXb3JsZCFcIlxuICpcbiAqIEBzaW5jZSAxLjguMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHRocm93cyB7RXJyb3J9IHRoZSB2YWx1ZSBpcyBub3QgaXRlcmFibGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBwaXBlcyBhcmUgbm90IGFsbG93ZWQgd2hlbiBjbG9uaW5nIGEgbm9kZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBubyB0ZW1wbGF0ZSB3YXMgZm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgbWF4aW11bSBkZXB0aCBmb3IgdGhlIHJlY3Vyc2lvbiBpcyByZWFjaGVkLlxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50XG4gKiBAc3VtbWFyeSBUaGUgdXBkYXRlciBjbGFzcyBjb25uZWN0cyBhbiBvYmplY3Qgd2l0aCB0aGUgZG9tXG4gKi9cbmNsYXNzIFVwZGF0ZXIgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqIEBzaW5jZSAxLjguMFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdHxQcm94eU9ic2VydmVyfHVuZGVmaW5lZH0gc3ViamVjdFxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnRcbiAgICAgKiBAc2VlIHtAbGluayBNb25zdGVyLkRPTS5maW5kRG9jdW1lbnRUZW1wbGF0ZX1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdWJqZWN0KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICAgICAgICovXG4gICAgICAgIGlmIChzdWJqZWN0ID09PSB1bmRlZmluZWQpIHN1YmplY3QgPSB7fVxuICAgICAgICBpZiAoIWlzSW5zdGFuY2Uoc3ViamVjdCwgUHJveHlPYnNlcnZlcikpIHtcbiAgICAgICAgICAgIHN1YmplY3QgPSBuZXcgUHJveHlPYnNlcnZlcihzdWJqZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdID0ge1xuICAgICAgICAgICAgZWxlbWVudDogdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCksXG4gICAgICAgICAgICBsYXN0OiB7fSxcbiAgICAgICAgICAgIGNhbGxiYWNrczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgZXZlbnRUeXBlczogWydrZXl1cCcsICdjbGljaycsICdjaGFuZ2UnLCAnZHJvcCcsICd0b3VjaGVuZCcsICdpbnB1dCddLFxuICAgICAgICAgICAgc3ViamVjdDogc3ViamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uY2FsbGJhY2tzLnNldCgnY2hlY2tzdGF0ZScsIGdldENoZWNrU3RhdGVDYWxsYmFjay5jYWxsKHRoaXMpKTtcblxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcigoKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFJlYWxTdWJqZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpZmZSZXN1bHQgPSBkaWZmKHRoaXNbaW50ZXJuYWxTeW1ib2xdLmxhc3QsIHMpXG4gICAgICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5sYXN0ID0gY2xvbmUocyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgWywgY2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyhkaWZmUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQuY2FsbCh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIGluc2VydEVsZW1lbnQuY2FsbCh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRlbnQuY2FsbCh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMuY2FsbCh0aGlzLCBjaGFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0czogJ2tleXVwJywgJ2NsaWNrJywgJ2NoYW5nZScsICdkcm9wJywgJ3RvdWNoZW5kJ1xuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZGUvZG9jcy9XZWIvRXZlbnRzfVxuICAgICAqIEBzaW5jZSAxLjkuMFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHR5cGVzXG4gICAgICogQHJldHVybiB7VXBkYXRlcn1cbiAgICAgKi9cbiAgICBzZXRFdmVudFR5cGVzKHR5cGVzKSB7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmV2ZW50VHlwZXMgPSB2YWxpZGF0ZUFycmF5KHR5cGVzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2l0aCB0aGlzIG1ldGhvZCwgdGhlIGV2ZW50bGlzdGVuZXJzIGFyZSBob29rZWQgaW4gYW5kIHRoZSBtYWdpYyBiZWdpbnMuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiB1cGRhdGVyLnJ1bigpLnRoZW4oKCkgPT4ge1xuICAgICAqICAgdXBkYXRlci5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjkuMFxuICAgICAqIEByZXR1cm4ge1VwZGF0ZXJ9XG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBiaW5kIGFyZ3VtZW50IG11c3Qgc3RhcnQgYXMgYSB2YWx1ZSB3aXRoIGEgcGF0aFxuICAgICAqL1xuICAgIGVuYWJsZUV2ZW50UHJvY2Vzc2luZygpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlRXZlbnRQcm9jZXNzaW5nKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmV2ZW50VHlwZXMpIHtcbiAgICAgICAgICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXJcbiAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBnZXRDb250cm9sRXZlbnRIYW5kbGVyLmNhbGwodGhpcyksIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB0dXJucyBvZmYgdGhlIG1hZ2ljIG9yIHdobyBsb3ZlcyBpdCBtb3JlIHByb2ZhbmUgaXQgcmVtb3ZlcyB0aGUgZXZlbnRMaXN0ZW5lci5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjkuMFxuICAgICAqIEByZXR1cm4ge1VwZGF0ZXJ9XG4gICAgICovXG4gICAgZGlzYWJsZUV2ZW50UHJvY2Vzc2luZygpIHtcblxuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZXZlbnRUeXBlcykge1xuICAgICAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGdldENvbnRyb2xFdmVudEhhbmRsZXIuY2FsbCh0aGlzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBydW4gbWV0aG9kIG11c3QgYmUgY2FsbGVkIGZvciB0aGUgdXBkYXRlIHRvIHN0YXJ0IHdvcmtpbmcuXG4gICAgICogVGhlIG1ldGhvZCBlbnN1cmVzIHRoYXQgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiB1cGRhdGVyLnJ1bigpLnRoZW4oKCkgPT4ge1xuICAgICAqICAgdXBkYXRlci5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBzdW1tYXJ5IExldCB0aGUgbWFnaWMgYmVnaW5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHJ1bigpIHtcbiAgICAgICAgLy8gdGhlIGtleSBfX2luaXRfX2hhcyBubyBmdXJ0aGVyIG1lYW5pbmcgYW5kIGlzIG9ubHkgXG4gICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlIHRoZSBkaWZmIGZvciBlbXB0eSBvYmplY3RzLlxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5sYXN0ID0geydfX2luaXRfXyc6IHRydWV9O1xuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5ub3RpZnlPYnNlcnZlcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZXMgb2YgYm91bmQgZWxlbWVudHMgYW5kIGNoYW5nZXMgdGhlbSBpbiBzdWJqZWN0XG4gICAgICpcbiAgICAgKiBAc2luY2UgMS4yNy4wXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uVXBkYXRlcn1cbiAgICAgKi9cbiAgICByZXRyaWV2ZSgpIHtcbiAgICAgICAgcmV0cmlldmVGcm9tQmluZGluZ3MuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgeW91IGhhdmUgcGFzc2VkIGEgUHJveHlPYnNlcnZlciBpbiB0aGUgY29uc3RydWN0b3IsIHlvdSB3aWxsIGdldCB0aGUgb2JqZWN0IHRoYXQgdGhlIFByb3h5T2JzZXJ2ZXIgbWFuYWdlcyBoZXJlLlxuICAgICAqIEhvd2V2ZXIsIGlmIHlvdSBwYXNzZWQgYSBzaW1wbGUgb2JqZWN0LCBoZXJlIHlvdSB3aWxsIGdldCBhIHByb3h5IGZvciB0aGF0IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEZvciBjaGFuZ2VzIHRoZSBQcm94eU9ic2VydmVyIG11c3QgYmUgdXNlZC5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjguMFxuICAgICAqIEByZXR1cm4ge1Byb3h5fVxuICAgICAqL1xuICAgIGdldFN1YmplY3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFN1YmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBjb21tYW5kcyB0aGF0IGNhbiBiZSBjYWxsZWQgdmlhIGNhbGw6IGluc3RydWN0aW9uLlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHBpcGUgd2l0aCBpdHMgb3duIGZ1bmN0aW9uYWxpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHJldHVybnMge1RyYW5zZm9ybWVyfVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBmdW5jdGlvblxuICAgICAqL1xuICAgIHNldENhbGxiYWNrKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmNhbGxiYWNrcy5zZXQobmFtZSwgY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuOS4wXG4gKiBAcmV0dXJuIHtmdW5jdGlvblxuICogQHRoaXMgVXBkYXRlclxuICovXG5mdW5jdGlvbiBnZXRDaGVja1N0YXRlQ2FsbGJhY2soKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGN1cnJlbnQpIHtcblxuICAgICAgICAvLyB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG9iamVjdCAodGhlcmVmb3JlIG5vIGFycmF5IGZ1bmN0aW9uIGhlcmUpXG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKFsncmFkaW8nLCAnY2hlY2tib3gnXS5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlICsgXCJcIiA9PT0gY3VycmVudCArIFwiXCIpID8gJ3RydWUnIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIEhUTUxPcHRpb25FbGVtZW50KSB7XG5cbiAgICAgICAgICAgIGlmIChpc0FycmF5KGN1cnJlbnQpICYmIGN1cnJlbnQuaW5kZXhPZih0aGlzLnZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RydWUnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgc3ltYm9sID0gU3ltYm9sKCdFdmVudEhhbmRsZXInKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAdGhpcyBVcGRhdGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGJpbmQgYXJndW1lbnQgbXVzdCBzdGFydCBhcyBhIHZhbHVlIHdpdGggYSBwYXRoXG4gKi9cbmZ1bmN0aW9uIGdldENvbnRyb2xFdmVudEhhbmRsZXIoKSB7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmIChzZWxmW3N5bWJvbF0pIHtcbiAgICAgICAgcmV0dXJuIHNlbGZbc3ltYm9sXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGJpbmQgYXJndW1lbnQgbXVzdCBzdGFydCBhcyBhIHZhbHVlIHdpdGggYSBwYXRoLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgICAqL1xuICAgIHNlbGZbc3ltYm9sXSA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQoZXZlbnQsIEFUVFJJQlVURV9VUERBVEVSX0JJTkQpO1xuXG4gICAgICAgIGlmIChlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHJpZXZlQW5kU2V0VmFsdWUuY2FsbChzZWxmLCBlbGVtZW50KTtcblxuICAgIH1cblxuICAgIHJldHVybiBzZWxmW3N5bWJvbF07XG5cblxufVxuXG4vKipcbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgYmluZCBhcmd1bWVudCBtdXN0IHN0YXJ0IGFzIGEgdmFsdWUgd2l0aCBhIHBhdGhcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZXRyaWV2ZUFuZFNldFZhbHVlKGVsZW1lbnQpIHtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc3QgcGF0aGZpbmRlciA9IG5ldyBQYXRoZmluZGVyKHNlbGZbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuZ2V0U3ViamVjdCgpKTtcblxuICAgIGxldCBwYXRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfQklORCk7XG5cbiAgICBpZiAocGF0aC5pbmRleE9mKCdwYXRoOicpICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIGJpbmQgYXJndW1lbnQgbXVzdCBzdGFydCBhcyBhIHZhbHVlIHdpdGggYSBwYXRoJyk7XG4gICAgfVxuXG4gICAgcGF0aCA9IHBhdGguc3Vic3RyKDUpO1xuXG4gICAgbGV0IHZhbHVlO1xuXG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG5cbiAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIHZhbHVlID0gZWxlbWVudC52YWx1ZTtcblxuICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB7XG5cbiAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NlbGVjdC1vbmUnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlbGVjdC1tdWx0aXBsZSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBlbGVtZW50Py5zZWxlY3RlZE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSBvcHRpb246Y2hlY2tlZFwiKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEFycmF5LmZyb20ob3B0aW9ucykubWFwKCh7dmFsdWV9KSA9PiB2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdmFsdWVzIGZyb20gY3VzdG9tZWxlbWVudHMgXG4gICAgfSBlbHNlIGlmICgoZWxlbWVudD8uY29uc3RydWN0b3I/LnByb3RvdHlwZSAmJiAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICd2YWx1ZScpPy5bJ2dldCddKSB8fCBlbGVtZW50Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICAgIHZhbHVlID0gZWxlbWVudD8uWyd2YWx1ZSddO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIG9iamVjdFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3B5ID0gY2xvbmUoc2VsZltpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5nZXRSZWFsU3ViamVjdCgpKTtcbiAgICBjb25zdCBwZiA9IG5ldyBQYXRoZmluZGVyKGNvcHkpO1xuICAgIHBmLnNldFZpYShwYXRoLCB2YWx1ZSk7XG5cbiAgICBjb25zdCBkaWZmUmVzdWx0ID0gZGlmZihjb3B5LCBzZWxmW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFJlYWxTdWJqZWN0KCkpO1xuXG4gICAgaWYgKGRpZmZSZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICBwYXRoZmluZGVyLnNldFZpYShwYXRoLCB2YWx1ZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBzaW5jZSAxLjI3LjBcbiAqIEByZXR1cm4gdm9pZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmV0cmlldmVGcm9tQmluZGluZ3MoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoc2VsZltpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5tYXRjaGVzKCdbJyArIEFUVFJJQlVURV9VUERBVEVSX0JJTkQgKyAnXScpKSB7XG4gICAgICAgIHJldHJpZXZlQW5kU2V0VmFsdWUuY2FsbChzZWxmLCBlbGVtZW50KVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgWywgZWxlbWVudF0gb2Ygc2VsZltpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIEFUVFJJQlVURV9VUERBVEVSX0JJTkQgKyAnXScpLmVudHJpZXMoKSkge1xuICAgICAgICByZXRyaWV2ZUFuZFNldFZhbHVlLmNhbGwoc2VsZiwgZWxlbWVudClcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuOC4wXG4gKiBAcGFyYW0ge29iamVjdH0gY2hhbmdlXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiByZW1vdmVFbGVtZW50KGNoYW5nZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgZm9yIChjb25zdCBbLCBlbGVtZW50XSBvZiBzZWxmW2ludGVybmFsU3ltYm9sXS5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSBbJyArIEFUVFJJQlVURV9VUERBVEVSX1JFTU9WRSArICddJykuZW50cmllcygpKSB7XG4gICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjguMFxuICogQHBhcmFtIHtvYmplY3R9IGNoYW5nZVxuICogQHJldHVybiB7dm9pZH1cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgdmFsdWUgaXMgbm90IGl0ZXJhYmxlXG4gKiBAdGhyb3dzIHtFcnJvcn0gcGlwZXMgYXJlIG5vdCBhbGxvd2VkIHdoZW4gY2xvbmluZyBhIG5vZGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm8gdGVtcGxhdGUgd2FzIGZvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG1heGltdW0gZGVwdGggZm9yIHRoZSByZWN1cnNpb24gaXMgcmVhY2hlZC5cbiAqIEB0aGlzIFVwZGF0ZXJcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0RWxlbWVudChjaGFuZ2UpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBzdWJqZWN0ID0gc2VsZltpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5nZXRSZWFsU3ViamVjdCgpO1xuICAgIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblxuICAgIGxldCBtZW0gPSBuZXcgV2Vha1NldDtcbiAgICBsZXQgd2QgPSAwO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gc2VsZltpbnRlcm5hbFN5bWJvbF0uZWxlbWVudDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICB3ZCsrO1xuXG4gICAgICAgIGxldCBwID0gY2xvbmUoY2hhbmdlPy5bJ3BhdGgnXSk7XG4gICAgICAgIGlmICghaXNBcnJheShwKSkgcmV0dXJuIHNlbGY7XG5cbiAgICAgICAgd2hpbGUgKHAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHAuam9pbignLicpO1xuXG4gICAgICAgICAgICBsZXQgaXRlcmF0b3IgPSBuZXcgU2V0O1xuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSAnWycgKyBBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlQgKyAnKj1cInBhdGg6JyArIGN1cnJlbnQgKyAnXCJdJztcblxuICAgICAgICAgICAgY29uc3QgZSA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KTtcblxuICAgICAgICAgICAgaWYgKGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgWy4uLmVdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLm1hdGNoZXMocXVlcnkpKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IuYWRkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgWywgY29udGFpbmVyRWxlbWVudF0gb2YgaXRlcmF0b3IuZW50cmllcygpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVtLmhhcyhjb250YWluZXJFbGVtZW50KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbWVtLmFkZChjb250YWluZXJFbGVtZW50KVxuXG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGNvbnRhaW5lckVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVCk7XG4gICAgICAgICAgICAgICAgbGV0IGRlZiA9IHRyaW1TcGFjZXMoYXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBkZWYuaW5kZXhPZignICcpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0cmltU3BhY2VzKGRlZi5zdWJzdHIoMCwgaSkpO1xuICAgICAgICAgICAgICAgIGxldCByZWZQcmVmaXggPSBrZXkgKyAnLSc7XG4gICAgICAgICAgICAgICAgbGV0IGNtZCA9IHRyaW1TcGFjZXMoZGVmLnN1YnN0cihpKSk7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UgaXMgYWN0dWFsbHkgZXhjbHVkZWQgYnkgdGhlIHF1ZXJ5IGJ1dCBpcyBuZXZlcnRoZWxlc3MgY2hlY2tlZCBhZ2FpbiBoZXJlXG4gICAgICAgICAgICAgICAgaWYgKGNtZC5pbmRleE9mKCd8JykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInBpcGVzIGFyZSBub3QgYWxsb3dlZCB3aGVuIGNsb25pbmcgYSBub2RlLlwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgcGlwZSA9IG5ldyBQaXBlKGNtZCk7XG4gICAgICAgICAgICAgICAgc2VsZltpbnRlcm5hbFN5bWJvbF0uY2FsbGJhY2tzLmZvckVhY2goKGYsIG4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGlwZS5zZXRDYWxsYmFjayhuLCBmKTtcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGlwZS5ydW4oc3ViamVjdClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGRhdGFQYXRoID0gY21kLnNwbGl0KCc6JykucG9wKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgaW5zZXJ0UG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFBvaW50ID0gY29udGFpbmVyRWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSB2YWx1ZSBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYXZhaWxhYmxlID0gbmV3IFNldDtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ksIG9ial0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZQcmVmaXggKyBpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudFBhdGggPSBkYXRhUGF0aCArIFwiLlwiICsgaTtcblxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuYWRkKHJlZik7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWZFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbJyArIEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0UgKyAnPVwiJyArIHJlZiArICdcIl0nKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVmRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRQb2ludCA9IHJlZkVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZE5ld0RvY3VtZW50RnJhZ21lbnQoY29udGFpbmVyRWxlbWVudCwga2V5LCByZWYsIGN1cnJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbm9kZXMgPSBjb250YWluZXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSArICcqPVwiJyArIHJlZlByZWZpeCArICdcIl0nKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFssIG5vZGVdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZS5oYXMobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgKGNvbnRhaW5lckVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpICsgXCIsIFwiICsgZS5tZXNzYWdlKS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHAucG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm91bmQgPT09IGZhbHNlKSBicmVhaztcbiAgICAgICAgaWYgKHdkKysgPiAyMDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIG1heGltdW0gZGVwdGggZm9yIHRoZSByZWN1cnNpb24gaXMgcmVhY2hlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG5cbn1cblxuLyoqXG4gKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjguMFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHRocm93cyB7RXJyb3J9IG5vIHRlbXBsYXRlIHdhcyBmb3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICovXG5mdW5jdGlvbiBhcHBlbmROZXdEb2N1bWVudEZyYWdtZW50KGNvbnRhaW5lciwga2V5LCByZWYsIHBhdGgpIHtcblxuICAgIGxldCB0ZW1wbGF0ZSA9IGZpbmREb2N1bWVudFRlbXBsYXRlKGtleSwgY29udGFpbmVyKTtcblxuICAgIGxldCBub2RlcyA9IHRlbXBsYXRlLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBmb3IgKGNvbnN0IFssIG5vZGVdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGVzLmNoaWxkTm9kZXMpKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblxuICAgICAgICAgICAgYXBwbHlSZWN1cnNpdmUobm9kZSwga2V5LCBwYXRoKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0UsIHJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS4xMC4wXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXBwbHlSZWN1cnNpdmUobm9kZSwga2V5LCBwYXRoKSB7XG5cbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UpKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9SRVBMQUNFKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UsIHZhbHVlLnJlcGxhY2VBbGwoXCJwYXRoOlwiICsga2V5LCBcInBhdGg6XCIgKyBwYXRoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFUykpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVMpO1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFUywgdmFsdWUucmVwbGFjZUFsbChcInBhdGg6XCIgKyBrZXksIFwicGF0aDpcIiArIHBhdGgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgWywgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUuY2hpbGROb2RlcykpIHtcbiAgICAgICAgICAgIGFwcGx5UmVjdXJzaXZlKGNoaWxkLCBrZXksIHBhdGgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS44LjBcbiAqIEBwYXJhbSB7b2JqZWN0fSBjaGFuZ2VcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAdGhpcyBVcGRhdGVyXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoY2hhbmdlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgc3ViamVjdCA9IHNlbGZbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuZ2V0UmVhbFN1YmplY3QoKTtcblxuICAgIGxldCBwID0gY2xvbmUoY2hhbmdlPy5bJ3BhdGgnXSk7XG4gICAgcnVuVXBkYXRlQ29udGVudC5jYWxsKHRoaXMsIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmVsZW1lbnQsIHAsIHN1YmplY3QpO1xuXG4gICAgY29uc3Qgc2xvdHMgPSB0aGlzW2ludGVybmFsU3ltYm9sXS5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3Nsb3QnKTtcbiAgICBpZiAoc2xvdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IFssIHNsb3RdIG9mIE9iamVjdC5lbnRyaWVzKHNsb3RzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyhzbG90LmFzc2lnbmVkTm9kZXMoKSkpIHtcbiAgICAgICAgICAgICAgICBydW5VcGRhdGVDb250ZW50LmNhbGwodGhpcywgZWxlbWVudCwgcCwgc3ViamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS44LjBcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lclxuICogQHBhcmFtIHthcnJheX0gcGFydHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdWJqZWN0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBydW5VcGRhdGVDb250ZW50KGNvbnRhaW5lciwgcGFydHMsIHN1YmplY3QpIHtcbiAgICBpZiAoIWlzQXJyYXkocGFydHMpKSByZXR1cm47XG4gICAgaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSByZXR1cm47XG4gICAgcGFydHMgPSBjbG9uZShwYXJ0cyk7XG5cbiAgICBsZXQgbWVtID0gbmV3IFdlYWtTZXQ7XG5cbiAgICB3aGlsZSAocGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcGFydHMuam9pbignLicpO1xuICAgICAgICBwYXJ0cy5wb3AoKTtcblxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzdGF0aWMgZGF0YSBpcyBhbHdheXMgY2hhbmdlZCBhcyB3ZWxsLCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVhY3QgdG8gY2hhbmdlcyBoZXJlLlxuICAgICAgICBjb25zdCBxdWVyeSA9ICdbJyArIEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UgKyAnXj1cInBhdGg6JyArIGN1cnJlbnQgKyAnXCJdLCBbJyArIEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UgKyAnXj1cInN0YXRpYzpcIl0nO1xuICAgICAgICBjb25zdCBlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJycgKyBxdWVyeSk7XG5cbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgU2V0KFtcbiAgICAgICAgICAgIC4uLmVcbiAgICAgICAgXSlcblxuICAgICAgICBpZiAoY29udGFpbmVyLm1hdGNoZXMocXVlcnkpKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5hZGQoY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50XSBvZiBpdGVyYXRvci5lbnRyaWVzKCkpIHtcblxuICAgICAgICAgICAgaWYgKG1lbS5oYXMoZWxlbWVudCkpIHJldHVybjtcbiAgICAgICAgICAgIG1lbS5hZGQoZWxlbWVudClcblxuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UpXG4gICAgICAgICAgICBsZXQgY21kID0gdHJpbVNwYWNlcyhhdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgbGV0IHBpcGUgPSBuZXcgUGlwZShjbWQpO1xuICAgICAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uY2FsbGJhY2tzLmZvckVhY2goKGYsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlLnNldENhbGxiYWNrKG4sIGYpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IHZhbHVlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcGlwZS5ydW4oc3ViamVjdClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpICsgXCIsIFwiICsgZS5tZXNzYWdlKS50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuXG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjguMFxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBjaGFuZ2VcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMoY2hhbmdlKSB7XG4gICAgY29uc3Qgc3ViamVjdCA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuZ2V0UmVhbFN1YmplY3QoKTtcbiAgICBsZXQgcCA9IGNsb25lKGNoYW5nZT8uWydwYXRoJ10pO1xuICAgIHJ1blVwZGF0ZUF0dHJpYnV0ZXMuY2FsbCh0aGlzLCB0aGlzW2ludGVybmFsU3ltYm9sXS5lbGVtZW50LCBwLCBzdWJqZWN0KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gKiBAcGFyYW0ge2FycmF5fSBwYXJ0c1xuICogQHBhcmFtIHtvYmplY3R9IHN1YmplY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAdGhpcyBVcGRhdGVyXG4gKi9cbmZ1bmN0aW9uIHJ1blVwZGF0ZUF0dHJpYnV0ZXMoY29udGFpbmVyLCBwYXJ0cywgc3ViamVjdCkge1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoIWlzQXJyYXkocGFydHMpKSByZXR1cm47XG4gICAgcGFydHMgPSBjbG9uZShwYXJ0cyk7XG5cbiAgICBsZXQgbWVtID0gbmV3IFdlYWtTZXQ7XG5cbiAgICB3aGlsZSAocGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcGFydHMuam9pbignLicpO1xuICAgICAgICBwYXJ0cy5wb3AoKTtcblxuICAgICAgICBsZXQgaXRlcmF0b3IgPSBuZXcgU2V0O1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gJ1snICsgQVRUUklCVVRFX1VQREFURVJfU0VMRUNUX1RISVMgKyAnXSwgWycgKyBBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTICsgJyo9XCJwYXRoOicgKyBjdXJyZW50ICsgJ1wiXSwgWycgKyBBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTICsgJ149XCJzdGF0aWM6XCJdJztcblxuICAgICAgICBjb25zdCBlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpO1xuXG4gICAgICAgIGlmIChlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICBbLi4uZV1cbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250YWluZXIubWF0Y2hlcyhxdWVyeSkpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmFkZChjb250YWluZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudF0gb2YgaXRlcmF0b3IuZW50cmllcygpKSB7XG5cbiAgICAgICAgICAgIGlmIChtZW0uaGFzKGVsZW1lbnQpKSByZXR1cm47XG4gICAgICAgICAgICBtZW0uYWRkKGVsZW1lbnQpXG5cbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTKVxuXG4gICAgICAgICAgICBmb3IgKGxldCBbLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMuc3BsaXQoJywnKSkpIHtcbiAgICAgICAgICAgICAgICBkZWYgPSB0cmltU3BhY2VzKGRlZik7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBkZWYuaW5kZXhPZignICcpO1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdHJpbVNwYWNlcyhkZWYuc3Vic3RyKDAsIGkpKTtcbiAgICAgICAgICAgICAgICBsZXQgY21kID0gdHJpbVNwYWNlcyhkZWYuc3Vic3RyKGkpKTtcblxuICAgICAgICAgICAgICAgIGxldCBwaXBlID0gbmV3IFBpcGUoY21kKTtcblxuICAgICAgICAgICAgICAgIHNlbGZbaW50ZXJuYWxTeW1ib2xdLmNhbGxiYWNrcy5mb3JFYWNoKChmLCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGUuc2V0Q2FsbGJhY2sobiwgZiwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUucnVuKHN1YmplY3QpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSlcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSkgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBoYW5kbGVJbnB1dENvbnRyb2xBdHRyaWJ1dGVVcGRhdGUuY2FsbCh0aGlzLCBlbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fCp9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8dW5kZWZpbmVkfSB2YWx1ZVxuICogQHJldHVybiB7dm9pZH1cbiAqIEB0aGlzIFVwZGF0ZXJcbiAqL1xuXG5mdW5jdGlvbiBoYW5kbGVJbnB1dENvbnRyb2xBdHRyaWJ1dGVVcGRhdGUoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcblxuXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdzZWxlY3QtbXVsdGlwbGUnOlxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIG9wdF0gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudC5vcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihvcHQudmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWxlY3Qtb25lJzpcbiAgICAgICAgICAgICAgICAvLyBPbmx5IG9uZSB2YWx1ZSBtYXkgYmUgc2VsZWN0ZWRcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBvcHRdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnQub3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdC52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG5cbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG5cbiAgICAgICAgICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NoZWNrZWQnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG5cbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NoZWNrZWQnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSAodmFsdWUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cblxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9ICh2YWx1ZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cblxuaW1wb3J0IHtnZXRHbG9iYWxGdW5jdGlvbn0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7VG9rZW5MaXN0fSBmcm9tIFwiLi4vdHlwZXMvdG9rZW5saXN0Lm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZywgdmFsaWRhdGVTeW1ib2x9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7QVRUUklCVVRFX09CSkVDVExJTkt9IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHtcbiAgICBmaW5kQ2xvc2VzdE9iamVjdExpbmssXG4gICAgYWRkVG9PYmplY3RMaW5rLFxuICAgIHJlbW92ZU9iamVjdExpbmssXG4gICAgaGFzT2JqZWN0TGluayxcbiAgICBnZXRMaW5rZWRPYmplY3RzLFxuICAgIHRvZ2dsZUF0dHJpYnV0ZVRva2VuLFxuICAgIGFkZEF0dHJpYnV0ZVRva2VuLFxuICAgIHJlbW92ZUF0dHJpYnV0ZVRva2VuLFxuICAgIGNvbnRhaW5zQXR0cmlidXRlVG9rZW4sXG4gICAgcmVwbGFjZUF0dHJpYnV0ZVRva2VuLFxuICAgIGNsZWFyQXR0cmlidXRlVG9rZW5zLFxuICAgIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUsXG4gICAgZmluZENsb3Nlc3RCeUNsYXNzXG59XG5cbi8qKlxuICogR2V0IHRoZSBjbG9zZXN0IG9iamVjdCBsaW5rIG9mIGEgbm9kZVxuICpcbiAqIGlmIGEgbm9kZSBpcyBzcGVjaWZpZWQgd2l0aG91dCBhIG9iamVjdCBsaW5rLCBhIHJlY3Vyc2l2ZSBzZWFyY2ggdXB3YXJkcyBpcyBwZXJmb3JtZWQgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG9iamVjdCBsaW5rIGlzIGZvdW5kLCBvciB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Z2V0VXBkYXRlckZyb21Ob2RlfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vdXBkYXRlci5tanMnO1xuICogY29uc29sZS5sb2coZmluZENsb3Nlc3RPYmplY3RMaW5rKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fHVuZGVmaW5lZH1cbiAqIEBzaW5jZSAxLjEwLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmRDbG9zZXN0T2JqZWN0TGluayhlbGVtZW50KSB7XG4gICAgcmV0dXJuIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZWxlbWVudCwgQVRUUklCVVRFX09CSkVDVExJTkspO1xufVxuXG4vKipcbiAqIEFkZHMgYSBjbGFzcyBhdHRyaWJ1dGUgdG8gYW4gZWxlbWVudC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHthZGRUb09iamVjdExpbmt9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9hdHRyaWJ1dGVzLm1qcyc7XG4gKiBhZGRUb09iamVjdExpbmsoKTtcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N5bWJvbH0gc3ltYm9sXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBhZGRUb09iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sLCBvYmplY3QpIHtcblxuICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuICAgIHZhbGlkYXRlU3ltYm9sKHN5bWJvbClcblxuICAgIGlmIChlbGVtZW50Py5bc3ltYm9sXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVsZW1lbnRbc3ltYm9sXSA9IG5ldyBTZXQ7XG4gICAgfVxuXG4gICAgYWRkQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgQVRUUklCVVRFX09CSkVDVExJTkssIHN5bWJvbC50b1N0cmluZygpKTtcbiAgICBlbGVtZW50W3N5bWJvbF0uYWRkKG9iamVjdCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG5cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFuIG9iamVjdCBmcm9tIGFuIGVsZW1lbnRcbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtyZW1vdmVPYmplY3RMaW5rfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vYXR0cmlidXRlcy5tanMnO1xuICogcmVtb3ZlT2JqZWN0TGluaygpO1xuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3ltYm9sfSBzeW1ib2xcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZU9iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKSB7XG5cbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcbiAgICB2YWxpZGF0ZVN5bWJvbChzeW1ib2wpXG5cbiAgICBpZiAoZWxlbWVudD8uW3N5bWJvbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgIH1cblxuICAgIHJlbW92ZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIEFUVFJJQlVURV9PQkpFQ1RMSU5LLCBzeW1ib2wudG9TdHJpbmcoKSk7XG4gICAgZGVsZXRlIGVsZW1lbnRbc3ltYm9sXTtcbiAgICByZXR1cm4gZWxlbWVudDtcblxufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaGFzIGFuIG9iamVjdCBsaW5rXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7aGFzT2JqZWN0TGlua30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL2F0dHJpYnV0ZXMubWpzJztcbiAqIGhhc09iamVjdExpbmsoKTtcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N5bWJvbH0gc3ltYm9sXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBoYXNPYmplY3RMaW5rKGVsZW1lbnQsIHN5bWJvbCkge1xuXG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTeW1ib2woc3ltYm9sKVxuXG4gICAgaWYgKGVsZW1lbnQ/LltzeW1ib2xdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRhaW5zQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgQVRUUklCVVRFX09CSkVDVExJTkssIHN5bWJvbC50b1N0cmluZygpKTtcblxufVxuXG4vKipcbiAqIFRoZSBPYmplY3RMaW5rIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBvYmplY3RzIHRvIEhUTUxFbGVtZW50cy4gVGhlIGVsZW1lbnRzIGFyZSBrZXB0IGluIGEgc2V0IHVuZGVyIGEgdW5pcXVlXG4gKiBzeW1ib2wgYW5kIGNhbiBiZSByZWFkIHZpYSBhbiBpdGVyYXRvciB7QHNlZSB7QGxpbmsgZ2V0TGlua2VkT2JqZWN0c319LlxuICpcbiAqIEluIGFkZGl0aW9uLCBlbGVtZW50cyB3aXRoIGFuIG9iamVjdExpbmsgcmVjZWl2ZSB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItb2JqZWN0bGlua2AuXG4gKlxuICogV2l0aCB0aGUgbWV0aG9kICB7QHNlZSB7QGxpbmsgYWRkVG9PYmplY3RMaW5rfX0gdGhlIG9iamVjdHMgY2FuIGJlIGFkZGVkLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2dldExpbmtlZE9iamVjdHN9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9hdHRyaWJ1dGVzLm1qcyc7XG4gKiBnZXRMaW5rZWRPYmplY3RzKCk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTeW1ib2x9IHN5bWJvbFxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlcmUgaXMgbm8gb2JqZWN0IGxpbmsgZm9yIHN5bWJvbFxuICovXG5mdW5jdGlvbiBnZXRMaW5rZWRPYmplY3RzKGVsZW1lbnQsIHN5bWJvbCkge1xuXG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTeW1ib2woc3ltYm9sKVxuXG4gICAgaWYgKGVsZW1lbnQ/LltzeW1ib2xdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGVyZSBpcyBubyBvYmplY3QgbGluayBmb3IgJyArIHN5bWJvbC50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudD8uW3N5bWJvbF1bU3ltYm9sLml0ZXJhdG9yXSgpO1xuXG59XG5cblxuLyoqXG4gKiBXaXRoIHRoaXMgbWV0aG9kIHRva2VucyBpbiBhbiBhdHRyaWJ1dGUgY2FuIGJlIHN3aXRjaGVkIG9uIG9yIG9mZi4gRm9yIGV4YW1wbGUsIGNsYXNzZXMgY2FuIGJlIHN3aXRjaGVkIG9uIGFuZCBvZmYgaW4gdGhlIGVsZW1lbnRzIGNsYXNzIGF0dHJpYnV0ZS5cbiAqXG4gKiBUb2tlbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt0b2dnbGVBdHRyaWJ1dGVUb2tlbn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL2F0dHJpYnV0ZXMubWpzJztcbiAqIHRvZ2dsZUF0dHJpYnV0ZVRva2VuKCk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gdG9nZ2xlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCB0b2tlbikge1xuICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuICAgIHZhbGlkYXRlU3RyaW5nKHRva2VuKVxuICAgIHZhbGlkYXRlU3RyaW5nKGtleSlcblxuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHRva2VuKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBuZXcgVG9rZW5MaXN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkpLnRvZ2dsZSh0b2tlbikudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gZWxlbWVudFxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGFkZCBhIHRva2VuIHRvIGFuIGF0dHJpYnV0ZS4gVG9rZW5zIGFyZSBhbHdheXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7YWRkQXR0cmlidXRlVG9rZW59IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9hdHRyaWJ1dGVzLm1qcyc7XG4gKiBhZGRBdHRyaWJ1dGVUb2tlbigpO1xuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGFkZEF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdG9rZW4pIHtcbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcbiAgICB2YWxpZGF0ZVN0cmluZyh0b2tlbilcbiAgICB2YWxpZGF0ZVN0cmluZyhrZXkpXG5cbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB0b2tlbik7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgbmV3IFRva2VuTGlzdChlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpKS5hZGQodG9rZW4pLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0b2tlbnMgZnJvbSBhbiBhdHRyaWJ1dGUuXG4gKlxuICogVG9rZW5zIGFyZSBhbHdheXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7cmVtb3ZlQXR0cmlidXRlVG9rZW59IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9hdHRyaWJ1dGVzLm1qcyc7XG4gKiByZW1vdmVBdHRyaWJ1dGVUb2tlbigpO1xuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdG9rZW4pIHtcbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcbiAgICB2YWxpZGF0ZVN0cmluZyh0b2tlbilcbiAgICB2YWxpZGF0ZVN0cmluZyhrZXkpXG5cbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBuZXcgVG9rZW5MaXN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkpLnJlbW92ZSh0b2tlbikudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gZWxlbWVudFxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBoYXMgYSB0b2tlbi5cbiAqXG4gKiBUb2tlbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtjb250YWluc0F0dHJpYnV0ZVRva2VufSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vYXR0cmlidXRlcy5tanMnO1xuICogY29udGFpbnNBdHRyaWJ1dGVUb2tlbigpO1xuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHRva2VuKSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTdHJpbmcodG9rZW4pXG4gICAgdmFsaWRhdGVTdHJpbmcoa2V5KVxuXG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRva2VuTGlzdChlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpKS5jb250YWlucyh0b2tlbik7XG5cbn1cblxuLyoqXG4gKiBUb2tlbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtyZXBsYWNlQXR0cmlidXRlVG9rZW59IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9hdHRyaWJ1dGVzLm1qcyc7XG4gKiByZXBsYWNlQXR0cmlidXRlVG9rZW4oKTtcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICogQHBhcmFtIHtzdHJpbmd9IHRvXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgZnJvbSwgdG8pIHtcbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcbiAgICB2YWxpZGF0ZVN0cmluZyhmcm9tKVxuICAgIHZhbGlkYXRlU3RyaW5nKHRvKVxuICAgIHZhbGlkYXRlU3RyaW5nKGtleSlcblxuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIG5ldyBUb2tlbkxpc3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KSkucmVwbGFjZShmcm9tLCB0bykudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gZWxlbWVudFxufVxuXG4vKipcbiAqIFRva2VucyBhcmUgYWx3YXlzIHNlcGFyYXRlZCBieSBhIHNwYWNlLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2NsZWFyQXR0cmlidXRlVG9rZW5zfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vYXR0cmlidXRlcy5tanMnO1xuICogY2xlYXJBdHRyaWJ1dGVUb2tlbnMoKTtcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gY2xlYXJBdHRyaWJ1dGVUb2tlbnMoZWxlbWVudCwga2V5KSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTdHJpbmcoa2V5KVxuXG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShrZXkpKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgXCJcIik7XG5cbiAgICByZXR1cm4gZWxlbWVudFxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMsIHN0YXJ0aW5nIGZyb20gYW4gYEhUTUxFbGVtZW1lbnRgLCBmb3IgdGhlIG5leHQgZWxlbWVudCB0aGF0IGhhcyBhIGNlcnRhaW4gYXR0cmlidXRlLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgZGF0YS1teS1hdHRyaWJ1dGU9XCIyXCIgaWQ9XCIyXCI+XG4gKiAgICAgPGRpdiBpZD1cIjFcIj48L2Rpdj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogLy8gaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkICh1bmRlZmluZWQpLCB0aGVuIG9ubHkgdGhlIGF0dHJpYnV0ZSBpcyBjaGVja2VkLlxuICogZmluZENsb3Nlc3RCeUF0dHJpYnV0ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnMScpLCdkYXRhLW15LWF0dHJpYnV0ZScpOyAvLyBcdTIxQTYgbm9kZSB3aXRoIGlkIDJcbiAqIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzInKSwnZGF0YS1teS1hdHRyaWJ1dGUnKTsgLy8gXHUyMUE2IG5vZGUgd2l0aCBpZCAyXG4gKlxuICogLy8gaWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQsIGZvciBleGFtcGxlIGFuIGVtcHR5IHN0cmluZywgdGhlbiB0aGUgbmFtZSBhbmQgdGhlIHZhbHVlIGFyZSBjaGVja2VkLlxuICogZmluZENsb3Nlc3RCeUF0dHJpYnV0ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnMScpLCdkYXRhLW15LWF0dHJpYnV0ZScsICcnKTsgIC8vIFx1MjFBNiB1bmRlZmluZWRcbiAqIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzEnKSwnZGF0YS1teS1hdHRyaWJ1dGUnLCAnMicpOyAvLyBcdTIxQTYgbm9kZSB3aXRoIGlkIDJcbiAqIGBgYFxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2ZpbmRDbG9zZXN0QnlBdHRyaWJ1dGV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9hdHRyaWJ1dGVzLm1qcyc7XG4gKiBmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKCk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjE0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gdmFsdWVcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fHVuZGVmaW5lZH1cbiAqIEBzdW1tYXJ5IGZpbmQgY2xvc2VzdCBub2RlXG4gKi9cbmZ1bmN0aW9uIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSkge1xuICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgZ2V0R2xvYmFsRnVuY3Rpb24oJ0hUTUxFbGVtZW50JykpO1xuXG4gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgbGV0IHNlbGVjdG9yID0gdmFsaWRhdGVTdHJpbmcoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2VsZWN0b3IgKz0gXCI9XCIgKyB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG4gICAgbGV0IHJlc3VsdCA9IGVsZW1lbnQuY2xvc2VzdCgnWycgKyBzZWxlY3RvciArICddJyk7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcywgc3RhcnRpbmcgZnJvbSBhbiBgSFRNTEVsZW1lbWVudGAsIGZvciB0aGUgbmV4dCBlbGVtZW50IHRoYXQgaGFzIGEgY2VydGFpbiBhdHRyaWJ1dGUuXG4gKlxuICogYGBgaHRtbFxuICogPGRpdiBjbGFzcz1cIm15Y2xhc3NcIiBpZD1cIjJcIj5cbiAqICAgICA8ZGl2IGlkPVwiMVwiPjwvZGl2PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgKHVuZGVmaW5lZCksIHRoZW4gb25seSB0aGUgYXR0cmlidXRlIGlzIGNoZWNrZWQuXG4gKiBmaW5kQ2xvc2VzdEJ5Q2xhc3MoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzEnKSwnbXljbGFzcycpOyAvLyBcdTIxQTYgbm9kZSB3aXRoIGlkIDJcbiAqIGZpbmRDbG9zZXN0QnlDbGFzcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnMicpLCdteWNsYXNzJyk7IC8vIFx1MjFBNiBub2RlIHdpdGggaWQgMlxuICogYGBgXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7ZmluZENsb3Nlc3RCeUNsYXNzfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vYXR0cmlidXRlcy5tanMnO1xuICogZmluZENsb3Nlc3RCeUNsYXNzKCk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjI3LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fHVuZGVmaW5lZH1cbiAqIEBzdW1tYXJ5IGZpbmQgY2xvc2VzdCBub2RlXG4gKi9cbmZ1bmN0aW9uIGZpbmRDbG9zZXN0QnlDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIGdldEdsb2JhbEZ1bmN0aW9uKCdIVE1MRWxlbWVudCcpKTtcblxuICAgIGlmIChlbGVtZW50Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKHZhbGlkYXRlU3RyaW5nKGNsYXNzTmFtZSkpKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBlbGVtZW50LmNsb3Nlc3QoJy4nICsgY2xhc3NOYW1lKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tIFwiLi4vZGF0YS9wYXRoZmluZGVyLm1qc1wiO1xuXG5pbXBvcnQge3BhcnNlRGF0YVVSTH0gZnJvbSBcIi4uL3R5cGVzL2RhdGF1cmwubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7aXNBcnJheSwgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge09ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge1Byb3h5T2JzZXJ2ZXJ9IGZyb20gXCIuLi90eXBlcy9wcm94eW9ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUZ1bmN0aW9uLCB2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZU9iamVjdCwgdmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7Y2xvbmV9IGZyb20gXCIuLi91dGlsL2Nsb25lLm1qc1wiO1xuaW1wb3J0IHthZGRBdHRyaWJ1dGVUb2tlbiwgYWRkVG9PYmplY3RMaW5rLCBnZXRMaW5rZWRPYmplY3RzLCBoYXNPYmplY3RMaW5rfSBmcm9tIFwiLi9hdHRyaWJ1dGVzLm1qc1wiO1xuaW1wb3J0IHtcbiAgICBBVFRSSUJVVEVfRElTQUJMRUQsXG4gICAgQVRUUklCVVRFX0VSUk9STUVTU0FHRSxcbiAgICBBVFRSSUJVVEVfT1BUSU9OUyxcbiAgICBBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUixcbiAgICBvYmplY3RVcGRhdGVyTGlua1N5bWJvbFxufSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2ZpbmREb2N1bWVudFRlbXBsYXRlLCBUZW1wbGF0ZX0gZnJvbSBcIi4vdGVtcGxhdGUubWpzXCI7XG5pbXBvcnQge1VwZGF0ZXJ9IGZyb20gXCIuL3VwZGF0ZXIubWpzXCI7XG5cbmV4cG9ydCB7Q3VzdG9tRWxlbWVudCwgaW5pdE1ldGhvZFN5bWJvbCwgYXNzZW1ibGVNZXRob2RTeW1ib2wsIGF0dHJpYnV0ZU9ic2VydmVyU3ltYm9sLCByZWdpc3RlckN1c3RvbUVsZW1lbnQsIGFzc2lnblVwZGF0ZXJUb0VsZW1lbnR9XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbml0TWV0aG9kU3ltYm9sID0gU3ltYm9sKCdpbml0TWV0aG9kU3ltYm9sJyk7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBhc3NlbWJsZU1ldGhvZFN5bWJvbCA9IFN5bWJvbCgnYXNzZW1ibGVNZXRob2RTeW1ib2wnKTtcblxuLyoqXG4gKiB0aGlzIHN5bWJvbCBob2xkcyB0aGUgYXR0cmlidXRlIG9ic2VydmVyIGNhbGxiYWNrcy4gVGhlIGtleSBpcyB0aGUgYXR0cmlidXRlIG5hbWUuXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGF0dHJpYnV0ZU9ic2VydmVyU3ltYm9sID0gU3ltYm9sKCdhdHRyaWJ1dGVPYnNlcnZlcicpO1xuXG5cbi8qKlxuICogSFRNTEVsZW1lbnRcbiAqIEBleHRlcm5hbCBIVE1MRWxlbWVudFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnRcbiAqXG4gKiBAc3RhcnR1bWwgY3VzdG9tZWxlbWVudC1zZXF1ZW5jZWRpYWdyYW0ucG5nXG4gKiBza2lucGFyYW0gbW9ub2Nocm9tZSB0cnVlXG4gKiBza2lucGFyYW0gc2hhZG93aW5nIGZhbHNlXG4gKlxuICogYXV0b251bWJlclxuICpcbiAqIFNjcmlwdCAtPiBET006IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdteS1lbGVtZW50JylcbiAqIERPTSAtPiBDdXN0b21FbGVtZW50OiBjb25zdHJ1Y3RvcigpXG4gKiBDdXN0b21FbGVtZW50IC0+IEN1c3RvbUVsZW1lbnQ6IFtpbml0TWV0aG9kU3ltYm9sXSgpXG4gKlxuICogQ3VzdG9tRWxlbWVudCAtLT4gRE9NOiBFbGVtZW50XG4gKiBET00gLS0+IFNjcmlwdCA6IGVsZW1lbnRcbiAqXG4gKlxuICogU2NyaXB0IC0+IERPTTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmFwcGVuZChlbGVtZW50KVxuICpcbiAqIERPTSAtPiBDdXN0b21FbGVtZW50IDogY29ubmVjdGVkQ2FsbGJhY2soKVxuICpcbiAqIG5vdGUgcmlnaHQgQ3VzdG9tRWxlbWVudDogaXMgb25seSBjYWxsZWQgYXRcXG50aGUgZmlyc3QgY29ubmVjdGlvblxuICogQ3VzdG9tRWxlbWVudCAtPiBDdXN0b21FbGVtZW50IDogW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpXG4gKlxuICogLi4uIC4uLlxuICpcbiAqIGF1dG9udW1iZXJcbiAqXG4gKiBTY3JpcHQgLT4gRE9NOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb25zdGVyLWNvbmZpcm0tYnV0dG9uJykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KVxuICogRE9NIC0+IEN1c3RvbUVsZW1lbnQ6IGRpc2Nvbm5lY3RlZENhbGxiYWNrKClcbiAqXG4gKlxuICogQGVuZHVtbFxuICpcbiAqIEBzdGFydHVtbCBjdXN0b21lbGVtZW50LWNsYXNzLnBuZ1xuICogc2tpbnBhcmFtIG1vbm9jaHJvbWUgdHJ1ZVxuICogc2tpbnBhcmFtIHNoYWRvd2luZyBmYWxzZVxuICogSFRNTEVsZW1lbnQgPHwtLSBDdXN0b21FbGVtZW50XG4gKiBAZW5kdW1sXG4gKi9cblxuXG4vKipcbiAqIFRvIGRlZmluZSBhIG5ldyBIVE1MIGVsZW1lbnQgd2UgbmVlZCB0aGUgcG93ZXIgb2YgQ3VzdG9tRWxlbWVudFxuICpcbiAqIElNUE9SVEFOVDogYWZ0ZXIgZGVmaW5pbmcgYSBgQ3VzdG9tRWxlbWVudGAsIHRoZSBgcmVnaXN0ZXJDdXN0b21FbGVtZW50YCBtZXRob2QgbXVzdCBiZSBjYWxsZWRcbiAqIHdpdGggdGhlIG5ldyBjbGFzcyBuYW1lLiBvbmx5IHRoZW4gd2lsbCB0aGUgdGFnIGRlZmluZWQgdmlhIHRoZSBgZ2V0VGFnYCBtZXRob2QgYmUgbWFkZSBrbm93biB0byB0aGUgRE9NLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWFnZXMvY3VzdG9tZWxlbWVudC1jbGFzcy5wbmdcIj5cbiAqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IHZpYSB0aGUgZnVuY3Rpb24gYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoKWAuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7TW9uc3Rlcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvL21vbnN0ZXIubWpzJztcbiAqIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItJylcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogIyMgSW50ZXJhY3Rpb25cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1hZ2VzL2N1c3RvbWVsZW1lbnQtc2VxdWVuY2VkaWFncmFtLnBuZ1wiPlxuICpcbiAqICMjIFN0eWxpbmdcbiAqXG4gKiBGb3Igb3B0aW1hbCBkaXNwbGF5IG9mIGN1c3RvbS1lbGVtZW50cyB0aGUgcHNldWRvLWNsYXNzIDpkZWZpbmVkIGNhbiBiZSB1c2VkLlxuICpcbiAqIFRvIHByZXZlbnQgdGhlIGN1c3RvbSBlbGVtZW50cyBmcm9tIGJlaW5nIGRpc3BsYXllZCBhbmQgZmxpY2tlcmluZyB1bnRpbCB0aGUgY29udHJvbCBpcyByZWdpc3RlcmVkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBjcmVhdGUgYSBjc3MgZGlyZWN0aXZlLlxuICpcbiAqIEluIHRoZSBzaW1wbGVzdCBjYXNlLCB5b3UgY2FuIHNpbXBseSBoaWRlIHRoZSBjb250cm9sLlxuICpcbiAqIGBgYFxuICogPHN0eWxlPlxuICpcbiAqIG15LWN1c3RvbS1lbGVtZW50Om5vdCg6ZGVmaW5lZCkge1xuICogICAgIGRpc3BsYXk6IG5vbmU7XG4gKiB9XG4gKlxuICogbXktY3VzdG9tLWVsZW1lbnQ6ZGVmaW5lZCB7XG4gKiAgICAgZGlzcGxheTogZmxleDtcbiAqIH1cbiAqXG4gKiA8L3N0eWxlPlxuICogYGBgXG4gKlxuICogQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGFsc28gZGlzcGxheSBhIGxvYWRlclxuICpcbiAqIGBgYFxuICogbXktY3VzdG9tLWVsZW1lbnQ6bm90KDpkZWZpbmVkKSB7XG4gKiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gKiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEwcHggMCByZ2JhKDMzLCAzMywgMzMsIDAuMTUpO1xuICogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gKiAgICAgICAgICAgIGhlaWdodDogMjAwcHg7XG4gKiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAqICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAqICAgICAgICB9XG4gKlxuICogbXktY3VzdG9tLWVsZW1lbnQ6bm90KDpkZWZpbmVkKTo6YmVmb3JlIHtcbiAqICAgICAgICAgICAgY29udGVudDogJyc7XG4gKiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gKiAgICAgICAgICAgIGxlZnQ6IC0xNTBweDtcbiAqICAgICAgICAgICAgdG9wOiAwO1xuICogICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gKiAgICAgICAgICAgIHdpZHRoOiAxNTBweDtcbiAqICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCAwJSwgI0U4RThFOCA1MCUsIHRyYW5zcGFyZW50IDEwMCUpO1xuICogICAgICAgICAgICBhbmltYXRpb246IGxvYWQgMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpIGluZmluaXRlO1xuICogICAgICAgIH1cbiAqXG4gKiBAa2V5ZnJhbWVzIGxvYWQge1xuICogICAgICAgICAgICBmcm9tIHtcbiAqICAgICAgICAgICAgICAgIGxlZnQ6IC0xNTBweDtcbiAqICAgICAgICAgICAgfVxuICogICAgICAgICAgICB0byAgIHtcbiAqICAgICAgICAgICAgICAgIGxlZnQ6IDEwMCU7XG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICB9XG4gKlxuICogbXktY3VzdG9tLWVsZW1lbnQ6ZGVmaW5lZCB7XG4gKiAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAqICAgICAgIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogLy8gSW4gdGhlIGV4YW1wbGUgdGhlIHRoZSB1c2VyIGNhbiB1c2UgaGlzIG93biB0ZW1wbGF0ZSBieSBjcmVhdGluZyBhIHRlbXBsYXRlIGluIHRoZSBET00gd2l0aCB0aGUgSUQgYG15LWN1c3RvbS1lbGVtZW50YC5cbiAqIC8vIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgdGhlbWUgKGZvciBleGFtcGxlIGBteXRoZW1lYCksIHRoZW4gaXQgd2lsbCBzZWFyY2ggZm9yIHRoZSBJRCBgbXktY3VzdG9tLWVsZW1lbnQtbXl0aGVtZWAgYW5kXG4gKiAvLyBpZiBub3QgYXZhaWxhYmxlIGZvciB0aGUgSUQgYG15LWN1c3RvbS1lbGVtZW50YC5cbiAqXG4gKiBjbGFzcyBNeUN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcbiAqIFxuICogICAgc3RhdGljIGdldFRhZygpIHtcbiAqICAgICAgICByZXR1cm4gXCJteS1jdXN0b20tZWxlbWVudFwiXG4gKiAgICB9XG4gKlxuICogfVxuICpcbiAqIC8vIFx1MjFBNiA8bXktY3VzdG9tLWVsZW1lbnQ+PC9teS1jdXN0b20tZWxlbWVudD5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3dlYmNvbXBvbmVudHNcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjY3VzdG9tLWVsZW1lbnRzXG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBleHRlbmRzIGV4dGVybmFsOkhUTUxFbGVtZW50XG4gKiBAc3VtbWFyeSBBIGJhc2UgY2xhc3MgZm9yIEhUTUw1IGN1c3RvbWNvbnRyb2xzXG4gKi9cbmNsYXNzIEN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAvKipcbiAgICAgKiBBIG5ldyBvYmplY3QgaXMgY3JlYXRlZC4gRmlyc3QgdGhlIGBpbml0T3B0aW9uc2AgbWV0aG9kIGlzIGNhbGxlZC4gSGVyZSB0aGVcbiAgICAgKiBvcHRpb25zIGNhbiBiZSBkZWZpbmVkIGluIGRlcml2ZWQgY2xhc3Nlcy4gU3Vic2VxdWVudGx5LCB0aGUgc2hhZG93Um9vdCBpcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgb3B0aW9ucyBhdHRyaWJ1dGUgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvbi5cbiAgICAgKiBAc2luY2UgMS43LjBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBuZXcgUHJveHlPYnNlcnZlcih7J29wdGlvbnMnOiBleHRlbmQoe30sIHRoaXMuZGVmYXVsdHMpfSk7XG4gICAgICAgIHRoaXNbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdID0ge307XG4gICAgICAgIGluaXRPcHRpb25PYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzW2luaXRNZXRob2RTeW1ib2xdKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBtb25pdG9yZWQgYnkgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygpYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICAgICAqIEBzaW5jZSAxLjE1LjBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIFtBVFRSSUJVVEVfT1BUSU9OUywgQVRUUklCVVRFX0RJU0FCTEVEXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIGFuZCBleHRlbmQgdGhpcyBtZXRob2QgYXMgZm9sbG93cy5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGdldCBkZWZhdWx0cygpIHtcbiAgICAgKiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgKiAgICAgICAgbXlWYWx1ZTp0cnVlXG4gICAgICogICAgfSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVG8gc2V0IHRoZSBvcHRpb25zIHZpYSB0aGUgaHRtbCB0YWcgdGhlIGF0dHJpYnV0ZSBkYXRhLW1vbnN0ZXItb3B0aW9ucyBtdXN0IGJlIHNldC5cbiAgICAgKiBBcyB2YWx1ZSBhIEpTT04gb2JqZWN0IHdpdGggdGhlIGRlc2lyZWQgdmFsdWVzIG11c3QgYmUgZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIFNpbmNlIDEuMTguMCB0aGUgSlNPTiBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgRGF0YVVSSS5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIG5ldyBNb25zdGVyLlR5cGVzLkRhdGFVcmwoYnRvYShKU09OLnN0cmluZ2lmeSh7XG4gICAgICogICAgICAgIHNoYWRvd01vZGU6ICdvcGVuJyxcbiAgICAgKiAgICAgICAgZGVsZWdhdGVzRm9jdXM6IHRydWUsXG4gICAgICogICAgICAgIHRlbXBsYXRlczoge1xuICAgICAqICAgICAgICAgICAgbWFpbjogdW5kZWZpbmVkXG4gICAgICogICAgICAgIH1cbiAgICAgKiAgICB9KSksJ2FwcGxpY2F0aW9uL2pzb24nLHRydWUpLnRvU3RyaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBhdHRyaWJ1dGUgZGF0YS1tb25zdGVyLW9wdGlvbnMtc2VsZWN0b3IgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGEgc2NyaXB0IHRhZyB0aGF0IGNvbnRhaW5zIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEFzIHZhbHVlIGEgc2VsZWN0b3IgbXVzdCBiZSBzcGVjaWZpZWQsIHdoaWNoIGJlbG9uZ3MgdG8gYSBzY3JpcHQgdGFnIGFuZCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBhcyBqc29uLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogPHNjcmlwdCBpZD1cImlkLWZvci10aGlzLWNvbmZpZ1wiIHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCI+XG4gICAgICogICAge1xuICAgICAqICAgICAgICBcImNvbmZpZy1rZXlcIjogXCJjb25maWctdmFsdWVcIlxuICAgICAqICAgIH1cbiAgICAgKiA8L3NjcmlwdD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGRpc2FibGVkPWZhbHNlIE9iamVjdCBUaGUgQm9vbGVhbiBkaXNhYmxlZCBhdHRyaWJ1dGUsIHdoZW4gcHJlc2VudCwgbWFrZXMgdGhlIGVsZW1lbnQgbm90IG11dGFibGUsIGZvY3VzYWJsZSwgb3IgZXZlbiBzdWJtaXR0ZWQgd2l0aCB0aGUgZm9ybS5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gc2hhZG93TW9kZT1vcGVuIGBvcGVuYCBFbGVtZW50cyBvZiB0aGUgc2hhZG93IHJvb3QgYXJlIGFjY2Vzc2libGUgZnJvbSBKYXZhU2NyaXB0IG91dHNpZGUgdGhlIHJvb3QsIGZvciBleGFtcGxlIHVzaW5nLiBgY2xvc2VgIERlbmllcyBhY2Nlc3MgdG8gdGhlIG5vZGUocykgb2YgYSBjbG9zZWQgc2hhZG93IHJvb3QgZnJvbSBKYXZhU2NyaXB0IG91dHNpZGUgaXRcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGRlbGVnYXRlc0ZvY3VzPXRydWUgQSBib29sZWFuIHRoYXQsIHdoZW4gc2V0IHRvIHRydWUsIHNwZWNpZmllcyBiZWhhdmlvciB0aGF0IG1pdGlnYXRlcyBjdXN0b20gZWxlbWVudCBpc3N1ZXMgYXJvdW5kIGZvY3VzYWJpbGl0eS4gV2hlbiBhIG5vbi1mb2N1c2FibGUgcGFydCBvZiB0aGUgc2hhZG93IERPTSBpcyBjbGlja2VkLCB0aGUgZmlyc3QgZm9jdXNhYmxlIHBhcnQgaXMgZ2l2ZW4gZm9jdXMsIGFuZCB0aGUgc2hhZG93IGhvc3QgaXMgZ2l2ZW4gYW55IGF2YWlsYWJsZSA6Zm9jdXMgc3R5bGluZy5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVzIFRlbXBsYXRlc1xuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZW1wbGF0ZXMubWFpbj11bmRlZmluZWQgTWFpbiB0ZW1wbGF0ZVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9hdHRhY2hTaGFkb3dcbiAgICAgKiBAc2luY2UgMS44LjBcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBBVFRSSUJVVEVfRElTQUJMRUQ6IHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9ESVNBQkxFRCksXG4gICAgICAgICAgICBzaGFkb3dNb2RlOiAnb3BlbicsXG4gICAgICAgICAgICBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSxcbiAgICAgICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgICAgIG1haW46IHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZXJlIGlzIG5vIGNoZWNrIG9uIHRoZSBuYW1lIGJ5IHRoaXMgY2xhc3MuIHRoZSBkZXZlbG9wZXIgaXMgcmVzcG9uc2libGUgZm9yIGFzc2lnbmluZyBhbiBhcHByb3ByaWF0ZSB0YWcuXG4gICAgICogaWYgdGhlIG5hbWUgaXMgbm90IHZhbGlkLCByZWdpc3RlckN1c3RvbUVsZW1lbnQoKSB3aWxsIGlzc3VlIGFuIGVycm9yXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jdXN0b20tZWxlbWVudHMuaHRtbCN2YWxpZC1jdXN0b20tZWxlbWVudC1uYW1lXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgbWV0aG9kIGdldFRhZyBtdXN0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLlxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoZSBtZXRob2QgZ2V0VGFnIG11c3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGRlcml2ZWQgY2xhc3MuXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0IHRoaXMgcG9pbnQgYSBgQ1NTU3R5bGVTaGVldGAgb2JqZWN0IGNhbiBiZSByZXR1cm5lZC4gSWYgdGhlIGVudmlyb25tZW50IGRvZXMgbm90XG4gICAgICogc3VwcG9ydCBhIGNvbnN0cnVjdG9yLCB0aGVuIGFuIG9iamVjdCBjYW4gYWxzbyBiZSBidWlsdCB1c2luZyB0aGUgZm9sbG93aW5nIGRldG91ci5cbiAgICAgKlxuICAgICAqIElmIGB1bmRlZmluZWRgIGlzIHJldHVybmVkIHRoZW4gdGhlIHNoYWRvd1Jvb3QgZG9lcyBub3QgZ2V0IGEgc3R5bGVzaGVldC5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGNvbnN0IGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgndGl0bGUnKTtcbiAgICAgKlxuICAgICAqIGxldCBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICogc3R5bGUuaW5uZXJIVE1MPVwicHtjb2xvcjpyZWQ7fVwiO1xuICAgICAqXG4gICAgICogLy8gV2ViS2l0IEhhY2tcbiAgICAgKiBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSk7XG4gICAgICogLy8gQWRkIHRoZSA8c3R5bGU+IGVsZW1lbnQgdG8gdGhlIHBhZ2VcbiAgICAgKiBkb2MuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICogcmV0dXJuIGRvYy5zdHlsZVNoZWV0c1swXTtcbiAgICAgKiA7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtDU1NTdHlsZVNoZWV0fENTU1N0eWxlU2hlZXRbXXxzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGF0dGFjaCBhIG5ldyBvYnNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7Q3VzdG9tRWxlbWVudH1cbiAgICAgKi9cbiAgICBhdHRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5hdHRhY2hPYnNlcnZlcihvYnNlcnZlcilcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGV0YWNoIGEgb2JzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVybnMge0N1c3RvbUVsZW1lbnR9XG4gICAgICovXG4gICAgZGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVybnMge1Byb3h5T2JzZXJ2ZXJ9XG4gICAgICovXG4gICAgY29udGFpbnNPYnNlcnZlcihvYnNlcnZlcikge1xuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbFN5bWJvbF0uY29udGFpbnNPYnNlcnZlcihvYnNlcnZlcilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBuZXN0ZWQgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHBhdGggYGEuYi5jYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZVxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICogQHNpbmNlIDEuMTAuMFxuICAgICAqL1xuICAgIGdldE9wdGlvbihwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBQYXRoZmluZGVyKHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbJ29wdGlvbnMnXSkuZ2V0VmlhKHBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG9wdGlvbiBhbmQgaW5mb3JtIGVsZW1lbnRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtDdXN0b21FbGVtZW50fVxuICAgICAqIEBzaW5jZSAxLjE0LjBcbiAgICAgKi9cbiAgICBzZXRPcHRpb24ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgbmV3IFBhdGhmaW5kZXIodGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpWydvcHRpb25zJ10pLnNldFZpYShwYXRoLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzaW5jZSAxLjE1LjBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtDdXN0b21FbGVtZW50fVxuICAgICAqL1xuICAgIHNldE9wdGlvbnMob3B0aW9ucykge1xuXG4gICAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9uc0pTT04uY2FsbCh0aGlzLCBvcHRpb25zKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGV4dGVuZChzZWxmW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KClbJ29wdGlvbnMnXSwgc2VsZi5kZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIG9uY2UgdmlhIHRoZSBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAgICAgKiBAc2luY2UgMS44LjBcbiAgICAgKi9cbiAgICBbaW5pdE1ldGhvZFN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCBvbmNlIHdoZW4gdGhlIG9iamVjdCBpcyBpbmNsdWRlZCBpbiB0aGUgRE9NIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0N1c3RvbUVsZW1lbnR9XG4gICAgICogQHNpbmNlIDEuOC4wXG4gICAgICovXG4gICAgW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IGVsZW1lbnRzLCBub2RlTGlzdDtcblxuICAgICAgICBjb25zdCBBdHRyaWJ1dGVPcHRpb25zID0gZ2V0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzLmNhbGwoc2VsZik7XG4gICAgICAgIGlmIChpc09iamVjdChBdHRyaWJ1dGVPcHRpb25zKSAmJiBPYmplY3Qua2V5cyhBdHRyaWJ1dGVPcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZWxmLnNldE9wdGlvbnMoQXR0cmlidXRlT3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBTY3JpcHRPcHRpb25zID0gZ2V0T3B0aW9uc0Zyb21TY3JpcHRUYWcuY2FsbChzZWxmKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KFNjcmlwdE9wdGlvbnMpICYmIE9iamVjdC5rZXlzKFNjcmlwdE9wdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9ucyhTY3JpcHRPcHRpb25zKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKHNlbGYuZ2V0T3B0aW9uKCdzaGFkb3dNb2RlJywgZmFsc2UpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpbml0U2hhZG93Um9vdC5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gc2VsZi5zaGFkb3dSb290LmNoaWxkTm9kZXM7XG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGluaXRDU1NTdHlsZXNoZWV0LmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlVG9rZW4oc2VsZiwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKGVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpKSB7XG4gICAgICAgICAgICBpZiAoIShlbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSkge1xuICAgICAgICAgICAgICAgIGluaXRIdG1sQ29udGVudC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gdGhpcy5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5vZGVMaXN0ID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgLi4uZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgLi4uZ2V0U2xvdHRlZEVsZW1lbnRzLmNhbGwoc2VsZilcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG5vZGVMaXN0ID0gZWxlbWVudHNcbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2lnblVwZGF0ZXJUb0VsZW1lbnQuY2FsbChzZWxmLCBub2RlTGlzdCwgY2xvbmUoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVsnb3B0aW9ucyddKSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBldmVyeSB0aW1lIHRoZSBlbGVtZW50IGlzIGluc2VydGVkIGludG8gdGhlIERPTS4gVXNlZnVsIGZvciBydW5uaW5nIHNldHVwIGNvZGUsIHN1Y2ggYXNcbiAgICAgKiBmZXRjaGluZyByZXNvdXJjZXMgb3IgcmVuZGVyaW5nLiBHZW5lcmFsbHksIHlvdSBzaG91bGQgdHJ5IHRvIGRlbGF5IHdvcmsgdW50aWwgdGhpcyB0aW1lLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAc2luY2UgMS43LjBcbiAgICAgKi9cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAoIWhhc09iamVjdExpbmsoc2VsZiwgb2JqZWN0VXBkYXRlckxpbmtTeW1ib2wpKSB7XG4gICAgICAgICAgICBzZWxmW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgZXZlcnkgdGltZSB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4gVXNlZnVsIGZvciBydW5uaW5nIGNsZWFuIHVwIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSBlbGVtZW50IGhhcyBiZWVuIG1vdmVkIGludG8gYSBuZXcgZG9jdW1lbnQgKGUuZy4gc29tZW9uZSBjYWxsZWQgZG9jdW1lbnQuYWRvcHROb2RlKGVsKSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIGFkb3B0ZWRDYWxsYmFjaygpIHtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGFuIG9ic2VydmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBhZGRlZCwgcmVtb3ZlZCwgdXBkYXRlZCwgb3IgcmVwbGFjZWQuIEFsc28gY2FsbGVkIGZvciBpbml0aWFsXG4gICAgICogdmFsdWVzIHdoZW4gYW4gZWxlbWVudCBpcyBjcmVhdGVkIGJ5IHRoZSBwYXJzZXIsIG9yIHVwZ3JhZGVkLiBOb3RlOiBvbmx5IGF0dHJpYnV0ZXMgbGlzdGVkIGluIHRoZSBvYnNlcnZlZEF0dHJpYnV0ZXNcbiAgICAgKiBwcm9wZXJ0eSB3aWxsIHJlY2VpdmUgdGhpcyBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRWYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3VmFsXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAc2luY2UgMS4xNS4wXG4gICAgICovXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHJOYW1lLCBvbGRWYWwsIG5ld1ZhbCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHNlbGZbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdPy5bYXR0ck5hbWVdO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChzZWxmLCBuZXdWYWwsIG9sZFZhbCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICAgICAqIEBzaW5jZSAxLjE5LjBcbiAgICAgKi9cbiAgICBoYXNOb2RlKG5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5DaGlsZE5vZGUuY2FsbChzZWxmLCB2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShzZWxmLnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5DaGlsZE5vZGUuY2FsbChzZWxmLnNoYWRvd1Jvb3QsIG5vZGUpO1xuXG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfHVuZGVmaW5lZH0gcXVlcnlcbiAqIEBwYXJhbSB7U3RyaW5nfHVuZGVmaW5lZHxudWxsfSBuYW1lIG5hbWUgb2YgdGhlIHNsb3QgKGlmIHRoZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLCBhbGwgc2xvdHMgYXJlIHNlYXJjaGVkLCBpZiB0aGUgcGFyYW1ldGVyIGhhcyB0aGUgdmFsdWUgbnVsbCwgYWxsIHNsb3RzIHdpdGhvdXQgYSBuYW1lIGFyZSBzZWFyY2hlZC4gaWYgYSBzdHJpbmcgaXMgc3BlY2lmaWVkLCB0aGUgc2xvdHMgd2l0aCB0aGlzIG5hbWUgYXJlIHNlYXJjaGVkLilcbiAqIEByZXR1cm4geyp9XG4gKiBAdGhpcyBDdXN0b21FbGVtZW50XG4gKiBAc2luY2UgMS4yMy4wXG4gKiBAdGhyb3dzIHtFcnJvcn0gcXVlcnkgbXVzdCBiZSBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRTbG90dGVkRWxlbWVudHMocXVlcnksIG5hbWUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0O1xuXG4gICAgaWYgKCEoc2VsZi5zaGFkb3dSb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsZXQgc2VsZWN0b3IgPSAnc2xvdCc7XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2VsZWN0b3IgKz0gJzpub3QoW25hbWVdKSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3RvciArPSAnW25hbWU9JyArIHZhbGlkYXRlU3RyaW5nKG5hbWUpICsgJ10nO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBjb25zdCBzbG90cyA9IHNlbGYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcblxuICAgIGZvciAoY29uc3QgWywgc2xvdF0gb2YgT2JqZWN0LmVudHJpZXMoc2xvdHMpKSB7XG4gICAgICAgIHNsb3QuYXNzaWduZWRFbGVtZW50cygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblxuICAgICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcocXVlcnkpKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5tYXRjaGVzKHF1ZXJ5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdxdWVyeSBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEB0aGlzIEN1c3RvbUVsZW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5DaGlsZE5vZGUobm9kZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHNlbGYuY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbLCBlXSBvZiBPYmplY3QuZW50cmllcyhzZWxmLmNoaWxkTm9kZXMpKSB7XG4gICAgICAgIGlmIChlLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5DaGlsZE5vZGUuY2FsbChlLCBub2RlKTtcbiAgICB9XG5cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBAc2luY2UgMS4xNS4wXG4gKiBAcHJpdmF0ZVxuICogQHRoaXMgQ3VzdG9tRWxlbWVudFxuICovXG5mdW5jdGlvbiBpbml0T3B0aW9uT2JzZXJ2ZXIoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBsZXQgbGFzdERpc2FibGVkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgc2VsZi5hdHRhY2hPYnNlcnZlcihuZXcgT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBmbGFnID0gc2VsZi5nZXRPcHRpb24oJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgaWYgKGZsYWcgPT09IGxhc3REaXNhYmxlZFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0RGlzYWJsZWRWYWx1ZSA9IGZsYWc7XG5cbiAgICAgICAgaWYgKCEoc2VsZi5zaGFkb3dSb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gJ2J1dHRvbiwgY29tbWFuZCwgZmllbGRzZXQsIGtleWdlbiwgb3B0Z3JvdXAsIG9wdGlvbiwgc2VsZWN0LCB0ZXh0YXJlYSwgaW5wdXQsIFtkYXRhLW1vbnN0ZXItb2JqZWN0bGlua10nO1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNlbGYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KTtcblxuICAgICAgICBsZXQgbm9kZUxpc3Q7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBub2RlTGlzdCA9IG5ldyBTZXQoW1xuICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRzLFxuICAgICAgICAgICAgICAgIC4uLmdldFNsb3R0ZWRFbGVtZW50cy5jYWxsKHNlbGYsIHF1ZXJ5KVxuICAgICAgICAgICAgXSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbm9kZUxpc3QgPSBlbGVtZW50c1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFsuLi5ub2RlTGlzdF0pIHtcbiAgICAgICAgICAgIGlmIChmbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0RJU0FCTEVELCAnJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9ESVNBQkxFRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0pKTtcblxuICAgIHNlbGYuYXR0YWNoT2JzZXJ2ZXIobmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvLyBub3QgaW5pdGlhbGlzZWRcbiAgICAgICAgaWYgKCFoYXNPYmplY3RMaW5rKHNlbGYsIG9iamVjdFVwZGF0ZXJMaW5rU3ltYm9sKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluZm9ybSBldmVyeSBlbGVtZW50XG4gICAgICAgIGNvbnN0IHVwZGF0ZXJzID0gZ2V0TGlua2VkT2JqZWN0cyhzZWxmLCBvYmplY3RVcGRhdGVyTGlua1N5bWJvbCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaXN0IG9mIHVwZGF0ZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHVwZGF0ZXIgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gY2xvbmUoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVsnb3B0aW9ucyddKTtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHVwZGF0ZXIuZ2V0U3ViamVjdCgpLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSkpO1xuXG4gICAgLy8gZGlzYWJsZWRcbiAgICBzZWxmW2F0dHJpYnV0ZU9ic2VydmVyU3ltYm9sXVtBVFRSSUJVVEVfRElTQUJMRURdID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2VsZi5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX0RJU0FCTEVEKSkge1xuICAgICAgICAgICAgc2VsZi5zZXRPcHRpb24oQVRUUklCVVRFX0RJU0FCTEVELCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uKEFUVFJJQlVURV9ESVNBQkxFRCwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGEtbW9uc3Rlci1vcHRpb25zXG4gICAgc2VsZlthdHRyaWJ1dGVPYnNlcnZlclN5bWJvbF1bQVRUUklCVVRFX09QVElPTlNdID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzLmNhbGwoc2VsZik7XG4gICAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZWxmLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRhLW1vbnN0ZXItb3B0aW9ucy1zZWxlY3RvclxuICAgIHNlbGZbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdW0FUVFJJQlVURV9PUFRJT05TX1NFTEVDVE9SXSA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnNGcm9tU2NyaXB0VGFnLmNhbGwoc2VsZik7XG4gICAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZWxmLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZXRPcHRpb25zRnJvbVNjcmlwdFRhZygpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmICghc2VsZi5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX09QVElPTlNfU0VMRUNUT1IpKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUikpO1xuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBIVE1MU2NyaXB0RWxlbWVudCkpIHtcbiAgICAgICAgYWRkQXR0cmlidXRlVG9rZW4oc2VsZiwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgJ3RoZSBzZWxlY3RvciAnICsgQVRUUklCVVRFX09QVElPTlNfU0VMRUNUT1IgKyAnIGZvciBvcHRpb25zIHdhcyBzcGVjaWZpZWQgKCcgKyBzZWxmLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUikgKyAnKSBidXQgbm90IGZvdW5kLicpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgbGV0IG9iaiA9IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgb2JqID0gcGFyc2VPcHRpb25zSlNPTi5jYWxsKHRoaXMsIG5vZGUudGV4dENvbnRlbnQudHJpbSgpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYWRkQXR0cmlidXRlVG9rZW4oc2VsZiwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgJ3doZW4gYW5hbHl6aW5nIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHNjcmlwdCB0YWcgdGhlcmUgd2FzIGFuIGVycm9yLiAnICsgZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldE9wdGlvbnNGcm9tQXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OUykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZU9wdGlvbnNKU09OLmNhbGwoc2VsZiwgdGhpcy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX09QVElPTlMpKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhZGRBdHRyaWJ1dGVUb2tlbihzZWxmLCBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCAndGhlIG9wdGlvbnMgYXR0cmlidXRlICcgKyBBVFRSSUJVVEVfT1BUSU9OUyArICcgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvbiAoYWN0dWFsOiAnICsgdGhpcy5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX09QVElPTlMpICsgJykuJyArIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBwYXJzZU9wdGlvbnNKU09OKGRhdGEpIHtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzLCBvYmogPSB7fTtcblxuICAgIGlmICghaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICAvLyB0aGUgY29uZmlndXJhdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgZGF0YSB1cmwuXG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGRhdGFVcmwgPSBwYXJzZURhdGFVUkwoZGF0YSk7XG4gICAgICAgIGRhdGEgPSBkYXRhVXJsLmNvbnRlbnQ7XG4gICAgfSBjYXRjaCAoZSkge1xuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IG9iaiA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdChvYmopO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG5cblxuICAgIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge2luaXRIdG1sQ29udGVudH1cbiAqL1xuZnVuY3Rpb24gaW5pdEh0bWxDb250ZW50KCkge1xuXG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gZmluZERvY3VtZW50VGVtcGxhdGUodGhpcy5jb25zdHJ1Y3Rvci5nZXRUYWcoKSk7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgbGV0IGh0bWwgPSB0aGlzLmdldE9wdGlvbigndGVtcGxhdGVzLm1haW4nLCAnJyk7XG4gICAgICAgIGlmIChpc1N0cmluZyhodG1sKSAmJiBodG1sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHRoaXMgQ3VzdG9tRWxlbWVudFxuICogQHNpbmNlIDEuMTYuMFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAqL1xuZnVuY3Rpb24gaW5pdENTU1N0eWxlc2hlZXQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoISh0aGlzLnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSkge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZVNoZWV0ID0gdGhpcy5jb25zdHJ1Y3Rvci5nZXRDU1NTdHlsZVNoZWV0KCk7XG5cbiAgICBpZiAoc3R5bGVTaGVldCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQpIHtcbiAgICAgICAgaWYgKHN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFtzdHlsZVNoZWV0XTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShzdHlsZVNoZWV0KSkge1xuICAgICAgICBjb25zdCBhc3NpZ24gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcyBvZiBzdHlsZVNoZWV0KSB7XG5cbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhzKSkge1xuICAgICAgICAgICAgICAgIGxldCB0cmltZWRTdHlsZVNoZWV0ID0gcy50cmltKClcbiAgICAgICAgICAgICAgICBpZiAodHJpbWVkU3R5bGVTaGVldCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmlubmVySFRNTCA9IHRyaW1lZFN0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93Um9vdC5wcmVwZW5kKHN0eWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRlSW5zdGFuY2UocywgQ1NTU3R5bGVTaGVldCk7XG5cbiAgICAgICAgICAgIGlmIChzLmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhc3NpZ24ucHVzaChzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2lnbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzID0gYXNzaWduO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHN0eWxlU2hlZXQpKSB7XG5cbiAgICAgICAgbGV0IHRyaW1lZFN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0LnRyaW0oKVxuICAgICAgICBpZiAodHJpbWVkU3R5bGVTaGVldCAhPT0gJycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICAgICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gc3R5bGVTaGVldDtcbiAgICAgICAgICAgIHNlbGYuc2hhZG93Um9vdC5wcmVwZW5kKHN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBodG1sIGlzIG5vdCBzZXQuXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2F0dGFjaFNoYWRvd1xuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAc2luY2UgMS44LjBcbiAqL1xuZnVuY3Rpb24gaW5pdFNoYWRvd1Jvb3QoKSB7XG5cbiAgICBsZXQgdGVtcGxhdGUsIGh0bWw7XG5cbiAgICB0cnkge1xuICAgICAgICB0ZW1wbGF0ZSA9IGZpbmREb2N1bWVudFRlbXBsYXRlKHRoaXMuY29uc3RydWN0b3IuZ2V0VGFnKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICBodG1sID0gdGhpcy5nZXRPcHRpb24oJ3RlbXBsYXRlcy5tYWluJywgJycpO1xuICAgICAgICBpZiAoIWlzU3RyaW5nKGh0bWwpIHx8IGh0bWwgPT09IHVuZGVmaW5lZCB8fCBodG1sID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJodG1sIGlzIG5vdCBzZXQuXCIpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICB0aGlzLmF0dGFjaFNoYWRvdyh7XG4gICAgICAgIG1vZGU6IHRoaXMuZ2V0T3B0aW9uKCdzaGFkb3dNb2RlJywgJ29wZW4nKSxcbiAgICAgICAgZGVsZWdhdGVzRm9jdXM6IHRoaXMuZ2V0T3B0aW9uKCdkZWxlZ2F0ZXNGb2N1cycsIHRydWUpXG4gICAgfSk7XG5cbiAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFkb3dSb290LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGEgbmV3IGVsZW1lbnQuIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgYEN1c3RvbUVsZW1lbnQuZ2V0VGFnKClgIGlzIHVzZWQgYXMgdGhlIHRhZy5cbiAqXG4gKiBAcGFyYW0ge0N1c3RvbUVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0aHJvd3Mge0RPTUV4Y2VwdGlvbn0gRmFpbGVkIHRvIGV4ZWN1dGUgJ2RlZmluZScgb24gJ0N1c3RvbUVsZW1lbnRSZWdpc3RyeSc6IGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWVcbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJDdXN0b21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICB2YWxpZGF0ZUZ1bmN0aW9uKGVsZW1lbnQpO1xuICAgIGdldEdsb2JhbE9iamVjdCgnY3VzdG9tRWxlbWVudHMnKS5kZWZpbmUoZWxlbWVudC5nZXRUYWcoKSwgZWxlbWVudCk7XG59XG5cblxuLyoqXG4gKlxuICogQHBhcmFtIGVsZW1lbnRcbiAqIEBwYXJhbSBvYmplY3RcbiAqIEByZXR1cm4ge1Byb21pc2VbXX1cbiAqIEBzaW5jZSAxLjIzLjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICovXG5mdW5jdGlvbiBhc3NpZ25VcGRhdGVyVG9FbGVtZW50KGVsZW1lbnRzLCBvYmplY3QpIHtcblxuICAgIGNvbnN0IHVwZGF0ZXJzID0gbmV3IFNldDtcblxuICAgIGlmIChlbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7XG4gICAgICAgIGVsZW1lbnRzID0gbmV3IFNldChbXG4gICAgICAgICAgICAuLi5lbGVtZW50c1xuICAgICAgICBdKVxuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgICBpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHUgPSBuZXcgVXBkYXRlcihlbGVtZW50LCBvYmplY3QpXG4gICAgICAgIHVwZGF0ZXJzLmFkZCh1KTtcblxuICAgICAgICByZXN1bHQucHVzaCh1LnJ1bigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHUuZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCk7XG4gICAgICAgIH0pKTtcblxuICAgIH0pO1xuXG4gICAgaWYgKHVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgIGFkZFRvT2JqZWN0TGluayh0aGlzLCBvYmplY3RVcGRhdGVyTGlua1N5bWJvbCwgdXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7QVRUUklCVVRFX1ZBTFVFfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge0N1c3RvbUVsZW1lbnQsIGF0dHJpYnV0ZU9ic2VydmVyU3ltYm9sfSBmcm9tIFwiLi9jdXN0b21lbGVtZW50Lm1qc1wiO1xuXG5leHBvcnQge0N1c3RvbUNvbnRyb2x9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGF0dGFjaGVkSW50ZXJuYWxTeW1ib2wgPSBTeW1ib2woJ2F0dGFjaGVkSW50ZXJuYWwnKTtcblxuLyoqXG4gKiBUbyBkZWZpbmUgYSBuZXcgSFRNTCBjb250cm9sIHdlIG5lZWQgdGhlIHBvd2VyIG9mIEN1c3RvbUVsZW1lbnRcbiAqXG4gKiBJTVBPUlRBTlQ6IGFmdGVyIGRlZmluaW5nIGEgYEN1c3RvbUVsZW1lbnRgLCB0aGUgYHJlZ2lzdGVyQ3VzdG9tRWxlbWVudGAgbWV0aG9kIG11c3QgYmUgY2FsbGVkXG4gKiB3aXRoIHRoZSBuZXcgY2xhc3MgbmFtZS4gb25seSB0aGVuIHdpbGwgdGhlIHRhZyBkZWZpbmVkIHZpYSB0aGUgYGdldFRhZ2AgbWV0aG9kIGJlIG1hZGUga25vd24gdG8gdGhlIERPTS5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1hZ2VzL2N1c3RvbWNvbnRyb2wtY2xhc3MucG5nXCI+XG4gKlxuICogVGhpcyBjb250cm9sIHVzZXMgYGF0dGFjaEludGVybmFscygpYCB0byBpbnRlZ3JhdGUgdGhlIGNvbnRyb2wgaW50byBhIGZvcm0uXG4gKiBJZiB0aGUgdGFyZ2V0IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBtZXRob2QsIHRoZSBbcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2VsZW1lbnQtaW50ZXJuYWxzLXBvbHlmaWxsICkgY2FuIGJlIHVzZWQuXG4gKlxuICogWW91IGNhbiBjcmVhdGUgdGhlIG9iamVjdCB2aWEgdGhlIGZ1bmN0aW9uIGBkb2N1bWVudC5jcmVhdGVFbGVtZW50KClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0N1c3RvbUNvbnRyb2x9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlLy9tb25zdGVyLm1qcyc7XG4gKiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLScpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzdGFydHVtbCBjdXN0b21jb250cm9sLWNsYXNzLnBuZ1xuICogc2tpbnBhcmFtIG1vbm9jaHJvbWUgdHJ1ZVxuICogc2tpbnBhcmFtIHNoYWRvd2luZyBmYWxzZVxuICogSFRNTEVsZW1lbnQgPHwtLSBDdXN0b21FbGVtZW50XG4gKiBDdXN0b21FbGVtZW50IDx8LS0gQ3VzdG9tQ29udHJvbFxuICogQGVuZHVtbFxuICpcbiAqIEBzdW1tYXJ5IEEgYmFzZSBjbGFzcyBmb3IgY3VzdG9tY29udHJvbHMgYmFzZWQgb24gQ3VzdG9tRWxlbWVudFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZWxlbWVudC1pbnRlcm5hbHMtcG9seWZpbGx9XG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vV0lDRy93ZWJjb21wb25lbnRzfVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjY3VzdG9tLWVsZW1lbnRzfVxuICogQHNpbmNlIDEuMTQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICovXG5jbGFzcyBDdXN0b21Db250cm9sIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG5cbiAgICAvKipcbiAgICAgKiBJTVBPUlRBTlQ6IEN1c3RvbUNvbnRyb2xzIGluc3RhbmNlcyBhcmUgbm90IGNyZWF0ZWQgdmlhIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGVpdGhlciB2aWEgYSB0YWcgaW4gdGhlIEhUTUwgb3IgdmlhIDxjb2RlPmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoKTwvY29kZT4uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAgICAgKiBAc3VtbWFyeSBjcmVhdGUgbmV3IEluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzWydhdHRhY2hJbnRlcm5hbHMnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgYnkgY2hyb21lXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH1cbiAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXNbYXR0YWNoZWRJbnRlcm5hbFN5bWJvbF0gPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5pdE9ic2VydmVyLmNhbGwodGhpcyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoaWNoIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIG1vbml0b3JlZCBieSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKClgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nW119XG4gICAgICogQHNpbmNlIDEuMTUuMFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgICAgICBjb25zdCBsaXN0ID0gc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzO1xuICAgICAgICBsaXN0LnB1c2goQVRUUklCVVRFX1ZBTFVFKTtcbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfSAgICBcbiAgICBcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9hdHRhY2hJbnRlcm5hbHN9XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGdldCBmb3JtQXNzb2NpYXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlZCBjbGFzc2VzIGNhbiBvdmVycmlkZSBhbmQgZXh0ZW5kIHRoaXMgbWV0aG9kIGFzIGZvbGxvd3MuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICogICAgcmV0dXJuIGV4dGVuZHN7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgKiAgICAgICAgbXlWYWx1ZTp0cnVlXG4gICAgICogICAgfSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY3VzdG9tLWVsZW1lbnRzLmh0bWwjY3VzdG9tLWVsZW1lbnRzLWZhY2UtZXhhbXBsZX1cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnQvYXR0YWNoSW50ZXJuYWxzfVxuICAgICAqIEByZXR1cm4ge29iamVjdH1cbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzcyBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbC5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSB2YWx1ZSBnZXR0ZXIgbXVzdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZGVyaXZlZCBjbGFzc1xuICAgICAqL1xuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ3RoZSB2YWx1ZSBnZXR0ZXIgbXVzdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZGVyaXZlZCBjbGFzcycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE11c3QgYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3MgYW5kIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEBzaW5jZSAxLjE0LjBcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIHZhbHVlIHNldHRlciBtdXN0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBkZXJpdmVkIGNsYXNzXG4gICAgICovXG4gICAgc2V0IHZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRocm93IEVycm9yKCd0aGUgdmFsdWUgc2V0dGVyIG11c3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGRlcml2ZWQgY2xhc3MnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHJldHVybiB7Tm9kZUxpc3R9XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL2xhYmVsc31cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAgICAgKi9cbiAgICBnZXQgbGFiZWxzKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8ubGFiZWxzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICAgKi9cbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuZ2V0VGFnKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZhbGlkaXR5U3RhdGV9XG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1ZhbGlkaXR5U3RhdGV9XG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3ZhbGlkaXR5fVxuICAgICAqL1xuICAgIGdldCB2YWxpZGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsLmNhbGwodGhpcyk/LnZhbGlkaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvdmFsaWRhdGlvbk1lc3NhZ2VcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAgICAgKi9cbiAgICBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbC5jYWxsKHRoaXMpPy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy93aWxsVmFsaWRhdGVcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAgICAgKi9cbiAgICBnZXQgd2lsbFZhbGlkYXRlKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8ud2lsbFZhbGlkYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtDdXN0b21TdGF0ZVNldH1cbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9zdGF0ZXNcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAgICAgKi9cbiAgICBnZXQgc3RhdGVzKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8uc3RhdGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtIVE1MRm9udEVsZW1lbnR8bnVsbH1cbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9mb3JtXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICovXG4gICAgZ2V0IGZvcm0oKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbC5jYWxsKHRoaXMpPy5mb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiAvLyBVc2UgdGhlIGNvbnRyb2wncyBuYW1lIGFzIHRoZSBiYXNlIG5hbWUgZm9yIHN1Ym1pdHRlZCBkYXRhXG4gICAgICogY29uc3QgbiA9IHRoaXMuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICogY29uc3QgZW50cmllcyA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAqIGVudHJpZXMuYXBwZW5kKG4gKyAnLWZpcnN0LW5hbWUnLCB0aGlzLmZpcnN0TmFtZV8pO1xuICAgICAqIGVudHJpZXMuYXBwZW5kKG4gKyAnLWxhc3QtbmFtZScsIHRoaXMubGFzdE5hbWVfKTtcbiAgICAgKiB0aGlzLnNldEZvcm1WYWx1ZShlbnRyaWVzKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RmlsZXxzdHJpbmd8Rm9ybURhdGF9IHZhbHVlXG4gICAgICogQHBhcmFtIHtGaWxlfHN0cmluZ3xGb3JtRGF0YX0gc3RhdGVcbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqIEB0aHJvd3Mge0RPTUV4Y2VwdGlvbn0gTm90U3VwcG9ydGVkRXJyb3JcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL3NldEZvcm1WYWx1ZVxuICAgICAqL1xuICAgIHNldEZvcm1WYWx1ZSh2YWx1ZSwgc3RhdGUpIHtcbiAgICAgICAgZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKS5zZXRGb3JtVmFsdWUodmFsdWUsIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmbGFnc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGFuY2hvclxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvc2V0VmFsaWRpdHlcbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqIEB0aHJvd3Mge0RPTUV4Y2VwdGlvbn0gTm90U3VwcG9ydGVkRXJyb3JcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAgICAgKi9cbiAgICBzZXRWYWxpZGl0eShmbGFncywgbWVzc2FnZSwgYW5jaG9yKSB7XG4gICAgICAgIGdldEludGVybmFsLmNhbGwodGhpcykuc2V0VmFsaWRpdHkoZmxhZ3MsIG1lc3NhZ2UsIGFuY2hvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvY2hlY2tWYWxpZGl0eVxuICAgICAqIEBzaW5jZSAxLjE0LjBcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqIEB0aHJvd3Mge0RPTUV4Y2VwdGlvbn0gTm90U3VwcG9ydGVkRXJyb3JcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIEVsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnlcbiAgICAgKi9cbiAgICBjaGVja1ZhbGlkaXR5KCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8uY2hlY2tWYWxpZGl0eSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqIEBzaW5jZSAxLjE0LjBcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL3JlcG9ydFZhbGlkaXR5XG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICogQHRocm93cyB7RE9NRXhjZXB0aW9ufSBOb3RTdXBwb3J0ZWRFcnJvclxuICAgICAqL1xuICAgIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8ucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7b2JqZWN0fVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gKiBAdGhpcyBDdXN0b21Db250cm9sXG4gKi9cbmZ1bmN0aW9uIGdldEludGVybmFsKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKCEoYXR0YWNoZWRJbnRlcm5hbFN5bWJvbCBpbiB0aGlzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnRJbnRlcm5hbHMgaXMgbm90IHN1cHBvcnRlZCBhbmQgYSBwb2x5ZmlsbCBpcyBuZWNlc3NhcnknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1thdHRhY2hlZEludGVybmFsU3ltYm9sXTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7b2JqZWN0fVxuICogQHRoaXMgQ3VzdG9tQ29udHJvbFxuICovXG5mdW5jdGlvbiBpbml0T2JzZXJ2ZXIoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyB2YWx1ZVxuICAgIHNlbGZbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdWyd2YWx1ZSddID0gKCkgPT4ge1xuICAgICAgICBzZWxmLnNldE9wdGlvbigndmFsdWUnLCBzZWxmLmdldEF0dHJpYnV0ZSgndmFsdWUnKSk7XG4gICAgfVxuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2dldERvY3VtZW50LCBnZXRXaW5kb3d9IGZyb20gXCIuL3V0aWwubWpzXCI7XG5cbmV4cG9ydCB7ZG9tUmVhZHksIHdpbmRvd1JlYWR5fVxuXG4vKipcbiAqIFRoaXMgdmFyaWFibGUgaXMgYSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIGFzIHNvb24gYXMgdGhlIGRvbSBpcyBhdmFpbGFibGUuXG4gKlxuICogVGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgb3JpZ2luYWwgSFRNTCBkb2N1bWVudCBpcyBmdWxseSBsb2FkZWQgYW5kIHBhcnNlZFxuICogd2l0aG91dCB3YWl0aW5nIGZvciBzdHlsZXNoZWV0cywgaW1hZ2VzLCBhbmQgc3ViZnJhbWVzIHRvIGZpbmlzaCBsb2FkaW5nLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2RvbVJlYWR5fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vcmVhZHkubWpzJztcbiAqIGRvbVJlYWR5KCkudGhlbigoKT0+e1xuICogICAgIC8vIC4uLlxuICogfSlcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuMzEuMFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAc3VtbWFyeSB2YXJpYWJsZSB0byBjaGVjayBpZiBkb20gaXMgcmVhZHlcbiAqIEB0eXBlIHtQcm9taXNlfVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvRE9NQ29udGVudExvYWRlZF9ldmVudFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcmVhZHlTdGF0ZVxuICovXG5jb25zdCBkb21SZWFkeSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCByZXNvbHZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgfVxufSk7XG5cblxuLyoqXG4gKiBUaGlzIHZhcmlhYmxlIGlzIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBhcyBzb29uIGFzIHRoZSB3aW5kb3dzIGlzIGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgbG9hZCBldmVudCBmaXJlcyB3aGVuIHRoZSBlbnRpcmUgcGFnZSBpcyBsb2FkZWQsIGluY2x1ZGluZyBhbGwgZGVwZW5kZW50IHJlc291cmNlcyBzdWNoIGFzIHN0eWxlc2hlZXRzLFxuICogYXNzZXRzLCBhbmQgaW1hZ2VzLiBVbmxpa2UgRE9NQ29udGVudExvYWRlZCwgd2hpY2ggZmlyZXMgYXMgc29vbiBhcyB0aGUgRE9NIG9mIHRoZSBwYWdlIGlzIGxvYWRlZCxcbiAqIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHJlc291cmNlcyB0byBmaW5pc2ggbG9hZGluZy5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt3aW5kb3dSZWFkeX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3JlYWR5Lm1qcyc7XG4gKiB3aW5kb3dSZWFkeSgpLnRoZW4oKCk9PntcbiAqICAgICAvLyAuLi5cbiAqIH0pXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjMxLjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHN1bW1hcnkgdmFyaWFibGUgdG8gY2hlY2sgaWYgd2luZG93IGlzIHJlYWR5XG4gKiBAdHlwZSB7UHJvbWlzZX1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9sb2FkX2V2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudC9yZWFkeVN0YXRlXG4gKi9cbmNvbnN0IHdpbmRvd1JlYWR5ID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG4gICAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG5cbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCByZXNvbHZlKTtcbiAgICB9XG59KTtcbiIsICIvKiFcbiAqIE1JVCBMaWNlbnNlXG4gKiBcbiAqIENvcHlyaWdodCAoYykgMjAxNy0yMDIyIFBlY3VsaWFyIFZlbnR1cmVzLCBMTENcbiAqIFxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICogXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKiBcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5jb25zdCBBUlJBWV9CVUZGRVJfTkFNRSA9IFwiW29iamVjdCBBcnJheUJ1ZmZlcl1cIjtcclxuY2xhc3MgQnVmZmVyU291cmNlQ29udmVydGVyIHtcclxuICAgIHN0YXRpYyBpc0FycmF5QnVmZmVyKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpID09PSBBUlJBWV9CVUZGRVJfTkFNRTtcclxuICAgIH1cclxuICAgIHN0YXRpYyB0b0FycmF5QnVmZmVyKGRhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0FycmF5QnVmZmVyKGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5ieXRlTGVuZ3RoID09PSBkYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9VaW50OEFycmF5KGRhdGEpLnNsaWNlKCkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHRvVWludDhBcnJheShkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9WaWV3KGRhdGEsIFVpbnQ4QXJyYXkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHRvVmlldyhkYXRhLCB0eXBlKSB7XHJcbiAgICAgICAgaWYgKGRhdGEuY29uc3RydWN0b3IgPT09IHR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzQXJyYXlCdWZmZXIoZGF0YSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyB0eXBlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IHR5cGUoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBwcm92aWRlZCB2YWx1ZSBpcyBub3Qgb2YgdHlwZSAnKEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyknXCIpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzQnVmZmVyU291cmNlKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKVxyXG4gICAgICAgICAgICB8fCB0aGlzLmlzQXJyYXlCdWZmZXIoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSlcclxuICAgICAgICAgICAgfHwgKGRhdGEgJiYgdGhpcy5pc0FycmF5QnVmZmVyKGRhdGEuYnVmZmVyKSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNFcXVhbChhLCBiKSB7XHJcbiAgICAgICAgY29uc3QgYVZpZXcgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGEpO1xyXG4gICAgICAgIGNvbnN0IGJWaWV3ID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShiKTtcclxuICAgICAgICBpZiAoYVZpZXcubGVuZ3RoICE9PSBiVmlldy5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVmlldy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYVZpZXdbaV0gIT09IGJWaWV3W2ldKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY29uY2F0KC4uLmFyZ3MpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xyXG4gICAgICAgICAgICBjb25zdCBidWZmZXJzID0gYXJnc1swXTtcclxuICAgICAgICAgICAgbGV0IHNpemUgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBzaXplICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudG9VaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgICAgICAgICByZXMuc2V0KHZpZXcsIG9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdmlldy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFyZ3NbMV0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvVmlldyhyZXMsIGFyZ3NbMV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuYnVmZmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uY2F0KGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBVdGY4Q29udmVydGVyIHtcclxuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHRleHQpIHtcclxuICAgICAgICBjb25zdCBzID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpKTtcclxuICAgICAgICBjb25zdCB1aW50QXJyYXkgPSBuZXcgVWludDhBcnJheShzLmxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHVpbnRBcnJheVtpXSA9IHMuY2hhckNvZGVBdChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVpbnRBcnJheS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgdG9TdHJpbmcoYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIGxldCBlbmNvZGVkU3RyaW5nID0gXCJcIjtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBlbmNvZGVkU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGVjb2RlZFN0cmluZyA9IGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZW5jb2RlZFN0cmluZykpO1xyXG4gICAgICAgIHJldHVybiBkZWNvZGVkU3RyaW5nO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIFV0ZjE2Q29udmVydGVyIHtcclxuICAgIHN0YXRpYyB0b1N0cmluZyhidWZmZXIsIGxpdHRsZUVuZGlhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihidWZmZXIpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcclxuICAgICAgICBsZXQgcmVzID0gXCJcIjtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5QnVmZmVyLmJ5dGVMZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICAgICAgICBjb25zdCBjb2RlID0gZGF0YVZpZXcuZ2V0VWludDE2KGksIGxpdHRsZUVuZGlhbik7XHJcbiAgICAgICAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21TdHJpbmcodGV4dCwgbGl0dGxlRW5kaWFuID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgQXJyYXlCdWZmZXIodGV4dC5sZW5ndGggKiAyKTtcclxuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhyZXMpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYoaSAqIDIsIHRleHQuY2hhckNvZGVBdChpKSwgbGl0dGxlRW5kaWFuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxufVxyXG5jbGFzcyBDb252ZXJ0IHtcclxuICAgIHN0YXRpYyBpc0hleChkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgICYmIC9eW2EtejAtOV0rJC9pLnRlc3QoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNCYXNlNjQoZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIlxyXG4gICAgICAgICAgICAmJiAvXig/OltBLVphLXowLTkrL117NH0pKig/OltBLVphLXowLTkrL117Mn09PXxbQS1aYS16MC05Ky9dezN9PSk/JC8udGVzdChkYXRhKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBpc0Jhc2U2NFVybChkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgICYmIC9eW2EtekEtWjAtOS1fXSskL2kudGVzdChkYXRhKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBUb1N0cmluZyhidWZmZXIsIGVuYyA9IFwidXRmOFwiKSB7XHJcbiAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIHN3aXRjaCAoZW5jLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjhcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlRvVXRmOFN0cmluZyhidWYpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub0JpbmFyeShidWYpO1xyXG4gICAgICAgICAgICBjYXNlIFwiaGV4XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub0hleChidWYpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub0Jhc2U2NChidWYpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYmFzZTY0dXJsXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub0Jhc2U2NFVybChidWYpO1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZsZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLnRvU3RyaW5nKGJ1ZiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNlwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZiZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLnRvU3RyaW5nKGJ1Zik7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSBvZiBlbmNvZGluZyAnJHtlbmN9J2ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBGcm9tU3RyaW5nKHN0ciwgZW5jID0gXCJ1dGY4XCIpIHtcclxuICAgICAgICBpZiAoIXN0cikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGVuYy50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGY4XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Gcm9tVXRmOFN0cmluZyhzdHIpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Gcm9tQmluYXJ5KHN0cik7XHJcbiAgICAgICAgICAgIGNhc2UgXCJoZXhcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkZyb21IZXgoc3RyKTtcclxuICAgICAgICAgICAgY2FzZSBcImJhc2U2NFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbUJhc2U2NChzdHIpO1xyXG4gICAgICAgICAgICBjYXNlIFwiYmFzZTY0dXJsXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Gcm9tQmFzZTY0VXJsKHN0cik7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNmxlXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIuZnJvbVN0cmluZyhzdHIsIHRydWUpO1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZcIjpcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2YmVcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci5mcm9tU3RyaW5nKHN0cik7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSBvZiBlbmNvZGluZyAnJHtlbmN9J2ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBUb0Jhc2U2NChidWZmZXIpIHtcclxuICAgICAgICBjb25zdCBidWYgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJpbmFyeSA9IHRoaXMuVG9TdHJpbmcoYnVmLCBcImJpbmFyeVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGJ0b2EoYmluYXJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShidWYpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBGcm9tQmFzZTY0KGJhc2U2NCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0U3RyaW5nKGJhc2U2NCk7XHJcbiAgICAgICAgaWYgKCFmb3JtYXR0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFDb252ZXJ0LmlzQmFzZTY0KGZvcm1hdHRlZCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50ICdiYXNlNjRUZXh0JyBpcyBub3QgQmFzZTY0IGVuY29kZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgYXRvYiAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5Gcm9tQmluYXJ5KGF0b2IoZm9ybWF0dGVkKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oZm9ybWF0dGVkLCBcImJhc2U2NFwiKSkuYnVmZmVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBGcm9tQmFzZTY0VXJsKGJhc2U2NHVybCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0U3RyaW5nKGJhc2U2NHVybCk7XHJcbiAgICAgICAgaWYgKCFmb3JtYXR0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFDb252ZXJ0LmlzQmFzZTY0VXJsKGZvcm1hdHRlZCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50ICdiYXNlNjR1cmwnIGlzIG5vdCBCYXNlNjRVcmwgZW5jb2RlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuRnJvbUJhc2U2NCh0aGlzLkJhc2U2NFBhZGRpbmcoZm9ybWF0dGVkLnJlcGxhY2UoL1xcLS9nLCBcIitcIikucmVwbGFjZSgvXFxfL2csIFwiL1wiKSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIFRvQmFzZTY0VXJsKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5Ub0Jhc2U2NChkYXRhKS5yZXBsYWNlKC9cXCsvZywgXCItXCIpLnJlcGxhY2UoL1xcLy9nLCBcIl9cIikucmVwbGFjZSgvXFw9L2csIFwiXCIpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIEZyb21VdGY4U3RyaW5nKHRleHQsIGVuY29kaW5nID0gQ29udmVydC5ERUZBVUxUX1VURjhfRU5DT0RJTkcpIHtcclxuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJhc2NpaVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbUJpbmFyeSh0ZXh0KTtcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjhcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGY4Q29udmVydGVyLmZyb21TdHJpbmcodGV4dCk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNlwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZiZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLmZyb21TdHJpbmcodGV4dCk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNmxlXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1c2MyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIuZnJvbVN0cmluZyh0ZXh0LCB0cnVlKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0eXBlIG9mIGVuY29kaW5nICcke2VuY29kaW5nfSdgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgVG9VdGY4U3RyaW5nKGJ1ZmZlciwgZW5jb2RpbmcgPSBDb252ZXJ0LkRFRkFVTFRfVVRGOF9FTkNPRElORykge1xyXG4gICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcclxuICAgICAgICAgICAgY2FzZSBcImFzY2lpXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub0JpbmFyeShidWZmZXIpO1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmOFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjhDb252ZXJ0ZXIudG9TdHJpbmcoYnVmZmVyKTtcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNmJlXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIudG9TdHJpbmcoYnVmZmVyKTtcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2bGVcIjpcclxuICAgICAgICAgICAgY2FzZSBcInVzYzJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci50b1N0cmluZyhidWZmZXIsIHRydWUpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgb2YgZW5jb2RpbmcgJyR7ZW5jb2Rpbmd9J2ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBGcm9tQmluYXJ5KHRleHQpIHtcclxuICAgICAgICBjb25zdCBzdHJpbmdMZW5ndGggPSB0ZXh0Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoc3RyaW5nTGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ0xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFZpZXdbaV0gPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRWaWV3LmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBUb0JpbmFyeShidWZmZXIpIHtcclxuICAgICAgICBjb25zdCBidWYgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgbGV0IHJlcyA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBUb0hleChidWZmZXIpIHtcclxuICAgICAgICBjb25zdCBidWYgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBcIlwiO1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGxlbiA9IGJ1Zi5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyID0gYnVmW2ldLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XHJcbiAgICAgICAgICAgIHJlcy5wdXNoKGNoYXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzLmpvaW4oc3BsaXR0ZXIpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIEZyb21IZXgoaGV4U3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0U3RyaW5nKGhleFN0cmluZyk7XHJcbiAgICAgICAgaWYgKCFmb3JtYXR0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFDb252ZXJ0LmlzSGV4KGZvcm1hdHRlZCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50ICdoZXhTdHJpbmcnIGlzIG5vdCBIRVggZW5jb2RlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZvcm1hdHRlZC5sZW5ndGggJSAyKSB7XHJcbiAgICAgICAgICAgIGZvcm1hdHRlZCA9IGAwJHtmb3JtYXR0ZWR9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoZm9ybWF0dGVkLmxlbmd0aCAvIDIpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSA9IGkgKyAyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGMgPSBmb3JtYXR0ZWQuc2xpY2UoaSwgaSArIDIpO1xyXG4gICAgICAgICAgICByZXNbaSAvIDJdID0gcGFyc2VJbnQoYywgMTYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBUb1V0ZjE2U3RyaW5nKGJ1ZmZlciwgbGl0dGxlRW5kaWFuID0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIudG9TdHJpbmcoYnVmZmVyLCBsaXR0bGVFbmRpYW4pO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIEZyb21VdGYxNlN0cmluZyh0ZXh0LCBsaXR0bGVFbmRpYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci5mcm9tU3RyaW5nKHRleHQsIGxpdHRsZUVuZGlhbik7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgQmFzZTY0UGFkZGluZyhiYXNlNjQpIHtcclxuICAgICAgICBjb25zdCBwYWRDb3VudCA9IDQgLSAoYmFzZTY0Lmxlbmd0aCAlIDQpO1xyXG4gICAgICAgIGlmIChwYWRDb3VudCA8IDQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBiYXNlNjQgKz0gXCI9XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJhc2U2NDtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmb3JtYXRTdHJpbmcoZGF0YSkge1xyXG4gICAgICAgIHJldHVybiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhLnJlcGxhY2UoL1tcXG5cXHJcXHQgXS9nLCBcIlwiKSkgfHwgXCJcIjtcclxuICAgIH1cclxufVxyXG5Db252ZXJ0LkRFRkFVTFRfVVRGOF9FTkNPRElORyA9IFwidXRmOFwiO1xuXG5mdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCAuLi5zb3VyY2VzKSB7XHJcbiAgICBjb25zdCByZXMgPSBhcmd1bWVudHNbMF07XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIHJlc1twcm9wXSA9IG9ialtwcm9wXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59XHJcbmZ1bmN0aW9uIGNvbWJpbmUoLi4uYnVmKSB7XHJcbiAgICBjb25zdCB0b3RhbEJ5dGVMZW5ndGggPSBidWYubWFwKChpdGVtKSA9PiBpdGVtLmJ5dGVMZW5ndGgpLnJlZHVjZSgocHJldiwgY3VyKSA9PiBwcmV2ICsgY3VyKTtcclxuICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KHRvdGFsQnl0ZUxlbmd0aCk7XHJcbiAgICBsZXQgY3VycmVudFBvcyA9IDA7XHJcbiAgICBidWYubWFwKChpdGVtKSA9PiBuZXcgVWludDhBcnJheShpdGVtKSkuZm9yRWFjaCgoYXJyKSA9PiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtMiBvZiBhcnIpIHtcclxuICAgICAgICAgICAgcmVzW2N1cnJlbnRQb3MrK10gPSBpdGVtMjtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXMuYnVmZmVyO1xyXG59XHJcbmZ1bmN0aW9uIGlzRXF1YWwoYnl0ZXMxLCBieXRlczIpIHtcclxuICAgIGlmICghKGJ5dGVzMSAmJiBieXRlczIpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKGJ5dGVzMS5ieXRlTGVuZ3RoICE9PSBieXRlczIuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGIxID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMxKTtcclxuICAgIGNvbnN0IGIyID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMyKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMxLmJ5dGVMZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChiMVtpXSAhPT0gYjJbaV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XG5cbmV4cG9ydHMuQnVmZmVyU291cmNlQ29udmVydGVyID0gQnVmZmVyU291cmNlQ29udmVydGVyO1xuZXhwb3J0cy5Db252ZXJ0ID0gQ29udmVydDtcbmV4cG9ydHMuYXNzaWduID0gYXNzaWduO1xuZXhwb3J0cy5jb21iaW5lID0gY29tYmluZTtcbmV4cG9ydHMuaXNFcXVhbCA9IGlzRXF1YWw7XG4iLCAiLyohXG4gQ29weXJpZ2h0IChjKSBQZWN1bGlhciBWZW50dXJlcywgTExDXG4qL1xuXG5mdW5jdGlvbiBnZXRVVENEYXRlKGRhdGUpIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSArIChkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMCkpO1xyXG59XHJcbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnNWYWx1ZShwYXJhbWV0ZXJzLCBuYW1lLCBkZWZhdWx0VmFsdWUpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGlmICgocGFyYW1ldGVycyBpbnN0YW5jZW9mIE9iamVjdCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiAoX2EgPSBwYXJhbWV0ZXJzW25hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBkZWZhdWx0VmFsdWU7XHJcbn1cclxuZnVuY3Rpb24gYnVmZmVyVG9IZXhDb2RlcyhpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQgPSAwLCBpbnB1dExlbmd0aCA9IChpbnB1dEJ1ZmZlci5ieXRlTGVuZ3RoIC0gaW5wdXRPZmZzZXQpLCBpbnNlcnRTcGFjZSA9IGZhbHNlKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiAobmV3IFVpbnQ4QXJyYXkoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyID0gaXRlbS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCArPSBzdHI7XHJcbiAgICAgICAgaWYgKGluc2VydFNwYWNlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIiBcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0LnRyaW0oKTtcclxufVxyXG5mdW5jdGlvbiBjaGVja0J1ZmZlclBhcmFtcyhiYXNlQmxvY2ssIGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgIGlmICghKGlucHV0QnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJXcm9uZyBwYXJhbWV0ZXI6IGlucHV0QnVmZmVyIG11c3QgYmUgXFxcIkFycmF5QnVmZmVyXFxcIlwiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICghaW5wdXRCdWZmZXIuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgIGJhc2VCbG9jay5lcnJvciA9IFwiV3JvbmcgcGFyYW1ldGVyOiBpbnB1dEJ1ZmZlciBoYXMgemVybyBsZW5ndGhcIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRPZmZzZXQgPCAwKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJXcm9uZyBwYXJhbWV0ZXI6IGlucHV0T2Zmc2V0IGxlc3MgdGhhbiB6ZXJvXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0TGVuZ3RoIDwgMCkge1xyXG4gICAgICAgIGJhc2VCbG9jay5lcnJvciA9IFwiV3JvbmcgcGFyYW1ldGVyOiBpbnB1dExlbmd0aCBsZXNzIHRoYW4gemVyb1wiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICgoaW5wdXRCdWZmZXIuYnl0ZUxlbmd0aCAtIGlucHV0T2Zmc2V0IC0gaW5wdXRMZW5ndGgpIDwgMCkge1xyXG4gICAgICAgIGJhc2VCbG9jay5lcnJvciA9IFwiRW5kIG9mIGlucHV0IHJlYWNoZWQgYmVmb3JlIG1lc3NhZ2Ugd2FzIGZ1bGx5IGRlY29kZWQgKGluY29uc2lzdGVudCBvZmZzZXQgYW5kIGxlbmd0aCB2YWx1ZXMpXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuZnVuY3Rpb24gdXRpbEZyb21CYXNlKGlucHV0QnVmZmVyLCBpbnB1dEJhc2UpIHtcclxuICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgaWYgKGlucHV0QnVmZmVyLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIHJldHVybiBpbnB1dEJ1ZmZlclswXTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAoaW5wdXRCdWZmZXIubGVuZ3RoIC0gMSk7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgcmVzdWx0ICs9IGlucHV0QnVmZmVyWyhpbnB1dEJ1ZmZlci5sZW5ndGggLSAxKSAtIGldICogTWF0aC5wb3coMiwgaW5wdXRCYXNlICogaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbmZ1bmN0aW9uIHV0aWxUb0Jhc2UodmFsdWUsIGJhc2UsIHJlc2VydmVkID0gKC0xKSkge1xyXG4gICAgY29uc3QgaW50ZXJuYWxSZXNlcnZlZCA9IHJlc2VydmVkO1xyXG4gICAgbGV0IGludGVybmFsVmFsdWUgPSB2YWx1ZTtcclxuICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgbGV0IGJpZ2dlc3QgPSBNYXRoLnBvdygyLCBiYXNlKTtcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgODsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgYmlnZ2VzdCkge1xyXG4gICAgICAgICAgICBsZXQgcmV0QnVmO1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxSZXNlcnZlZCA8IDApIHtcclxuICAgICAgICAgICAgICAgIHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihpKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxSZXNlcnZlZCA8IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBcnJheUJ1ZmZlcigwKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXRCdWYgPSBuZXcgQXJyYXlCdWZmZXIoaW50ZXJuYWxSZXNlcnZlZCk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpbnRlcm5hbFJlc2VydmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gKGkgLSAxKTsgaiA+PSAwOyBqLS0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2lzID0gTWF0aC5wb3coMiwgaiAqIGJhc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tyZXN1bHQgLSBqIC0gMV0gPSBNYXRoLmZsb29yKGludGVybmFsVmFsdWUgLyBiYXNpcyk7XHJcbiAgICAgICAgICAgICAgICBpbnRlcm5hbFZhbHVlIC09IChyZXRWaWV3W3Jlc3VsdCAtIGogLSAxXSkgKiBiYXNpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0QnVmO1xyXG4gICAgICAgIH1cclxuICAgICAgICBiaWdnZXN0ICo9IE1hdGgucG93KDIsIGJhc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcclxufVxyXG5mdW5jdGlvbiB1dGlsQ29uY2F0QnVmKC4uLmJ1ZmZlcnMpIHtcclxuICAgIGxldCBvdXRwdXRMZW5ndGggPSAwO1xyXG4gICAgbGV0IHByZXZMZW5ndGggPSAwO1xyXG4gICAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xyXG4gICAgICAgIG91dHB1dExlbmd0aCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgIH1cclxuICAgIGNvbnN0IHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihvdXRwdXRMZW5ndGgpO1xyXG4gICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XHJcbiAgICAgICAgcmV0Vmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSwgcHJldkxlbmd0aCk7XHJcbiAgICAgICAgcHJldkxlbmd0aCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRCdWY7XHJcbn1cclxuZnVuY3Rpb24gdXRpbENvbmNhdFZpZXcoLi4udmlld3MpIHtcclxuICAgIGxldCBvdXRwdXRMZW5ndGggPSAwO1xyXG4gICAgbGV0IHByZXZMZW5ndGggPSAwO1xyXG4gICAgZm9yIChjb25zdCB2aWV3IG9mIHZpZXdzKSB7XHJcbiAgICAgICAgb3V0cHV0TGVuZ3RoICs9IHZpZXcubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmV0QnVmID0gbmV3IEFycmF5QnVmZmVyKG91dHB1dExlbmd0aCk7XHJcbiAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmV0QnVmKTtcclxuICAgIGZvciAoY29uc3QgdmlldyBvZiB2aWV3cykge1xyXG4gICAgICAgIHJldFZpZXcuc2V0KHZpZXcsIHByZXZMZW5ndGgpO1xyXG4gICAgICAgIHByZXZMZW5ndGggKz0gdmlldy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmlldztcclxufVxyXG5mdW5jdGlvbiB1dGlsRGVjb2RlVEMoKSB7XHJcbiAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheSh0aGlzLnZhbHVlSGV4KTtcclxuICAgIGlmICh0aGlzLnZhbHVlSGV4LmJ5dGVMZW5ndGggPj0gMikge1xyXG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbjEgPSAoYnVmWzBdID09PSAweEZGKSAmJiAoYnVmWzFdICYgMHg4MCk7XHJcbiAgICAgICAgY29uc3QgY29uZGl0aW9uMiA9IChidWZbMF0gPT09IDB4MDApICYmICgoYnVmWzFdICYgMHg4MCkgPT09IDB4MDApO1xyXG4gICAgICAgIGlmIChjb25kaXRpb24xIHx8IGNvbmRpdGlvbjIpIHtcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiTmVlZGxlc3NseSBsb25nIGZvcm1hdFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBiaWdJbnRCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy52YWx1ZUhleC5ieXRlTGVuZ3RoKTtcclxuICAgIGNvbnN0IGJpZ0ludFZpZXcgPSBuZXcgVWludDhBcnJheShiaWdJbnRCdWZmZXIpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlSGV4LmJ5dGVMZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGJpZ0ludFZpZXdbaV0gPSAwO1xyXG4gICAgfVxyXG4gICAgYmlnSW50Vmlld1swXSA9IChidWZbMF0gJiAweDgwKTtcclxuICAgIGNvbnN0IGJpZ0ludCA9IHV0aWxGcm9tQmFzZShiaWdJbnRWaWV3LCA4KTtcclxuICAgIGNvbnN0IHNtYWxsSW50QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXguYnl0ZUxlbmd0aCk7XHJcbiAgICBjb25zdCBzbWFsbEludFZpZXcgPSBuZXcgVWludDhBcnJheShzbWFsbEludEJ1ZmZlcik7XHJcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMudmFsdWVIZXguYnl0ZUxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgc21hbGxJbnRWaWV3W2pdID0gYnVmW2pdO1xyXG4gICAgfVxyXG4gICAgc21hbGxJbnRWaWV3WzBdICY9IDB4N0Y7XHJcbiAgICBjb25zdCBzbWFsbEludCA9IHV0aWxGcm9tQmFzZShzbWFsbEludFZpZXcsIDgpO1xyXG4gICAgcmV0dXJuIChzbWFsbEludCAtIGJpZ0ludCk7XHJcbn1cclxuZnVuY3Rpb24gdXRpbEVuY29kZVRDKHZhbHVlKSB7XHJcbiAgICBjb25zdCBtb2RWYWx1ZSA9ICh2YWx1ZSA8IDApID8gKHZhbHVlICogKC0xKSkgOiB2YWx1ZTtcclxuICAgIGxldCBiaWdJbnQgPSAxMjg7XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IDg7IGkrKykge1xyXG4gICAgICAgIGlmIChtb2RWYWx1ZSA8PSBiaWdJbnQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc21hbGxJbnQgPSBiaWdJbnQgLSBtb2RWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldEJ1ZiA9IHV0aWxUb0Jhc2Uoc21hbGxJbnQsIDgsIGkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICAgICAgICAgICAgICByZXRWaWV3WzBdIHw9IDB4ODA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0QnVmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCByZXRCdWYgPSB1dGlsVG9CYXNlKG1vZFZhbHVlLCA4LCBpKTtcclxuICAgICAgICAgICAgbGV0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICBpZiAocmV0Vmlld1swXSAmIDB4ODApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBCdWYgPSByZXRCdWYuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wVmlldyA9IG5ldyBVaW50OEFycmF5KHRlbXBCdWYpO1xyXG4gICAgICAgICAgICAgICAgcmV0QnVmID0gbmV3IEFycmF5QnVmZmVyKHJldEJ1Zi5ieXRlTGVuZ3RoICsgMSk7XHJcbiAgICAgICAgICAgICAgICByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmV0QnVmKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGVtcEJ1Zi5ieXRlTGVuZ3RoOyBrKyspIHtcclxuICAgICAgICAgICAgICAgICAgICByZXRWaWV3W2sgKyAxXSA9IHRlbXBWaWV3W2tdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1swXSA9IDB4MDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmlnSW50ICo9IE1hdGgucG93KDIsIDgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChuZXcgQXJyYXlCdWZmZXIoMCkpO1xyXG59XHJcbmZ1bmN0aW9uIGlzRXF1YWxCdWZmZXIoaW5wdXRCdWZmZXIxLCBpbnB1dEJ1ZmZlcjIpIHtcclxuICAgIGlmIChpbnB1dEJ1ZmZlcjEuYnl0ZUxlbmd0aCAhPT0gaW5wdXRCdWZmZXIyLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCB2aWV3MSA9IG5ldyBVaW50OEFycmF5KGlucHV0QnVmZmVyMSk7XHJcbiAgICBjb25zdCB2aWV3MiA9IG5ldyBVaW50OEFycmF5KGlucHV0QnVmZmVyMik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZXcxLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHZpZXcxW2ldICE9PSB2aWV3MltpXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuZnVuY3Rpb24gcGFkTnVtYmVyKGlucHV0TnVtYmVyLCBmdWxsTGVuZ3RoKSB7XHJcbiAgICBjb25zdCBzdHIgPSBpbnB1dE51bWJlci50b1N0cmluZygxMCk7XHJcbiAgICBpZiAoZnVsbExlbmd0aCA8IHN0ci5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRpZiA9IGZ1bGxMZW5ndGggLSBzdHIubGVuZ3RoO1xyXG4gICAgY29uc3QgcGFkZGluZyA9IG5ldyBBcnJheShkaWYpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWY7IGkrKykge1xyXG4gICAgICAgIHBhZGRpbmdbaV0gPSBcIjBcIjtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhZGRpbmdTdHJpbmcgPSBwYWRkaW5nLmpvaW4oXCJcIik7XHJcbiAgICByZXR1cm4gcGFkZGluZ1N0cmluZy5jb25jYXQoc3RyKTtcclxufVxyXG5jb25zdCBiYXNlNjRUZW1wbGF0ZSA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIjtcclxuY29uc3QgYmFzZTY0VXJsVGVtcGxhdGUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV89XCI7XHJcbmZ1bmN0aW9uIHRvQmFzZTY0KGlucHV0LCB1c2VVcmxUZW1wbGF0ZSA9IGZhbHNlLCBza2lwUGFkZGluZyA9IGZhbHNlLCBza2lwTGVhZGluZ1plcm9zID0gZmFsc2UpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBmbGFnMSA9IDA7XHJcbiAgICBsZXQgZmxhZzIgPSAwO1xyXG4gICAgbGV0IG91dHB1dCA9IFwiXCI7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZSA9ICh1c2VVcmxUZW1wbGF0ZSkgPyBiYXNlNjRVcmxUZW1wbGF0ZSA6IGJhc2U2NFRlbXBsYXRlO1xyXG4gICAgaWYgKHNraXBMZWFkaW5nWmVyb3MpIHtcclxuICAgICAgICBsZXQgbm9uWmVyb1Bvc2l0aW9uID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KGkpICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBub25aZXJvUG9zaXRpb24gPSBpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaW5wdXQgPSBpbnB1dC5zbGljZShub25aZXJvUG9zaXRpb24pO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgIGlmIChpID49IGlucHV0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmbGFnMSA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNocjIgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XHJcbiAgICAgICAgaWYgKGkgPj0gaW5wdXQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGZsYWcyID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2hyMyA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICBjb25zdCBlbmMxID0gY2hyMSA+PiAyO1xyXG4gICAgICAgIGNvbnN0IGVuYzIgPSAoKGNocjEgJiAweDAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xyXG4gICAgICAgIGxldCBlbmMzID0gKChjaHIyICYgMHgwRikgPDwgMikgfCAoY2hyMyA+PiA2KTtcclxuICAgICAgICBsZXQgZW5jNCA9IGNocjMgJiAweDNGO1xyXG4gICAgICAgIGlmIChmbGFnMSA9PT0gMSkge1xyXG4gICAgICAgICAgICBlbmMzID0gZW5jNCA9IDY0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGZsYWcyID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBlbmM0ID0gNjQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNraXBQYWRkaW5nKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmMzID09PSA2NCkge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGAke3RlbXBsYXRlLmNoYXJBdChlbmMxKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMyKX1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYzQgPT09IDY0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGAke3RlbXBsYXRlLmNoYXJBdChlbmMxKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMyKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMzKX1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGAke3RlbXBsYXRlLmNoYXJBdChlbmMxKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMyKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMzKX0ke3RlbXBsYXRlLmNoYXJBdChlbmM0KX1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gYCR7dGVtcGxhdGUuY2hhckF0KGVuYzEpfSR7dGVtcGxhdGUuY2hhckF0KGVuYzIpfSR7dGVtcGxhdGUuY2hhckF0KGVuYzMpfSR7dGVtcGxhdGUuY2hhckF0KGVuYzQpfWA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxufVxyXG5mdW5jdGlvbiBmcm9tQmFzZTY0KGlucHV0LCB1c2VVcmxUZW1wbGF0ZSA9IGZhbHNlLCBjdXRUYWlsWmVyb3MgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgdGVtcGxhdGUgPSAodXNlVXJsVGVtcGxhdGUpID8gYmFzZTY0VXJsVGVtcGxhdGUgOiBiYXNlNjRUZW1wbGF0ZTtcclxuICAgIGZ1bmN0aW9uIGluZGV4T2YodG9TZWFyY2gpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY0OyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdChpKSA9PT0gdG9TZWFyY2gpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDY0O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdGVzdChpbmNvbWluZykge1xyXG4gICAgICAgIHJldHVybiAoKGluY29taW5nID09PSA2NCkgPyAweDAwIDogaW5jb21pbmcpO1xyXG4gICAgfVxyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IG91dHB1dCA9IFwiXCI7XHJcbiAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGVuYzEgPSBpbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcclxuICAgICAgICBjb25zdCBlbmMyID0gKGkgPj0gaW5wdXQubGVuZ3RoKSA/IDB4MDAgOiBpbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcclxuICAgICAgICBjb25zdCBlbmMzID0gKGkgPj0gaW5wdXQubGVuZ3RoKSA/IDB4MDAgOiBpbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcclxuICAgICAgICBjb25zdCBlbmM0ID0gKGkgPj0gaW5wdXQubGVuZ3RoKSA/IDB4MDAgOiBpbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcclxuICAgICAgICBjb25zdCBjaHIxID0gKHRlc3QoZW5jMSkgPDwgMikgfCAodGVzdChlbmMyKSA+PiA0KTtcclxuICAgICAgICBjb25zdCBjaHIyID0gKCh0ZXN0KGVuYzIpICYgMHgwRikgPDwgNCkgfCAodGVzdChlbmMzKSA+PiAyKTtcclxuICAgICAgICBjb25zdCBjaHIzID0gKCh0ZXN0KGVuYzMpICYgMHgwMykgPDwgNikgfCB0ZXN0KGVuYzQpO1xyXG4gICAgICAgIG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjEpO1xyXG4gICAgICAgIGlmIChlbmMzICE9PSA2NCkge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVuYzQgIT09IDY0KSB7XHJcbiAgICAgICAgICAgIG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjdXRUYWlsWmVyb3MpIHtcclxuICAgICAgICBjb25zdCBvdXRwdXRMZW5ndGggPSBvdXRwdXQubGVuZ3RoO1xyXG4gICAgICAgIGxldCBub25aZXJvU3RhcnQgPSAoLTEpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAob3V0cHV0TGVuZ3RoIC0gMSk7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGlmIChvdXRwdXQuY2hhckNvZGVBdChpKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbm9uWmVyb1N0YXJ0ID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub25aZXJvU3RhcnQgIT09ICgtMSkpIHtcclxuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnNsaWNlKDAsIG5vblplcm9TdGFydCArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0ID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0cHV0O1xyXG59XHJcbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9TdHJpbmcoYnVmZmVyKSB7XHJcbiAgICBsZXQgcmVzdWx0U3RyaW5nID0gXCJcIjtcclxuICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZpZXcpIHtcclxuICAgICAgICByZXN1bHRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShlbGVtZW50KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRTdHJpbmc7XHJcbn1cclxuZnVuY3Rpb24gc3RyaW5nVG9BcnJheUJ1ZmZlcihzdHIpIHtcclxuICAgIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHN0ci5sZW5ndGg7XHJcbiAgICBjb25zdCByZXN1bHRCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc3RyaW5nTGVuZ3RoKTtcclxuICAgIGNvbnN0IHJlc3VsdFZpZXcgPSBuZXcgVWludDhBcnJheShyZXN1bHRCdWZmZXIpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmdMZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHJlc3VsdFZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRCdWZmZXI7XHJcbn1cclxuY29uc3QgbG9nMiA9IE1hdGgubG9nKDIpO1xyXG5mdW5jdGlvbiBuZWFyZXN0UG93ZXJPZjIobGVuZ3RoKSB7XHJcbiAgICBjb25zdCBiYXNlID0gKE1hdGgubG9nKGxlbmd0aCkgLyBsb2cyKTtcclxuICAgIGNvbnN0IGZsb29yID0gTWF0aC5mbG9vcihiYXNlKTtcclxuICAgIGNvbnN0IHJvdW5kID0gTWF0aC5yb3VuZChiYXNlKTtcclxuICAgIHJldHVybiAoKGZsb29yID09PSByb3VuZCkgPyBmbG9vciA6IHJvdW5kKTtcclxufVxyXG5mdW5jdGlvbiBjbGVhclByb3BzKG9iamVjdCwgcHJvcHNBcnJheSkge1xyXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzQXJyYXkpIHtcclxuICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BdO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IGFycmF5QnVmZmVyVG9TdHJpbmcsIGJ1ZmZlclRvSGV4Q29kZXMsIGNoZWNrQnVmZmVyUGFyYW1zLCBjbGVhclByb3BzLCBmcm9tQmFzZTY0LCBnZXRQYXJhbWV0ZXJzVmFsdWUsIGdldFVUQ0RhdGUsIGlzRXF1YWxCdWZmZXIsIG5lYXJlc3RQb3dlck9mMiwgcGFkTnVtYmVyLCBzdHJpbmdUb0FycmF5QnVmZmVyLCB0b0Jhc2U2NCwgdXRpbENvbmNhdEJ1ZiwgdXRpbENvbmNhdFZpZXcsIHV0aWxEZWNvZGVUQywgdXRpbEVuY29kZVRDLCB1dGlsRnJvbUJhc2UsIHV0aWxUb0Jhc2UgfTtcbiIsICIvKiFcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgR01PIEdsb2JhbFNpZ25cbiAqIENvcHlyaWdodCAoYykgMjAxNS0yMDIyLCBQZWN1bGlhciBWZW50dXJlc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFxuICogQXV0aG9yIDIwMTQtMjAxOSwgWXVyeSBTdHJvemhldnNreVxuICogXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICogXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIFxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yXG4gKiAgIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiBcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICogXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbiAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKiBcbiAqL1xuXG5pbXBvcnQgKiBhcyBwdnRzdXRpbHMgZnJvbSAncHZ0c3V0aWxzJztcbmltcG9ydCAqIGFzIHB2dXRpbHMgZnJvbSAncHZ1dGlscyc7XG5cbmZ1bmN0aW9uIGFzc2VydEJpZ0ludCgpIHtcclxuICAgIGlmICh0eXBlb2YgQmlnSW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmlnSW50IGlzIG5vdCBkZWZpbmVkLiBZb3VyIGVudmlyb25tZW50IGRvZXNuJ3QgaW1wbGVtZW50IEJpZ0ludC5cIik7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gY29uY2F0KGJ1ZmZlcnMpIHtcclxuICAgIGxldCBvdXRwdXRMZW5ndGggPSAwO1xyXG4gICAgbGV0IHByZXZMZW5ndGggPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYnVmZmVyc1tpXTtcclxuICAgICAgICBvdXRwdXRMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGJ1ZmZlcnNbaV07XHJcbiAgICAgICAgcmV0Vmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSwgcHJldkxlbmd0aCk7XHJcbiAgICAgICAgcHJldkxlbmd0aCArPSBidWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRWaWV3LmJ1ZmZlcjtcclxufVxyXG5mdW5jdGlvbiBjaGVja0J1ZmZlclBhcmFtcyhiYXNlQmxvY2ssIGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgIGlmICghKGlucHV0QnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRCdWZmZXIgbXVzdCBiZSAnVWludDhBcnJheSdcIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlucHV0QnVmZmVyLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRCdWZmZXIgaGFzIHplcm8gbGVuZ3RoXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0T2Zmc2V0IDwgMCkge1xyXG4gICAgICAgIGJhc2VCbG9jay5lcnJvciA9IFwiV3JvbmcgcGFyYW1ldGVyOiBpbnB1dE9mZnNldCBsZXNzIHRoYW4gemVyb1wiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dExlbmd0aCA8IDApIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRMZW5ndGggbGVzcyB0aGFuIHplcm9cIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoKGlucHV0QnVmZmVyLmJ5dGVMZW5ndGggLSBpbnB1dE9mZnNldCAtIGlucHV0TGVuZ3RoKSA8IDApIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIkVuZCBvZiBpbnB1dCByZWFjaGVkIGJlZm9yZSBtZXNzYWdlIHdhcyBmdWxseSBkZWNvZGVkIChpbmNvbnNpc3RlbnQgb2Zmc2V0IGFuZCBsZW5ndGggdmFsdWVzKVwiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XG5cbmNsYXNzIFZpZXdXcml0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgd3JpdGUoYnVmKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGJ1Zik7XHJcbiAgICB9XHJcbiAgICBmaW5hbCgpIHtcclxuICAgICAgICByZXR1cm4gY29uY2F0KHRoaXMuaXRlbXMpO1xyXG4gICAgfVxyXG59XG5cbmNvbnN0IHBvd2VyczIgPSBbbmV3IFVpbnQ4QXJyYXkoWzFdKV07XHJcbmNvbnN0IGRpZ2l0c1N0cmluZyA9IFwiMDEyMzQ1Njc4OVwiO1xyXG5jb25zdCBOQU1FID0gXCJuYW1lXCI7XHJcbmNvbnN0IFZBTFVFX0hFWF9WSUVXID0gXCJ2YWx1ZUhleFZpZXdcIjtcclxuY29uc3QgSVNfSEVYX09OTFkgPSBcImlzSGV4T25seVwiO1xyXG5jb25zdCBJRF9CTE9DSyA9IFwiaWRCbG9ja1wiO1xyXG5jb25zdCBUQUdfQ0xBU1MgPSBcInRhZ0NsYXNzXCI7XHJcbmNvbnN0IFRBR19OVU1CRVIgPSBcInRhZ051bWJlclwiO1xyXG5jb25zdCBJU19DT05TVFJVQ1RFRCA9IFwiaXNDb25zdHJ1Y3RlZFwiO1xyXG5jb25zdCBGUk9NX0JFUiA9IFwiZnJvbUJFUlwiO1xyXG5jb25zdCBUT19CRVIgPSBcInRvQkVSXCI7XHJcbmNvbnN0IExPQ0FMID0gXCJsb2NhbFwiO1xyXG5jb25zdCBFTVBUWV9TVFJJTkcgPSBcIlwiO1xyXG5jb25zdCBFTVBUWV9CVUZGRVIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbmNvbnN0IEVNUFRZX1ZJRVcgPSBuZXcgVWludDhBcnJheSgwKTtcclxuY29uc3QgRU5EX09GX0NPTlRFTlRfTkFNRSA9IFwiRW5kT2ZDb250ZW50XCI7XHJcbmNvbnN0IE9DVEVUX1NUUklOR19OQU1FID0gXCJPQ1RFVCBTVFJJTkdcIjtcclxuY29uc3QgQklUX1NUUklOR19OQU1FID0gXCJCSVQgU1RSSU5HXCI7XG5cbmZ1bmN0aW9uIEhleEJsb2NrKEJhc2VDbGFzcykge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgcmV0dXJuIF9hID0gY2xhc3MgU29tZSBleHRlbmRzIEJhc2VDbGFzcyB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcclxuICAgICAgICAgICAgICAgIHZhciBfYTtcclxuICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gYXJnc1swXSB8fCB7fTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gKF9hID0gcGFyYW1zLmlzSGV4T25seSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHBhcmFtcy52YWx1ZUhleCA/IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHBhcmFtcy52YWx1ZUhleCkgOiBFTVBUWV9WSUVXO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdldCB2YWx1ZUhleCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXQgdmFsdWVIZXgodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IGlucHV0QnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBuZXcgVWludDhBcnJheShpbnB1dEJ1ZmZlcikgOiBpbnB1dEJ1ZmZlcjtcclxuICAgICAgICAgICAgICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXModGhpcywgdmlldywgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZExlbmd0aCA9IGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHZpZXcuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGVuZExlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmFsdWVIZXhWaWV3Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIlplcm8gYnVmZmVyIGxlbmd0aFwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gaW5wdXRMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kTGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRvQkVSKHNpemVPbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0hleE9ubHkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJGbGFnICdpc0hleE9ubHknIGlzIG5vdCBzZXQsIGFib3J0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JVRkZFUjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzaXplT25seSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIodGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGggPT09IHRoaXMudmFsdWVIZXhWaWV3LmJ1ZmZlci5ieXRlTGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy52YWx1ZUhleFZpZXcuYnVmZmVyXHJcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSGV4T25seTogdGhpcy5pc0hleE9ubHksXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVIZXg6IHB2dHN1dGlscy5Db252ZXJ0LlRvSGV4KHRoaXMudmFsdWVIZXhWaWV3KSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIF9hLk5BTUUgPSBcImhleEJsb2NrXCIsXHJcbiAgICAgICAgX2E7XHJcbn1cblxuY2xhc3MgTG9jYWxCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyBibG9ja0xlbmd0aCA9IDAsIGVycm9yID0gRU1QVFlfU1RSSU5HLCB3YXJuaW5ncyA9IFtdLCB2YWx1ZUJlZm9yZURlY29kZSA9IEVNUFRZX1ZJRVcsIH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSBibG9ja0xlbmd0aDtcclxuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgdGhpcy53YXJuaW5ncyA9IHdhcm5pbmdzO1xyXG4gICAgICAgIHRoaXMudmFsdWVCZWZvcmVEZWNvZGVWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkodmFsdWVCZWZvcmVEZWNvZGUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGJsb2NrTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5OQU1FO1xyXG4gICAgfVxyXG4gICAgZ2V0IHZhbHVlQmVmb3JlRGVjb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHNldCB2YWx1ZUJlZm9yZURlY29kZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudmFsdWVCZWZvcmVEZWNvZGVWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJsb2NrTmFtZTogdGhpcy5jb25zdHJ1Y3Rvci5OQU1FLFxyXG4gICAgICAgICAgICBibG9ja0xlbmd0aDogdGhpcy5ibG9ja0xlbmd0aCxcclxuICAgICAgICAgICAgZXJyb3I6IHRoaXMuZXJyb3IsXHJcbiAgICAgICAgICAgIHdhcm5pbmdzOiB0aGlzLndhcm5pbmdzLFxyXG4gICAgICAgICAgICB2YWx1ZUJlZm9yZURlY29kZTogcHZ0c3V0aWxzLkNvbnZlcnQuVG9IZXgodGhpcy52YWx1ZUJlZm9yZURlY29kZVZpZXcpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuTG9jYWxCYXNlQmxvY2suTkFNRSA9IFwiYmFzZUJsb2NrXCI7XG5cbmNsYXNzIFZhbHVlQmxvY2sgZXh0ZW5kcyBMb2NhbEJhc2VCbG9jayB7XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJVc2VyIG5lZWQgdG8gbWFrZSBhIHNwZWNpZmljIGZ1bmN0aW9uIGluIGEgY2xhc3Mgd2hpY2ggZXh0ZW5kcyAnVmFsdWVCbG9jaydcIik7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSwgd3JpdGVyKSB7XHJcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiVXNlciBuZWVkIHRvIG1ha2UgYSBzcGVjaWZpYyBmdW5jdGlvbiBpbiBhIGNsYXNzIHdoaWNoIGV4dGVuZHMgJ1ZhbHVlQmxvY2snXCIpO1xyXG4gICAgfVxyXG59XHJcblZhbHVlQmxvY2suTkFNRSA9IFwidmFsdWVCbG9ja1wiO1xuXG5jbGFzcyBMb2NhbElkZW50aWZpY2F0aW9uQmxvY2sgZXh0ZW5kcyBIZXhCbG9jayhMb2NhbEJhc2VCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyBpZEJsb2NrID0ge30sIH0gPSB7fSkge1xyXG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIGlmIChpZEJsb2NrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gKF9hID0gaWRCbG9jay5pc0hleE9ubHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IGlkQmxvY2sudmFsdWVIZXggPyBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpZEJsb2NrLnZhbHVlSGV4KSA6IEVNUFRZX1ZJRVc7XHJcbiAgICAgICAgICAgIHRoaXMudGFnQ2xhc3MgPSAoX2IgPSBpZEJsb2NrLnRhZ0NsYXNzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAtMTtcclxuICAgICAgICAgICAgdGhpcy50YWdOdW1iZXIgPSAoX2MgPSBpZEJsb2NrLnRhZ051bWJlcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogLTE7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25zdHJ1Y3RlZCA9IChfZCA9IGlkQmxvY2suaXNDb25zdHJ1Y3RlZCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRhZ0NsYXNzID0gLTE7XHJcbiAgICAgICAgICAgIHRoaXMudGFnTnVtYmVyID0gLTE7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25zdHJ1Y3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgZmlyc3RPY3RldCA9IDA7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnRhZ0NsYXNzKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIGZpcnN0T2N0ZXQgfD0gMHgwMDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBmaXJzdE9jdGV0IHw9IDB4NDA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgZmlyc3RPY3RldCB8PSAweDgwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgIGZpcnN0T2N0ZXQgfD0gMHhDMDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiVW5rbm93biB0YWcgY2xhc3NcIjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29uc3RydWN0ZWQpXHJcbiAgICAgICAgICAgIGZpcnN0T2N0ZXQgfD0gMHgyMDtcclxuICAgICAgICBpZiAodGhpcy50YWdOdW1iZXIgPCAzMSAmJiAhdGhpcy5pc0hleE9ubHkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KDEpO1xyXG4gICAgICAgICAgICBpZiAoIXNpemVPbmx5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyID0gdGhpcy50YWdOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICBudW1iZXIgJj0gMHgxRjtcclxuICAgICAgICAgICAgICAgIGZpcnN0T2N0ZXQgfD0gbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1swXSA9IGZpcnN0T2N0ZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJldFZpZXcuYnVmZmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRCdWYgPSBwdnV0aWxzLnV0aWxUb0Jhc2UodGhpcy50YWdOdW1iZXIsIDcpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVmlldyA9IG5ldyBVaW50OEFycmF5KGVuY29kZWRCdWYpO1xyXG4gICAgICAgICAgICBjb25zdCBzaXplID0gZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSArIDEpO1xyXG4gICAgICAgICAgICByZXRWaWV3WzBdID0gKGZpcnN0T2N0ZXQgfCAweDFGKTtcclxuICAgICAgICAgICAgaWYgKCFzaXplT25seSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoc2l6ZSAtIDEpOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0Vmlld1tpICsgMV0gPSBlbmNvZGVkVmlld1tpXSB8IDB4ODA7XHJcbiAgICAgICAgICAgICAgICByZXRWaWV3W3NpemVdID0gZW5jb2RlZFZpZXdbc2l6ZSAtIDFdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXRWaWV3LmJ1ZmZlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGggKyAxKTtcclxuICAgICAgICByZXRWaWV3WzBdID0gKGZpcnN0T2N0ZXQgfCAweDFGKTtcclxuICAgICAgICBpZiAoIXNpemVPbmx5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1clZpZXcgPSB0aGlzLnZhbHVlSGV4VmlldztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoY3VyVmlldy5sZW5ndGggLSAxKTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tpICsgMV0gPSBjdXJWaWV3W2ldIHwgMHg4MDtcclxuICAgICAgICAgICAgcmV0Vmlld1t0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoXSA9IGN1clZpZXdbY3VyVmlldy5sZW5ndGggLSAxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldFZpZXcuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXModGhpcywgaW5wdXRWaWV3LCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW50QnVmZmVyID0gaW5wdXRWaWV3LnN1YmFycmF5KGlucHV0T2Zmc2V0LCBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICBpZiAoaW50QnVmZmVyLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJaZXJvIGJ1ZmZlciBsZW5ndGhcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0YWdDbGFzc01hc2sgPSBpbnRCdWZmZXJbMF0gJiAweEMwO1xyXG4gICAgICAgIHN3aXRjaCAodGFnQ2xhc3NNYXNrKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMHgwMDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFnQ2xhc3MgPSAoMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAweDQwOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWdDbGFzcyA9ICgyKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDB4ODA6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ0NsYXNzID0gKDMpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMHhDMDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFnQ2xhc3MgPSAoNCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIlVua25vd24gdGFnIGNsYXNzXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNDb25zdHJ1Y3RlZCA9IChpbnRCdWZmZXJbMF0gJiAweDIwKSA9PT0gMHgyMDtcclxuICAgICAgICB0aGlzLmlzSGV4T25seSA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHRhZ051bWJlck1hc2sgPSBpbnRCdWZmZXJbMF0gJiAweDFGO1xyXG4gICAgICAgIGlmICh0YWdOdW1iZXJNYXNrICE9PSAweDFGKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFnTnVtYmVyID0gKHRhZ051bWJlck1hc2spO1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjb3VudCA9IDE7XHJcbiAgICAgICAgICAgIGxldCBpbnRUYWdOdW1iZXJCdWZmZXIgPSB0aGlzLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KDI1NSk7XHJcbiAgICAgICAgICAgIGxldCB0YWdOdW1iZXJCdWZmZXJNYXhMZW5ndGggPSAyNTU7XHJcbiAgICAgICAgICAgIHdoaWxlIChpbnRCdWZmZXJbY291bnRdICYgMHg4MCkge1xyXG4gICAgICAgICAgICAgICAgaW50VGFnTnVtYmVyQnVmZmVyW2NvdW50IC0gMV0gPSBpbnRCdWZmZXJbY291bnRdICYgMHg3RjtcclxuICAgICAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPj0gaW50QnVmZmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVuZCBvZiBpbnB1dCByZWFjaGVkIGJlZm9yZSBtZXNzYWdlIHdhcyBmdWxseSBkZWNvZGVkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSB0YWdOdW1iZXJCdWZmZXJNYXhMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXJCdWZmZXJNYXhMZW5ndGggKz0gMjU1O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBCdWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludFRhZ051bWJlckJ1ZmZlci5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEJ1ZmZlclZpZXdbaV0gPSBpbnRUYWdOdW1iZXJCdWZmZXJbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaW50VGFnTnVtYmVyQnVmZmVyID0gdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheSh0YWdOdW1iZXJCdWZmZXJNYXhMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSAoY291bnQgKyAxKTtcclxuICAgICAgICAgICAgaW50VGFnTnVtYmVyQnVmZmVyW2NvdW50IC0gMV0gPSBpbnRCdWZmZXJbY291bnRdICYgMHg3RjtcclxuICAgICAgICAgICAgY29uc3QgdGVtcEJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShjb3VudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKylcclxuICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJWaWV3W2ldID0gaW50VGFnTnVtYmVyQnVmZmVyW2ldO1xyXG4gICAgICAgICAgICBpbnRUYWdOdW1iZXJCdWZmZXIgPSB0aGlzLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcclxuICAgICAgICAgICAgaW50VGFnTnVtYmVyQnVmZmVyLnNldCh0ZW1wQnVmZmVyVmlldyk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJsb2NrTGVuZ3RoIDw9IDkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ051bWJlciA9IHB2dXRpbHMudXRpbEZyb21CYXNlKGludFRhZ051bWJlckJ1ZmZlciwgNyk7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0hleE9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiVGFnIHRvbyBsb25nLCByZXByZXNlbnRlZCBhcyBoZXgtY29kZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCgodGhpcy50YWdDbGFzcyA9PT0gMSkpICYmXHJcbiAgICAgICAgICAgICh0aGlzLmlzQ29uc3RydWN0ZWQpKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50YWdOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgIGNhc2UgNjpcclxuICAgICAgICAgICAgICAgIGNhc2UgOTpcclxuICAgICAgICAgICAgICAgIGNhc2UgMTM6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxyXG4gICAgICAgICAgICAgICAgY2FzZSAyMzpcclxuICAgICAgICAgICAgICAgIGNhc2UgMjQ6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDMxOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAzMjpcclxuICAgICAgICAgICAgICAgIGNhc2UgMzM6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkNvbnN0cnVjdGVkIGVuY29kaW5nIHVzZWQgZm9yIHByaW1pdGl2ZSB0eXBlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoaW5wdXRPZmZzZXQgKyB0aGlzLmJsb2NrTGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgdGFnQ2xhc3M6IHRoaXMudGFnQ2xhc3MsXHJcbiAgICAgICAgICAgIHRhZ051bWJlcjogdGhpcy50YWdOdW1iZXIsXHJcbiAgICAgICAgICAgIGlzQ29uc3RydWN0ZWQ6IHRoaXMuaXNDb25zdHJ1Y3RlZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsSWRlbnRpZmljYXRpb25CbG9jay5OQU1FID0gXCJpZGVudGlmaWNhdGlvbkJsb2NrXCI7XG5cbmNsYXNzIExvY2FsTGVuZ3RoQmxvY2sgZXh0ZW5kcyBMb2NhbEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IGxlbkJsb2NrID0ge30sIH0gPSB7fSkge1xyXG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5pc0luZGVmaW5pdGVGb3JtID0gKF9hID0gbGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb25nRm9ybVVzZWQgPSAoX2IgPSBsZW5CbG9jay5sb25nRm9ybVVzZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gKF9jID0gbGVuQmxvY2subGVuZ3RoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIHZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnRCdWZmZXIgPSB2aWV3LnN1YmFycmF5KGlucHV0T2Zmc2V0LCBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICBpZiAoaW50QnVmZmVyLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJaZXJvIGJ1ZmZlciBsZW5ndGhcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW50QnVmZmVyWzBdID09PSAweEZGKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkxlbmd0aCBibG9jayAweEZGIGlzIHJlc2VydmVkIGJ5IHN0YW5kYXJkXCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0luZGVmaW5pdGVGb3JtID0gaW50QnVmZmVyWzBdID09PSAweDgwO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5kZWZpbml0ZUZvcm0pIHtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IDE7XHJcbiAgICAgICAgICAgIHJldHVybiAoaW5wdXRPZmZzZXQgKyB0aGlzLmJsb2NrTGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb25nRm9ybVVzZWQgPSAhIShpbnRCdWZmZXJbMF0gJiAweDgwKTtcclxuICAgICAgICBpZiAodGhpcy5sb25nRm9ybVVzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gKGludEJ1ZmZlclswXSk7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSAxO1xyXG4gICAgICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgdGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gaW50QnVmZmVyWzBdICYgMHg3RjtcclxuICAgICAgICBpZiAoY291bnQgPiA4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIlRvbyBiaWcgaW50ZWdlclwiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoY291bnQgKyAxKSA+IGludEJ1ZmZlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiRW5kIG9mIGlucHV0IHJlYWNoZWQgYmVmb3JlIG1lc3NhZ2Ugd2FzIGZ1bGx5IGRlY29kZWRcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZW5PZmZzZXQgPSBpbnB1dE9mZnNldCArIDE7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoQnVmZmVyVmlldyA9IHZpZXcuc3ViYXJyYXkobGVuT2Zmc2V0LCBsZW5PZmZzZXQgKyBjb3VudCk7XHJcbiAgICAgICAgaWYgKGxlbmd0aEJ1ZmZlclZpZXdbY291bnQgLSAxXSA9PT0gMHgwMClcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiTmVlZGxlc3NseSBsb25nIGVuY29kZWQgbGVuZ3RoXCIpO1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gcHZ1dGlscy51dGlsRnJvbUJhc2UobGVuZ3RoQnVmZmVyVmlldywgOCk7XHJcbiAgICAgICAgaWYgKHRoaXMubG9uZ0Zvcm1Vc2VkICYmICh0aGlzLmxlbmd0aCA8PSAxMjcpKVxyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJVbm5lY2Vzc2FyeSB1c2FnZSBvZiBsb25nIGxlbmd0aCBmb3JtXCIpO1xyXG4gICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSBjb3VudCArIDE7XHJcbiAgICAgICAgcmV0dXJuIChpbnB1dE9mZnNldCArIHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHkgPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCByZXRCdWY7XHJcbiAgICAgICAgbGV0IHJldFZpZXc7XHJcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMTI3KVxyXG4gICAgICAgICAgICB0aGlzLmxvbmdGb3JtVXNlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbmRlZmluaXRlRm9ybSkge1xyXG4gICAgICAgICAgICByZXRCdWYgPSBuZXcgQXJyYXlCdWZmZXIoMSk7XHJcbiAgICAgICAgICAgIGlmIChzaXplT25seSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1swXSA9IDB4ODA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubG9uZ0Zvcm1Vc2VkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRCdWYgPSBwdnV0aWxzLnV0aWxUb0Jhc2UodGhpcy5sZW5ndGgsIDgpO1xyXG4gICAgICAgICAgICBpZiAoZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoID4gMTI3KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJUb28gYmlnIGxlbmd0aFwiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChFTVBUWV9CVUZGRVIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihlbmNvZGVkQnVmLmJ5dGVMZW5ndGggKyAxKTtcclxuICAgICAgICAgICAgaWYgKHNpemVPbmx5KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmKTtcclxuICAgICAgICAgICAgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICAgICAgICAgIHJldFZpZXdbMF0gPSBlbmNvZGVkQnVmLmJ5dGVMZW5ndGggfCAweDgwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWRCdWYuYnl0ZUxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tpICsgMV0gPSBlbmNvZGVkVmlld1tpXTtcclxuICAgICAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0QnVmID0gbmV3IEFycmF5QnVmZmVyKDEpO1xyXG4gICAgICAgIGlmIChzaXplT25seSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICAgICAgICAgIHJldFZpZXdbMF0gPSB0aGlzLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgaXNJbmRlZmluaXRlRm9ybTogdGhpcy5pc0luZGVmaW5pdGVGb3JtLFxyXG4gICAgICAgICAgICBsb25nRm9ybVVzZWQ6IHRoaXMubG9uZ0Zvcm1Vc2VkLFxyXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMubGVuZ3RoLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuTG9jYWxMZW5ndGhCbG9jay5OQU1FID0gXCJsZW5ndGhCbG9ja1wiO1xuXG5jb25zdCB0eXBlU3RvcmUgPSB7fTtcblxuY2xhc3MgQmFzZUJsb2NrIGV4dGVuZHMgTG9jYWxCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyBuYW1lID0gRU1QVFlfU1RSSU5HLCBvcHRpb25hbCA9IGZhbHNlLCBwcmltaXRpdmVTY2hlbWEsIC4uLnBhcmFtZXRlcnMgfSA9IHt9LCB2YWx1ZUJsb2NrVHlwZSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsO1xyXG4gICAgICAgIGlmIChwcmltaXRpdmVTY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVTY2hlbWEgPSBwcmltaXRpdmVTY2hlbWE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaWRCbG9jayA9IG5ldyBMb2NhbElkZW50aWZpY2F0aW9uQmxvY2socGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5sZW5CbG9jayA9IG5ldyBMb2NhbExlbmd0aEJsb2NrKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jayA9IHZhbHVlQmxvY2tUeXBlID8gbmV3IHZhbHVlQmxvY2tUeXBlKHBhcmFtZXRlcnMpIDogbmV3IFZhbHVlQmxvY2socGFyYW1ldGVycyk7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHRPZmZzZXQgPSB0aGlzLnZhbHVlQmxvY2suZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsICh0aGlzLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pID8gaW5wdXRMZW5ndGggOiB0aGlzLmxlbkJsb2NrLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMudmFsdWVCbG9jay5lcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmlkQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMuaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICBpZiAoIXRoaXMubGVuQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMubGVuQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMudmFsdWVCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGNvbnN0IF93cml0ZXIgPSB3cml0ZXIgfHwgbmV3IFZpZXdXcml0ZXIoKTtcclxuICAgICAgICBpZiAoIXdyaXRlcikge1xyXG4gICAgICAgICAgICBwcmVwYXJlSW5kZWZpbml0ZUZvcm0odGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkQmxvY2tCdWYgPSB0aGlzLmlkQmxvY2sudG9CRVIoc2l6ZU9ubHkpO1xyXG4gICAgICAgIF93cml0ZXIud3JpdGUoaWRCbG9ja0J1Zik7XHJcbiAgICAgICAgaWYgKHRoaXMubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybSkge1xyXG4gICAgICAgICAgICBfd3JpdGVyLndyaXRlKG5ldyBVaW50OEFycmF5KFsweDgwXSkuYnVmZmVyKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnRvQkVSKHNpemVPbmx5LCBfd3JpdGVyKTtcclxuICAgICAgICAgICAgX3dyaXRlci53cml0ZShuZXcgQXJyYXlCdWZmZXIoMikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVCbG9ja0J1ZiA9IHRoaXMudmFsdWVCbG9jay50b0JFUihzaXplT25seSk7XHJcbiAgICAgICAgICAgIHRoaXMubGVuQmxvY2subGVuZ3RoID0gdmFsdWVCbG9ja0J1Zi5ieXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBsZW5CbG9ja0J1ZiA9IHRoaXMubGVuQmxvY2sudG9CRVIoc2l6ZU9ubHkpO1xyXG4gICAgICAgICAgICBfd3JpdGVyLndyaXRlKGxlbkJsb2NrQnVmKTtcclxuICAgICAgICAgICAgX3dyaXRlci53cml0ZSh2YWx1ZUJsb2NrQnVmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF3cml0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIF93cml0ZXIuZmluYWwoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEVNUFRZX0JVRkZFUjtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBvYmplY3QgPSB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICBpZEJsb2NrOiB0aGlzLmlkQmxvY2sudG9KU09OKCksXHJcbiAgICAgICAgICAgIGxlbkJsb2NrOiB0aGlzLmxlbkJsb2NrLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZUJsb2NrOiB0aGlzLnZhbHVlQmxvY2sudG9KU09OKCksXHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgb3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5wcmltaXRpdmVTY2hlbWEpXHJcbiAgICAgICAgICAgIG9iamVjdC5wcmltaXRpdmVTY2hlbWEgPSB0aGlzLnByaW1pdGl2ZVNjaGVtYS50b0pTT04oKTtcclxuICAgICAgICByZXR1cm4gb2JqZWN0O1xyXG4gICAgfVxyXG4gICAgdG9TdHJpbmcoZW5jb2RpbmcgPSBcImFzY2lpXCIpIHtcclxuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IFwiYXNjaWlcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vbkFzY2lpRW5jb2RpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHB2dHN1dGlscy5Db252ZXJ0LlRvSGV4KHRoaXMudG9CRVIoKSk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3B2dHN1dGlscy5Db252ZXJ0LlRvSGV4KHRoaXMudmFsdWVCbG9jay52YWx1ZUJlZm9yZURlY29kZVZpZXcpfWA7XHJcbiAgICB9XHJcbiAgICBpc0VxdWFsKG90aGVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMgPT09IG90aGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGhpc1JhdyA9IHRoaXMudG9CRVIoKTtcclxuICAgICAgICBjb25zdCBvdGhlclJhdyA9IG90aGVyLnRvQkVSKCk7XHJcbiAgICAgICAgcmV0dXJuIHB2dXRpbHMuaXNFcXVhbEJ1ZmZlcih0aGlzUmF3LCBvdGhlclJhdyk7XHJcbiAgICB9XHJcbn1cclxuQmFzZUJsb2NrLk5BTUUgPSBcIkJhc2VCbG9ja1wiO1xyXG5mdW5jdGlvbiBwcmVwYXJlSW5kZWZpbml0ZUZvcm0oYmFzZUJsb2NrKSB7XHJcbiAgICBpZiAoYmFzZUJsb2NrIGluc3RhbmNlb2YgdHlwZVN0b3JlLkNvbnN0cnVjdGVkKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBiYXNlQmxvY2sudmFsdWVCbG9jay52YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAocHJlcGFyZUluZGVmaW5pdGVGb3JtKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgYmFzZUJsb2NrLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICEhYmFzZUJsb2NrLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm07XHJcbn1cblxuY2xhc3MgQmFzZVN0cmluZ0Jsb2NrIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUgPSBFTVBUWV9TVFJJTkcsIC4uLnBhcmFtZXRlcnMgfSA9IHt9LCBzdHJpbmdWYWx1ZUJsb2NrVHlwZSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIHN0cmluZ1ZhbHVlQmxvY2tUeXBlKTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRWYWx1ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUJsb2NrLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgc2V0VmFsdWUodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdE9mZnNldCA9IHRoaXMudmFsdWVCbG9jay5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgKHRoaXMubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybSkgPyBpbnB1dExlbmd0aCA6IHRoaXMubGVuQmxvY2subGVuZ3RoKTtcclxuICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gdGhpcy52YWx1ZUJsb2NrLmVycm9yO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZyb21CdWZmZXIodGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4Vmlldyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlkQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMuaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICBpZiAoIXRoaXMubGVuQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMubGVuQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMudmFsdWVCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJyR7dGhpcy52YWx1ZUJsb2NrLnZhbHVlfSdgO1xyXG4gICAgfVxyXG59XHJcbkJhc2VTdHJpbmdCbG9jay5OQU1FID0gXCJCYXNlU3RyaW5nQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxQcmltaXRpdmVWYWx1ZUJsb2NrIGV4dGVuZHMgSGV4QmxvY2soVmFsdWVCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyBpc0hleE9ubHkgPSB0cnVlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gaXNIZXhPbmx5O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsUHJpbWl0aXZlVmFsdWVCbG9jay5OQU1FID0gXCJQcmltaXRpdmVWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSR3O1xyXG5jbGFzcyBQcmltaXRpdmUgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxQcmltaXRpdmVWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2suaXNDb25zdHJ1Y3RlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG59XHJcbl9hJHcgPSBQcmltaXRpdmU7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuUHJpbWl0aXZlID0gX2EkdztcclxufSkoKTtcclxuUHJpbWl0aXZlLk5BTUUgPSBcIlBSSU1JVElWRVwiO1xuXG5mdW5jdGlvbiBsb2NhbENoYW5nZVR5cGUoaW5wdXRPYmplY3QsIG5ld1R5cGUpIHtcclxuICAgIGlmIChpbnB1dE9iamVjdCBpbnN0YW5jZW9mIG5ld1R5cGUpIHtcclxuICAgICAgICByZXR1cm4gaW5wdXRPYmplY3Q7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdPYmplY3QgPSBuZXcgbmV3VHlwZSgpO1xyXG4gICAgbmV3T2JqZWN0LmlkQmxvY2sgPSBpbnB1dE9iamVjdC5pZEJsb2NrO1xyXG4gICAgbmV3T2JqZWN0LmxlbkJsb2NrID0gaW5wdXRPYmplY3QubGVuQmxvY2s7XHJcbiAgICBuZXdPYmplY3Qud2FybmluZ3MgPSBpbnB1dE9iamVjdC53YXJuaW5ncztcclxuICAgIG5ld09iamVjdC52YWx1ZUJlZm9yZURlY29kZVZpZXcgPSBpbnB1dE9iamVjdC52YWx1ZUJlZm9yZURlY29kZVZpZXc7XHJcbiAgICByZXR1cm4gbmV3T2JqZWN0O1xyXG59XHJcbmZ1bmN0aW9uIGxvY2FsRnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQgPSAwLCBpbnB1dExlbmd0aCA9IGlucHV0QnVmZmVyLmxlbmd0aCkge1xyXG4gICAgY29uc3QgaW5jb21pbmdPZmZzZXQgPSBpbnB1dE9mZnNldDtcclxuICAgIGxldCByZXR1cm5PYmplY3QgPSBuZXcgQmFzZUJsb2NrKHt9LCBWYWx1ZUJsb2NrKTtcclxuICAgIGNvbnN0IGJhc2VCbG9jayA9IG5ldyBMb2NhbEJhc2VCbG9jaygpO1xyXG4gICAgaWYgKCFjaGVja0J1ZmZlclBhcmFtcyhiYXNlQmxvY2ssIGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSB7XHJcbiAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gYmFzZUJsb2NrLmVycm9yO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGludEJ1ZmZlciA9IGlucHV0QnVmZmVyLnN1YmFycmF5KGlucHV0T2Zmc2V0LCBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgIGlmICghaW50QnVmZmVyLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC5lcnJvciA9IFwiWmVybyBidWZmZXIgbGVuZ3RoXCI7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgb2Zmc2V0OiAtMSxcclxuICAgICAgICAgICAgcmVzdWx0OiByZXR1cm5PYmplY3RcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdE9mZnNldCA9IHJldHVybk9iamVjdC5pZEJsb2NrLmZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCk7XHJcbiAgICBpZiAocmV0dXJuT2JqZWN0LmlkQmxvY2sud2FybmluZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuT2JqZWN0Lndhcm5pbmdzLmNvbmNhdChyZXR1cm5PYmplY3QuaWRCbG9jay53YXJuaW5ncyk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC5lcnJvciA9IHJldHVybk9iamVjdC5pZEJsb2NrLmVycm9yO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlucHV0T2Zmc2V0ID0gcmVzdWx0T2Zmc2V0O1xyXG4gICAgaW5wdXRMZW5ndGggLT0gcmV0dXJuT2JqZWN0LmlkQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICByZXN1bHRPZmZzZXQgPSByZXR1cm5PYmplY3QubGVuQmxvY2suZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgIGlmIChyZXR1cm5PYmplY3QubGVuQmxvY2sud2FybmluZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuT2JqZWN0Lndhcm5pbmdzLmNvbmNhdChyZXR1cm5PYmplY3QubGVuQmxvY2sud2FybmluZ3MpO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSByZXR1cm5PYmplY3QubGVuQmxvY2suZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgb2Zmc2V0OiAtMSxcclxuICAgICAgICAgICAgcmVzdWx0OiByZXR1cm5PYmplY3RcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaW5wdXRPZmZzZXQgPSByZXN1bHRPZmZzZXQ7XHJcbiAgICBpbnB1dExlbmd0aCAtPSByZXR1cm5PYmplY3QubGVuQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICBpZiAoIXJldHVybk9iamVjdC5pZEJsb2NrLmlzQ29uc3RydWN0ZWQgJiZcclxuICAgICAgICByZXR1cm5PYmplY3QubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybSkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC5lcnJvciA9IFwiSW5kZWZpbml0ZSBsZW5ndGggZm9ybSB1c2VkIGZvciBwcmltaXRpdmUgZW5jb2RpbmcgZm9ybVwiO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGxldCBuZXdBU04xVHlwZSA9IEJhc2VCbG9jaztcclxuICAgIHN3aXRjaCAocmV0dXJuT2JqZWN0LmlkQmxvY2sudGFnQ2xhc3MpIHtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgIGlmICgocmV0dXJuT2JqZWN0LmlkQmxvY2sudGFnTnVtYmVyID49IDM3KSAmJlxyXG4gICAgICAgICAgICAgICAgKHJldHVybk9iamVjdC5pZEJsb2NrLmlzSGV4T25seSA9PT0gZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSBcIlVOSVZFUlNBTCAzNyBhbmQgdXBwZXIgdGFncyBhcmUgcmVzZXJ2ZWQgYnkgQVNOLjEgc3RhbmRhcmRcIjtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAtMSxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzd2l0Y2ggKHJldHVybk9iamVjdC5pZEJsb2NrLnRhZ051bWJlcikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgocmV0dXJuT2JqZWN0LmlkQmxvY2suaXNDb25zdHJ1Y3RlZCkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHJldHVybk9iamVjdC5sZW5CbG9jay5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSBcIlR5cGUgW1VOSVZFUlNBTCAwXSBpcyByZXNlcnZlZFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAtMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkVuZE9mQ29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5Cb29sZWFuO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkludGVnZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuQml0U3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLk9jdGV0U3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLk51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuT2JqZWN0SWRlbnRpZmllcjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTA6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuRW51bWVyYXRlZDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTI6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuVXRmOFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTM6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5USU1FO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSBcIltVTklWRVJTQUwgMTVdIGlzIHJlc2VydmVkIGJ5IEFTTi4xIHN0YW5kYXJkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAtMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByZXR1cm5PYmplY3RcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxNjpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5TZXF1ZW5jZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTc6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuU2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxODpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5OdW1lcmljU3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOTpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5QcmludGFibGVTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDIwOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlRlbGV0ZXhTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDIxOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlZpZGVvdGV4U3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyMjpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5JQTVTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDIzOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlVUQ1RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI0OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkdlbmVyYWxpemVkVGltZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjU6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuR3JhcGhpY1N0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjY6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuVmlzaWJsZVN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjc6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuR2VuZXJhbFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjg6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuVW5pdmVyc2FsU3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOTpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5DaGFyYWN0ZXJTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDMwOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkJtcFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMzE6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuREFURTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMzI6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuVGltZU9mRGF5O1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzMzpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5EYXRlVGltZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMzQ6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuRHVyYXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3T2JqZWN0ID0gcmV0dXJuT2JqZWN0LmlkQmxvY2suaXNDb25zdHJ1Y3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyB0eXBlU3RvcmUuQ29uc3RydWN0ZWQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyB0eXBlU3RvcmUuUHJpbWl0aXZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3T2JqZWN0LmlkQmxvY2sgPSByZXR1cm5PYmplY3QuaWRCbG9jaztcclxuICAgICAgICAgICAgICAgICAgICBuZXdPYmplY3QubGVuQmxvY2sgPSByZXR1cm5PYmplY3QubGVuQmxvY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3T2JqZWN0Lndhcm5pbmdzID0gcmV0dXJuT2JqZWN0Lndhcm5pbmdzO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ld09iamVjdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgIGNhc2UgNDpcclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gcmV0dXJuT2JqZWN0LmlkQmxvY2suaXNDb25zdHJ1Y3RlZFxyXG4gICAgICAgICAgICAgICAgPyB0eXBlU3RvcmUuQ29uc3RydWN0ZWRcclxuICAgICAgICAgICAgICAgIDogdHlwZVN0b3JlLlByaW1pdGl2ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm5PYmplY3QgPSBsb2NhbENoYW5nZVR5cGUocmV0dXJuT2JqZWN0LCBuZXdBU04xVHlwZSk7XHJcbiAgICByZXN1bHRPZmZzZXQgPSByZXR1cm5PYmplY3QuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIHJldHVybk9iamVjdC5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtID8gaW5wdXRMZW5ndGggOiByZXR1cm5PYmplY3QubGVuQmxvY2subGVuZ3RoKTtcclxuICAgIHJldHVybk9iamVjdC52YWx1ZUJlZm9yZURlY29kZVZpZXcgPSBpbnB1dEJ1ZmZlci5zdWJhcnJheShpbmNvbWluZ09mZnNldCwgaW5jb21pbmdPZmZzZXQgKyByZXR1cm5PYmplY3QuYmxvY2tMZW5ndGgpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBvZmZzZXQ6IHJlc3VsdE9mZnNldCxcclxuICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBmcm9tQkVSKGlucHV0QnVmZmVyKSB7XHJcbiAgICBpZiAoIWlucHV0QnVmZmVyLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQmFzZUJsb2NrKHt9LCBWYWx1ZUJsb2NrKTtcclxuICAgICAgICByZXN1bHQuZXJyb3IgPSBcIklucHV0IGJ1ZmZlciBoYXMgemVybyBsZW5ndGhcIjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBvZmZzZXQ6IC0xLFxyXG4gICAgICAgICAgICByZXN1bHRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxvY2FsRnJvbUJFUihwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcikuc2xpY2UoKSwgMCwgaW5wdXRCdWZmZXIuYnl0ZUxlbmd0aCk7XHJcbn1cblxuZnVuY3Rpb24gY2hlY2tMZW4oaW5kZWZpbml0ZUxlbmd0aCwgbGVuZ3RoKSB7XHJcbiAgICBpZiAoaW5kZWZpbml0ZUxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxlbmd0aDtcclxufVxyXG5jbGFzcyBMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jayBleHRlbmRzIFZhbHVlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSA9IFtdLCBpc0luZGVmaW5pdGVGb3JtID0gZmFsc2UsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuaXNJbmRlZmluaXRlRm9ybSA9IGlzSW5kZWZpbml0ZUZvcm07XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCB2aWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXModGhpcywgdmlldywgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWVCZWZvcmVEZWNvZGVWaWV3ID0gdmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWVCZWZvcmVEZWNvZGVWaWV3Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJaZXJvIGJ1ZmZlciBsZW5ndGhcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGN1cnJlbnRPZmZzZXQgPSBpbnB1dE9mZnNldDtcclxuICAgICAgICB3aGlsZSAoY2hlY2tMZW4odGhpcy5pc0luZGVmaW5pdGVGb3JtLCBpbnB1dExlbmd0aCkgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVybk9iamVjdCA9IGxvY2FsRnJvbUJFUih2aWV3LCBjdXJyZW50T2Zmc2V0LCBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChyZXR1cm5PYmplY3Qub2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IHJldHVybk9iamVjdC5yZXN1bHQuZXJyb3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdzLmNvbmNhdChyZXR1cm5PYmplY3QucmVzdWx0Lndhcm5pbmdzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50T2Zmc2V0ID0gcmV0dXJuT2JqZWN0Lm9mZnNldDtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSByZXR1cm5PYmplY3QucmVzdWx0LmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICBpbnB1dExlbmd0aCAtPSByZXR1cm5PYmplY3QucmVzdWx0LmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnB1c2gocmV0dXJuT2JqZWN0LnJlc3VsdCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5kZWZpbml0ZUZvcm0gJiYgcmV0dXJuT2JqZWN0LnJlc3VsdC5jb25zdHJ1Y3Rvci5OQU1FID09PSBFTkRfT0ZfQ09OVEVOVF9OQU1FKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc0luZGVmaW5pdGVGb3JtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlW3RoaXMudmFsdWUubGVuZ3RoIC0gMV0uY29uc3RydWN0b3IuTkFNRSA9PT0gRU5EX09GX0NPTlRFTlRfTkFNRSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5wb3AoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIk5vIEVuZE9mQ29udGVudCBibG9jayBlbmNvZGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjdXJyZW50T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGNvbnN0IF93cml0ZXIgPSB3cml0ZXIgfHwgbmV3IFZpZXdXcml0ZXIoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZVtpXS50b0JFUihzaXplT25seSwgX3dyaXRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghd3JpdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfd3JpdGVyLmZpbmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgaXNJbmRlZmluaXRlRm9ybTogdGhpcy5pc0luZGVmaW5pdGVGb3JtLFxyXG4gICAgICAgICAgICB2YWx1ZTogW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgICAgb2JqZWN0LnZhbHVlLnB1c2godmFsdWUudG9KU09OKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqZWN0O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrLk5BTUUgPSBcIkNvbnN0cnVjdGVkVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkdjtcclxuY2xhc3MgQ29uc3RydWN0ZWQgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxDb25zdHJ1Y3RlZFZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay5pc0NvbnN0cnVjdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay5pc0luZGVmaW5pdGVGb3JtID0gdGhpcy5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdE9mZnNldCA9IHRoaXMudmFsdWVCbG9jay5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgKHRoaXMubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybSkgPyBpbnB1dExlbmd0aCA6IHRoaXMubGVuQmxvY2subGVuZ3RoKTtcclxuICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gdGhpcy52YWx1ZUJsb2NrLmVycm9yO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaWRCbG9jay5lcnJvci5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gdGhpcy5pZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgIGlmICghdGhpcy5sZW5CbG9jay5lcnJvci5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gdGhpcy5sZW5CbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICBpZiAoIXRoaXMudmFsdWVCbG9jay5lcnJvci5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gdGhpcy52YWx1ZUJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnZhbHVlQmxvY2sudmFsdWUpIHtcclxuICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUudG9TdHJpbmcoXCJhc2NpaVwiKS5zcGxpdChcIlxcblwiKS5tYXAobyA9PiBgICAke299YCkuam9pbihcIlxcblwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJsb2NrTmFtZSA9IHRoaXMuaWRCbG9jay50YWdDbGFzcyA9PT0gM1xyXG4gICAgICAgICAgICA/IGBbJHt0aGlzLmlkQmxvY2sudGFnTnVtYmVyfV1gXHJcbiAgICAgICAgICAgIDogdGhpcy5jb25zdHJ1Y3Rvci5OQU1FO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoXHJcbiAgICAgICAgICAgID8gYCR7YmxvY2tOYW1lfSA6XFxuJHt2YWx1ZXMuam9pbihcIlxcblwiKX1gXHJcbiAgICAgICAgICAgIDogYCR7YmxvY2tOYW1lfSA6YDtcclxuICAgIH1cclxufVxyXG5fYSR2ID0gQ29uc3RydWN0ZWQ7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuQ29uc3RydWN0ZWQgPSBfYSR2O1xyXG59KSgpO1xyXG5Db25zdHJ1Y3RlZC5OQU1FID0gXCJDT05TVFJVQ1RFRFwiO1xuXG5jbGFzcyBMb2NhbEVuZE9mQ29udGVudFZhbHVlQmxvY2sgZXh0ZW5kcyBWYWx1ZUJsb2NrIHtcclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBpbnB1dE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIEVNUFRZX0JVRkZFUjtcclxuICAgIH1cclxufVxyXG5Mb2NhbEVuZE9mQ29udGVudFZhbHVlQmxvY2sub3ZlcnJpZGUgPSBcIkVuZE9mQ29udGVudFZhbHVlQmxvY2tcIjtcblxudmFyIF9hJHU7XHJcbmNsYXNzIEVuZE9mQ29udGVudCBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBMb2NhbEVuZE9mQ29udGVudFZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDA7XHJcbiAgICB9XHJcbn1cclxuX2EkdSA9IEVuZE9mQ29udGVudDtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5FbmRPZkNvbnRlbnQgPSBfYSR1O1xyXG59KSgpO1xyXG5FbmRPZkNvbnRlbnQuTkFNRSA9IEVORF9PRl9DT05URU5UX05BTUU7XG5cbnZhciBfYSR0O1xyXG5jbGFzcyBOdWxsIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIFZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDU7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBpZiAodGhpcy5sZW5CbG9jay5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJOb24temVybyBsZW5ndGggb2YgdmFsdWUgYmxvY2sgZm9yIE51bGwgdHlwZVwiKTtcclxuICAgICAgICBpZiAoIXRoaXMuaWRCbG9jay5lcnJvci5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gdGhpcy5pZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgIGlmICghdGhpcy5sZW5CbG9jay5lcnJvci5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gdGhpcy5sZW5CbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IGlucHV0TGVuZ3RoO1xyXG4gICAgICAgIGlmICgoaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCkgPiBpbnB1dEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVuZCBvZiBpbnB1dCByZWFjaGVkIGJlZm9yZSBtZXNzYWdlIHdhcyBmdWxseSBkZWNvZGVkIChpbmNvbnNpc3RlbnQgb2Zmc2V0IGFuZCBsZW5ndGggdmFsdWVzKVwiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSwgd3JpdGVyKSB7XHJcbiAgICAgICAgY29uc3QgcmV0QnVmID0gbmV3IEFycmF5QnVmZmVyKDIpO1xyXG4gICAgICAgIGlmICghc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICAgICAgICAgIHJldFZpZXdbMF0gPSAweDA1O1xyXG4gICAgICAgICAgICByZXRWaWV3WzFdID0gMHgwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHdyaXRlcikge1xyXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUocmV0QnVmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgIH1cclxuICAgIG9uQXNjaWlFbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfWA7XHJcbiAgICB9XHJcbn1cclxuX2EkdCA9IE51bGw7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuTnVsbCA9IF9hJHQ7XHJcbn0pKCk7XHJcbk51bGwuTkFNRSA9IFwiTlVMTFwiO1xuXG5jbGFzcyBMb2NhbEJvb2xlYW5WYWx1ZUJsb2NrIGV4dGVuZHMgSGV4QmxvY2soVmFsdWVCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICBpZiAocGFyYW1ldGVycy52YWx1ZUhleCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHBhcmFtZXRlcnMudmFsdWVIZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheSgxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgdmFsdWUoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBvY3RldCBvZiB0aGlzLnZhbHVlSGV4Vmlldykge1xyXG4gICAgICAgICAgICBpZiAob2N0ZXQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBzZXQgdmFsdWUodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlSGV4Vmlld1swXSA9IHZhbHVlID8gMHhGRiA6IDB4MDA7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBpbnB1dFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICAgICAgaWYgKCFjaGVja0J1ZmZlclBhcmFtcyh0aGlzLCBpbnB1dFZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IGlucHV0Vmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgaWYgKGlucHV0TGVuZ3RoID4gMSlcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiQm9vbGVhbiB2YWx1ZSBlbmNvZGVkIGluIG1vcmUgdGhlbiAxIG9jdGV0XCIpO1xyXG4gICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICBwdnV0aWxzLnV0aWxEZWNvZGVUQy5jYWxsKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSBpbnB1dExlbmd0aDtcclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVIZXhWaWV3LnNsaWNlKCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuTG9jYWxCb29sZWFuVmFsdWVCbG9jay5OQU1FID0gXCJCb29sZWFuVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkcztcclxuY2xhc3MgQm9vbGVhbiBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBMb2NhbEJvb2xlYW5WYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAxO1xyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVCbG9jay52YWx1ZTtcclxuICAgIH1cclxuICAgIHNldFZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3RoaXMuZ2V0VmFsdWV9YDtcclxuICAgIH1cclxufVxyXG5fYSRzID0gQm9vbGVhbjtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5Cb29sZWFuID0gX2EkcztcclxufSkoKTtcclxuQm9vbGVhbi5OQU1FID0gXCJCT09MRUFOXCI7XG5cbmNsYXNzIExvY2FsT2N0ZXRTdHJpbmdWYWx1ZUJsb2NrIGV4dGVuZHMgSGV4QmxvY2soTG9jYWxDb25zdHJ1Y3RlZFZhbHVlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgaXNDb25zdHJ1Y3RlZCA9IGZhbHNlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaXNDb25zdHJ1Y3RlZCA9IGlzQ29uc3RydWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0ID0gMDtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbnN0cnVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCA9IExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrLnByb3RvdHlwZS5mcm9tQkVSLmNhbGwodGhpcywgaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPT09IC0xKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50QmxvY2tOYW1lID0gdGhpcy52YWx1ZVtpXS5jb25zdHJ1Y3Rvci5OQU1FO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja05hbWUgPT09IEVORF9PRl9DT05URU5UX05BTUUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luZGVmaW5pdGVGb3JtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiRW5kT2ZDb250ZW50IGlzIHVuZXhwZWN0ZWQsIE9DVEVUIFNUUklORyBtYXkgY29uc2lzdHMgb2YgT0NURVQgU1RSSU5HcyBvbmx5XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrTmFtZSAhPT0gT0NURVRfU1RSSU5HX05BTUUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJPQ1RFVCBTVFJJTkcgbWF5IGNvbnNpc3RzIG9mIE9DVEVUIFNUUklOR3Mgb25seVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0hleE9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBzdXBlci5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gaW5wdXRMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSwgd3JpdGVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25zdHJ1Y3RlZClcclxuICAgICAgICAgICAgcmV0dXJuIExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrLnByb3RvdHlwZS50b0JFUi5jYWxsKHRoaXMsIHNpemVPbmx5LCB3cml0ZXIpO1xyXG4gICAgICAgIHJldHVybiBzaXplT25seVxyXG4gICAgICAgICAgICA/IG5ldyBBcnJheUJ1ZmZlcih0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoKVxyXG4gICAgICAgICAgICA6IHRoaXMudmFsdWVIZXhWaWV3LnNsaWNlKCkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICBpc0NvbnN0cnVjdGVkOiB0aGlzLmlzQ29uc3RydWN0ZWQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5Mb2NhbE9jdGV0U3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJPY3RldFN0cmluZ1ZhbHVlQmxvY2tcIjtcblxudmFyIF9hJHI7XHJcbmNsYXNzIE9jdGV0U3RyaW5nIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgaWRCbG9jayA9IHt9LCBsZW5CbG9jayA9IHt9LCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHZhciBfYiwgX2M7XHJcbiAgICAgICAgKF9iID0gcGFyYW1ldGVycy5pc0NvbnN0cnVjdGVkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAocGFyYW1ldGVycy5pc0NvbnN0cnVjdGVkID0gISEoKF9jID0gcGFyYW1ldGVycy52YWx1ZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxlbmd0aCkpO1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWRCbG9jazoge1xyXG4gICAgICAgICAgICAgICAgaXNDb25zdHJ1Y3RlZDogcGFyYW1ldGVycy5pc0NvbnN0cnVjdGVkLFxyXG4gICAgICAgICAgICAgICAgLi4uaWRCbG9jayxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbGVuQmxvY2s6IHtcclxuICAgICAgICAgICAgICAgIC4uLmxlbkJsb2NrLFxyXG4gICAgICAgICAgICAgICAgaXNJbmRlZmluaXRlRm9ybTogISFwYXJhbWV0ZXJzLmlzSW5kZWZpbml0ZUZvcm0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXHJcbiAgICAgICAgfSwgTG9jYWxPY3RldFN0cmluZ1ZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDQ7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suaXNDb25zdHJ1Y3RlZCA9IHRoaXMuaWRCbG9jay5pc0NvbnN0cnVjdGVkO1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay5pc0luZGVmaW5pdGVGb3JtID0gdGhpcy5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtO1xyXG4gICAgICAgIGlmIChpbnB1dExlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pZEJsb2NrLmVycm9yLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gdGhpcy5pZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZW5CbG9jay5lcnJvci5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMubGVuQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlQmxvY2suaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gaW5wdXRCdWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KGlucHV0QnVmZmVyKSA6IGlucHV0QnVmZmVyO1xyXG4gICAgICAgICAgICBjb25zdCBidWYgPSB2aWV3LnN1YmFycmF5KGlucHV0T2Zmc2V0LCBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChidWYuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbiA9IGxvY2FsRnJvbUJFUihidWYsIDAsIGJ1Zi5ieXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXNuLm9mZnNldCAhPT0gLTEgJiYgYXNuLm9mZnNldCA9PT0gaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gW2Fzbi5yZXN1bHRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdXBlci5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQmxvY2suaXNDb25zdHJ1Y3RlZCB8fCAodGhpcy52YWx1ZUJsb2NrLnZhbHVlICYmIHRoaXMudmFsdWVCbG9jay52YWx1ZS5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBDb25zdHJ1Y3RlZC5wcm90b3R5cGUub25Bc2NpaUVuY29kaW5nLmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHtwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3KX1gO1xyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlkQmxvY2suaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYXJyYXkgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRlbnQgb2YgdGhpcy52YWx1ZUJsb2NrLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgT2N0ZXRTdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgIGFycmF5LnB1c2goY29udGVudC52YWx1ZUJsb2NrLnZhbHVlSGV4Vmlldyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIuY29uY2F0KGFycmF5KTtcclxuICAgIH1cclxufVxyXG5fYSRyID0gT2N0ZXRTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuT2N0ZXRTdHJpbmcgPSBfYSRyO1xyXG59KSgpO1xyXG5PY3RldFN0cmluZy5OQU1FID0gT0NURVRfU1RSSU5HX05BTUU7XG5cbmNsYXNzIExvY2FsQml0U3RyaW5nVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrKSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHVudXNlZEJpdHMgPSAwLCBpc0NvbnN0cnVjdGVkID0gZmFsc2UsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy51bnVzZWRCaXRzID0gdW51c2VkQml0cztcclxuICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSBpc0NvbnN0cnVjdGVkO1xyXG4gICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSB0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKCFpbnB1dExlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAtMTtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbnN0cnVjdGVkKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCA9IExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrLnByb3RvdHlwZS5mcm9tQkVSLmNhbGwodGhpcywgaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPT09IC0xKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50QmxvY2tOYW1lID0gdmFsdWUuY29uc3RydWN0b3IuTkFNRTtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmxvY2tOYW1lID09PSBFTkRfT0ZfQ09OVEVOVF9OQU1FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbmRlZmluaXRlRm9ybSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVuZE9mQ29udGVudCBpcyB1bmV4cGVjdGVkLCBCSVQgU1RSSU5HIG1heSBjb25zaXN0cyBvZiBCSVQgU1RSSU5HcyBvbmx5XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrTmFtZSAhPT0gQklUX1NUUklOR19OQU1FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiQklUIFNUUklORyBtYXkgY29uc2lzdHMgb2YgQklUIFNUUklOR3Mgb25seVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlQmxvY2sgPSB2YWx1ZS52YWx1ZUJsb2NrO1xyXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLnVudXNlZEJpdHMgPiAwKSAmJiAodmFsdWVCbG9jay51bnVzZWRCaXRzID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJVc2luZyBvZiBcXFwidW51c2VkIGJpdHNcXFwiIGluc2lkZSBjb25zdHJ1Y3RpdmUgQklUIFNUUklORyBhbGxvd2VkIGZvciBsZWFzdCBvbmUgb25seVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudW51c2VkQml0cyA9IHZhbHVlQmxvY2sudW51c2VkQml0cztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnB1dFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICAgICAgaWYgKCFjaGVja0J1ZmZlclBhcmFtcyh0aGlzLCBpbnB1dFZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnRCdWZmZXIgPSBpbnB1dFZpZXcuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIHRoaXMudW51c2VkQml0cyA9IGludEJ1ZmZlclswXTtcclxuICAgICAgICBpZiAodGhpcy51bnVzZWRCaXRzID4gNykge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJVbnVzZWQgYml0cyBmb3IgQml0U3RyaW5nIG11c3QgYmUgaW4gcmFuZ2UgMC03XCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnVudXNlZEJpdHMpIHtcclxuICAgICAgICAgICAgY29uc3QgYnVmID0gaW50QnVmZmVyLnN1YmFycmF5KDEpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJ1Zi5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXNuID0gbG9jYWxGcm9tQkVSKGJ1ZiwgMCwgYnVmLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhc24ub2Zmc2V0ICE9PSAtMSAmJiBhc24ub2Zmc2V0ID09PSAoaW5wdXRMZW5ndGggLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gW2Fzbi5yZXN1bHRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gaW50QnVmZmVyLnN1YmFycmF5KDEpO1xyXG4gICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSBpbnRCdWZmZXIubGVuZ3RoO1xyXG4gICAgICAgIHJldHVybiAoaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSwgd3JpdGVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTG9jYWxDb25zdHJ1Y3RlZFZhbHVlQmxvY2sucHJvdG90eXBlLnRvQkVSLmNhbGwodGhpcywgc2l6ZU9ubHksIHdyaXRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzaXplT25seSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGggKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLnZhbHVlSGV4Vmlldy5sZW5ndGggKyAxKTtcclxuICAgICAgICByZXRWaWV3WzBdID0gdGhpcy51bnVzZWRCaXRzO1xyXG4gICAgICAgIHJldFZpZXcuc2V0KHRoaXMudmFsdWVIZXhWaWV3LCAxKTtcclxuICAgICAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHVudXNlZEJpdHM6IHRoaXMudW51c2VkQml0cyxcclxuICAgICAgICAgICAgaXNDb25zdHJ1Y3RlZDogdGhpcy5pc0NvbnN0cnVjdGVkLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuTG9jYWxCaXRTdHJpbmdWYWx1ZUJsb2NrLk5BTUUgPSBcIkJpdFN0cmluZ1ZhbHVlQmxvY2tcIjtcblxudmFyIF9hJHE7XHJcbmNsYXNzIEJpdFN0cmluZyBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IGlkQmxvY2sgPSB7fSwgbGVuQmxvY2sgPSB7fSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICB2YXIgX2IsIF9jO1xyXG4gICAgICAgIChfYiA9IHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogKHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCA9ICEhKChfYyA9IHBhcmFtZXRlcnMudmFsdWUpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5sZW5ndGgpKTtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkQmxvY2s6IHtcclxuICAgICAgICAgICAgICAgIGlzQ29uc3RydWN0ZWQ6IHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCxcclxuICAgICAgICAgICAgICAgIC4uLmlkQmxvY2ssXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGxlbkJsb2NrOiB7XHJcbiAgICAgICAgICAgICAgICAuLi5sZW5CbG9jayxcclxuICAgICAgICAgICAgICAgIGlzSW5kZWZpbml0ZUZvcm06ICEhcGFyYW1ldGVycy5pc0luZGVmaW5pdGVGb3JtLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxyXG4gICAgICAgIH0sIExvY2FsQml0U3RyaW5nVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMztcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay5pc0NvbnN0cnVjdGVkID0gdGhpcy5pZEJsb2NrLmlzQ29uc3RydWN0ZWQ7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLmlzSW5kZWZpbml0ZUZvcm0gPSB0aGlzLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm07XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWVCbG9jay5pc0NvbnN0cnVjdGVkIHx8ICh0aGlzLnZhbHVlQmxvY2sudmFsdWUgJiYgdGhpcy52YWx1ZUJsb2NrLnZhbHVlLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIENvbnN0cnVjdGVkLnByb3RvdHlwZS5vbkFzY2lpRW5jb2RpbmcuY2FsbCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJpdHMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVIZXggPSB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJ5dGUgb2YgdmFsdWVIZXgpIHtcclxuICAgICAgICAgICAgICAgIGJpdHMucHVzaChieXRlLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KDgsIFwiMFwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYml0c1N0ciA9IGJpdHMuam9pbihcIlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke2JpdHNTdHIuc3Vic3RyaW5nKDAsIGJpdHNTdHIubGVuZ3RoIC0gdGhpcy52YWx1ZUJsb2NrLnVudXNlZEJpdHMpfWA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbl9hJHEgPSBCaXRTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuQml0U3RyaW5nID0gX2EkcTtcclxufSkoKTtcclxuQml0U3RyaW5nLk5BTUUgPSBCSVRfU1RSSU5HX05BTUU7XG5cbnZhciBfYSRwO1xyXG5mdW5jdGlvbiB2aWV3QWRkKGZpcnN0LCBzZWNvbmQpIHtcclxuICAgIGNvbnN0IGMgPSBuZXcgVWludDhBcnJheShbMF0pO1xyXG4gICAgY29uc3QgZmlyc3RWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3QpO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlldyA9IG5ldyBVaW50OEFycmF5KHNlY29uZCk7XHJcbiAgICBsZXQgZmlyc3RWaWV3Q29weSA9IGZpcnN0Vmlldy5zbGljZSgwKTtcclxuICAgIGNvbnN0IGZpcnN0Vmlld0NvcHlMZW5ndGggPSBmaXJzdFZpZXdDb3B5Lmxlbmd0aCAtIDE7XHJcbiAgICBjb25zdCBzZWNvbmRWaWV3Q29weSA9IHNlY29uZFZpZXcuc2xpY2UoMCk7XHJcbiAgICBjb25zdCBzZWNvbmRWaWV3Q29weUxlbmd0aCA9IHNlY29uZFZpZXdDb3B5Lmxlbmd0aCAtIDE7XHJcbiAgICBsZXQgdmFsdWUgPSAwO1xyXG4gICAgY29uc3QgbWF4ID0gKHNlY29uZFZpZXdDb3B5TGVuZ3RoIDwgZmlyc3RWaWV3Q29weUxlbmd0aCkgPyBmaXJzdFZpZXdDb3B5TGVuZ3RoIDogc2Vjb25kVmlld0NvcHlMZW5ndGg7XHJcbiAgICBsZXQgY291bnRlciA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gbWF4OyBpID49IDA7IGktLSwgY291bnRlcisrKSB7XHJcbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgKGNvdW50ZXIgPCBzZWNvbmRWaWV3Q29weS5sZW5ndGgpOlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSArIHNlY29uZFZpZXdDb3B5W3NlY29uZFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gKyBjWzBdO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdICsgY1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY1swXSA9IHZhbHVlIC8gMTA7XHJcbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgKGNvdW50ZXIgPj0gZmlyc3RWaWV3Q29weS5sZW5ndGgpOlxyXG4gICAgICAgICAgICAgICAgZmlyc3RWaWV3Q29weSA9IHB2dXRpbHMudXRpbENvbmNhdFZpZXcobmV3IFVpbnQ4QXJyYXkoW3ZhbHVlICUgMTBdKSwgZmlyc3RWaWV3Q29weSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdID0gdmFsdWUgJSAxMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY1swXSA+IDApXHJcbiAgICAgICAgZmlyc3RWaWV3Q29weSA9IHB2dXRpbHMudXRpbENvbmNhdFZpZXcoYywgZmlyc3RWaWV3Q29weSk7XHJcbiAgICByZXR1cm4gZmlyc3RWaWV3Q29weTtcclxufVxyXG5mdW5jdGlvbiBwb3dlcjIobikge1xyXG4gICAgaWYgKG4gPj0gcG93ZXJzMi5sZW5ndGgpIHtcclxuICAgICAgICBmb3IgKGxldCBwID0gcG93ZXJzMi5sZW5ndGg7IHAgPD0gbjsgcCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGMgPSBuZXcgVWludDhBcnJheShbMF0pO1xyXG4gICAgICAgICAgICBsZXQgZGlnaXRzID0gKHBvd2VyczJbcCAtIDFdKS5zbGljZSgwKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IChkaWdpdHMubGVuZ3RoIC0gMSk7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ldyBVaW50OEFycmF5KFsoZGlnaXRzW2ldIDw8IDEpICsgY1swXV0pO1xyXG4gICAgICAgICAgICAgICAgY1swXSA9IG5ld1ZhbHVlWzBdIC8gMTA7XHJcbiAgICAgICAgICAgICAgICBkaWdpdHNbaV0gPSBuZXdWYWx1ZVswXSAlIDEwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjWzBdID4gMClcclxuICAgICAgICAgICAgICAgIGRpZ2l0cyA9IHB2dXRpbHMudXRpbENvbmNhdFZpZXcoYywgZGlnaXRzKTtcclxuICAgICAgICAgICAgcG93ZXJzMi5wdXNoKGRpZ2l0cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBvd2VyczJbbl07XHJcbn1cclxuZnVuY3Rpb24gdmlld1N1YihmaXJzdCwgc2Vjb25kKSB7XHJcbiAgICBsZXQgYiA9IDA7XHJcbiAgICBjb25zdCBmaXJzdFZpZXcgPSBuZXcgVWludDhBcnJheShmaXJzdCk7XHJcbiAgICBjb25zdCBzZWNvbmRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoc2Vjb25kKTtcclxuICAgIGNvbnN0IGZpcnN0Vmlld0NvcHkgPSBmaXJzdFZpZXcuc2xpY2UoMCk7XHJcbiAgICBjb25zdCBmaXJzdFZpZXdDb3B5TGVuZ3RoID0gZmlyc3RWaWV3Q29weS5sZW5ndGggLSAxO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlld0NvcHkgPSBzZWNvbmRWaWV3LnNsaWNlKDApO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlld0NvcHlMZW5ndGggPSBzZWNvbmRWaWV3Q29weS5sZW5ndGggLSAxO1xyXG4gICAgbGV0IHZhbHVlO1xyXG4gICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IHNlY29uZFZpZXdDb3B5TGVuZ3RoOyBpID49IDA7IGktLSwgY291bnRlcisrKSB7XHJcbiAgICAgICAgdmFsdWUgPSBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSAtIHNlY29uZFZpZXdDb3B5W3NlY29uZFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gLSBiO1xyXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjYXNlICh2YWx1ZSA8IDApOlxyXG4gICAgICAgICAgICAgICAgYiA9IDE7XHJcbiAgICAgICAgICAgICAgICBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSA9IHZhbHVlICsgMTA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGIgPSAwO1xyXG4gICAgICAgICAgICAgICAgZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYiA+IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gKGZpcnN0Vmlld0NvcHlMZW5ndGggLSBzZWNvbmRWaWV3Q29weUxlbmd0aCArIDEpOyBpID49IDA7IGktLSwgY291bnRlcisrKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gLSBiO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBiID0gMTtcclxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdID0gdmFsdWUgKyAxMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGIgPSAwO1xyXG4gICAgICAgICAgICAgICAgZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpcnN0Vmlld0NvcHkuc2xpY2UoKTtcclxufVxyXG5jbGFzcyBMb2NhbEludGVnZXJWYWx1ZUJsb2NrIGV4dGVuZHMgSGV4QmxvY2soVmFsdWVCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLl92YWx1ZURlYyA9IDA7XHJcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMudmFsdWVIZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUhleCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlRGVjID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0VmFsdWVIZXgoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWVIZXhWaWV3Lmxlbmd0aCA+PSA0KSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIlRvbyBiaWcgSW50ZWdlciBmb3IgZGVjb2RpbmcsIGhleCBvbmx5XCIpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlRGVjID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlSGV4Vmlldy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZURlYyA9IHB2dXRpbHMudXRpbERlY29kZVRDLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzZXQgdmFsdWVEZWModikge1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlRGVjID0gdjtcclxuICAgICAgICB0aGlzLmlzSGV4T25seSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocHZ1dGlscy51dGlsRW5jb2RlVEModikpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHZhbHVlRGVjKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZURlYztcclxuICAgIH1cclxuICAgIGZyb21ERVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCwgZXhwZWN0ZWRMZW5ndGggPSAwKSB7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIGlmIChvZmZzZXQgPT09IC0xKVxyXG4gICAgICAgICAgICByZXR1cm4gb2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZhbHVlSGV4VmlldztcclxuICAgICAgICBpZiAoKHZpZXdbMF0gPT09IDB4MDApICYmICgodmlld1sxXSAmIDB4ODApICE9PSAwKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHZpZXcuc3ViYXJyYXkoMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZXhwZWN0ZWRMZW5ndGggIT09IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICh2aWV3Lmxlbmd0aCA8IGV4cGVjdGVkTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChleHBlY3RlZExlbmd0aCAtIHZpZXcubGVuZ3RoKSA+IDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTGVuZ3RoID0gdmlldy5sZW5ndGggKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gdmlldy5zdWJhcnJheShleHBlY3RlZExlbmd0aCAtIHZpZXcubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgdG9ERVIoc2l6ZU9ubHkgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZhbHVlSGV4VmlldztcclxuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcclxuICAgICAgICAgICAgY2FzZSAoKHZpZXdbMF0gJiAweDgwKSAhPT0gMCk6XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLnZhbHVlSGV4Vmlldy5sZW5ndGggKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVmlld1swXSA9IDB4MDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZpZXcuc2V0KHZpZXcsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gdXBkYXRlZFZpZXc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoKHZpZXdbMF0gPT09IDB4MDApICYmICgodmlld1sxXSAmIDB4ODApID09PSAwKSk6XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSB0aGlzLnZhbHVlSGV4Vmlldy5zdWJhcnJheSgxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50b0JFUihzaXplT25seSk7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHRPZmZzZXQgPSBzdXBlci5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWVIZXgoKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHkpIHtcclxuICAgICAgICByZXR1cm4gc2l6ZU9ubHlcclxuICAgICAgICAgICAgPyBuZXcgQXJyYXlCdWZmZXIodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoKVxyXG4gICAgICAgICAgICA6IHRoaXMudmFsdWVIZXhWaWV3LnNsaWNlKCkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZURlYzogdGhpcy52YWx1ZURlYyxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RCaXQgPSAodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoICogOCkgLSAxO1xyXG4gICAgICAgIGxldCBkaWdpdHMgPSBuZXcgVWludDhBcnJheSgodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoICogOCkgLyAzKTtcclxuICAgICAgICBsZXQgYml0TnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgY3VycmVudEJ5dGU7XHJcbiAgICAgICAgY29uc3QgYXNuMVZpZXcgPSB0aGlzLnZhbHVlSGV4VmlldztcclxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICBsZXQgZmxhZyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGJ5dGVOdW1iZXIgPSAoYXNuMVZpZXcuYnl0ZUxlbmd0aCAtIDEpOyBieXRlTnVtYmVyID49IDA7IGJ5dGVOdW1iZXItLSkge1xyXG4gICAgICAgICAgICBjdXJyZW50Qnl0ZSA9IGFzbjFWaWV3W2J5dGVOdW1iZXJdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKChjdXJyZW50Qnl0ZSAmIDEpID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChiaXROdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBmaXJzdEJpdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IHZpZXdTdWIocG93ZXIyKGJpdE51bWJlciksIGRpZ2l0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBcIi1cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gdmlld0FkZChkaWdpdHMsIHBvd2VyMihiaXROdW1iZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBiaXROdW1iZXIrKztcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRCeXRlID4+PSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlnaXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChkaWdpdHNbaV0pXHJcbiAgICAgICAgICAgICAgICBmbGFnID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGZsYWcpXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gZGlnaXRzU3RyaW5nLmNoYXJBdChkaWdpdHNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmxhZyA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBkaWdpdHNTdHJpbmcuY2hhckF0KDApO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuX2EkcCA9IExvY2FsSW50ZWdlclZhbHVlQmxvY2s7XHJcbkxvY2FsSW50ZWdlclZhbHVlQmxvY2suTkFNRSA9IFwiSW50ZWdlclZhbHVlQmxvY2tcIjtcclxuKCgpID0+IHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfYSRwLnByb3RvdHlwZSwgXCJ2YWx1ZUhleFwiLCB7XHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHYpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlSGV4KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVIZXhWaWV3LnNsaWNlKCkuYnVmZmVyO1xyXG4gICAgICAgIH0sXHJcbiAgICB9KTtcclxufSkoKTtcblxudmFyIF9hJG87XHJcbmNsYXNzIEludGVnZXIgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxJbnRlZ2VyVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMjtcclxuICAgIH1cclxuICAgIHRvQmlnSW50KCkge1xyXG4gICAgICAgIGFzc2VydEJpZ0ludCgpO1xyXG4gICAgICAgIHJldHVybiBCaWdJbnQodGhpcy52YWx1ZUJsb2NrLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21CaWdJbnQodmFsdWUpIHtcclxuICAgICAgICBhc3NlcnRCaWdJbnQoKTtcclxuICAgICAgICBjb25zdCBiaWdJbnRWYWx1ZSA9IEJpZ0ludCh2YWx1ZSk7XHJcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IFZpZXdXcml0ZXIoKTtcclxuICAgICAgICBjb25zdCBoZXggPSBiaWdJbnRWYWx1ZS50b1N0cmluZygxNikucmVwbGFjZSgvXi0vLCBcIlwiKTtcclxuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkocHZ0c3V0aWxzLkNvbnZlcnQuRnJvbUhleChoZXgpKTtcclxuICAgICAgICBpZiAoYmlnSW50VmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gbmV3IFVpbnQ4QXJyYXkodmlldy5sZW5ndGggKyAodmlld1swXSAmIDB4ODAgPyAxIDogMCkpO1xyXG4gICAgICAgICAgICBmaXJzdFswXSB8PSAweDgwO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdEludCA9IEJpZ0ludChgMHgke3B2dHN1dGlscy5Db252ZXJ0LlRvSGV4KGZpcnN0KX1gKTtcclxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kSW50ID0gZmlyc3RJbnQgKyBiaWdJbnRWYWx1ZTtcclxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkocHZ0c3V0aWxzLkNvbnZlcnQuRnJvbUhleChzZWNvbmRJbnQudG9TdHJpbmcoMTYpKSk7XHJcbiAgICAgICAgICAgIHNlY29uZFswXSB8PSAweDgwO1xyXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoc2Vjb25kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh2aWV3WzBdICYgMHg4MCkge1xyXG4gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKG5ldyBVaW50OEFycmF5KFswXSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSh2aWV3KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IEludGVnZXIoe1xyXG4gICAgICAgICAgICB2YWx1ZUhleDogd3JpdGVyLmZpbmFsKCksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIGNvbnZlcnRUb0RFUigpIHtcclxuICAgICAgICBjb25zdCBpbnRlZ2VyID0gbmV3IEludGVnZXIoeyB2YWx1ZUhleDogdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyB9KTtcclxuICAgICAgICBpbnRlZ2VyLnZhbHVlQmxvY2sudG9ERVIoKTtcclxuICAgICAgICByZXR1cm4gaW50ZWdlcjtcclxuICAgIH1cclxuICAgIGNvbnZlcnRGcm9tREVSKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgSW50ZWdlcih7XHJcbiAgICAgICAgICAgIHZhbHVlSGV4OiB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3WzBdID09PSAwXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcuc3ViYXJyYXkoMSlcclxuICAgICAgICAgICAgICAgIDogdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIG9uQXNjaWlFbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfSA6ICR7dGhpcy52YWx1ZUJsb2NrLnRvU3RyaW5nKCl9YDtcclxuICAgIH1cclxufVxyXG5fYSRvID0gSW50ZWdlcjtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5JbnRlZ2VyID0gX2EkbztcclxufSkoKTtcclxuSW50ZWdlci5OQU1FID0gXCJJTlRFR0VSXCI7XG5cbnZhciBfYSRuO1xyXG5jbGFzcyBFbnVtZXJhdGVkIGV4dGVuZHMgSW50ZWdlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAxMDtcclxuICAgIH1cclxufVxyXG5fYSRuID0gRW51bWVyYXRlZDtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5FbnVtZXJhdGVkID0gX2EkbjtcclxufSkoKTtcclxuRW51bWVyYXRlZC5OQU1FID0gXCJFTlVNRVJBVEVEXCI7XG5cbmNsYXNzIExvY2FsU2lkVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKFZhbHVlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWVEZWMgPSAtMSwgaXNGaXJzdFNpZCA9IGZhbHNlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWVEZWMgPSB2YWx1ZURlYztcclxuICAgICAgICB0aGlzLmlzRmlyc3RTaWQgPSBpc0ZpcnN0U2lkO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKCFpbnB1dExlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlucHV0VmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIGlucHV0VmlldywgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGludEJ1ZmZlciA9IGlucHV0Vmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheShpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3W2ldID0gaW50QnVmZmVyW2ldICYgMHg3RjtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCsrO1xyXG4gICAgICAgICAgICBpZiAoKGludEJ1ZmZlcltpXSAmIDB4ODApID09PSAweDAwKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRlbXBWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJsb2NrTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGVtcFZpZXdbaV0gPSB0aGlzLnZhbHVlSGV4Vmlld1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSB0ZW1wVmlldztcclxuICAgICAgICBpZiAoKGludEJ1ZmZlclt0aGlzLmJsb2NrTGVuZ3RoIC0gMV0gJiAweDgwKSAhPT0gMHgwMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZFwiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlSGV4Vmlld1swXSA9PT0gMHgwMClcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiTmVlZGxlc3NseSBsb25nIGZvcm1hdCBvZiBTSUQgZW5jb2RpbmdcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuYmxvY2tMZW5ndGggPD0gOClcclxuICAgICAgICAgICAgdGhpcy52YWx1ZURlYyA9IHB2dXRpbHMudXRpbEZyb21CYXNlKHRoaXMudmFsdWVIZXhWaWV3LCA3KTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0hleE9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJUb28gYmlnIFNJRCBmb3IgZGVjb2RpbmcsIGhleCBvbmx5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgdGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBzZXQgdmFsdWVCaWdJbnQodmFsdWUpIHtcclxuICAgICAgICBhc3NlcnRCaWdJbnQoKTtcclxuICAgICAgICBsZXQgYml0cyA9IEJpZ0ludCh2YWx1ZSkudG9TdHJpbmcoMik7XHJcbiAgICAgICAgd2hpbGUgKGJpdHMubGVuZ3RoICUgNykge1xyXG4gICAgICAgICAgICBiaXRzID0gXCIwXCIgKyBiaXRzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpdHMubGVuZ3RoIC8gNyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBieXRlc1tpXSA9IHBhcnNlSW50KGJpdHMuc2xpY2UoaSAqIDcsIGkgKiA3ICsgNyksIDIpICsgKGkgKyAxIDwgYnl0ZXMubGVuZ3RoID8gMHg4MCA6IDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZyb21CRVIoYnl0ZXMuYnVmZmVyLCAwLCBieXRlcy5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHkpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0hleE9ubHkpIHtcclxuICAgICAgICAgICAgaWYgKHNpemVPbmx5KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQXJyYXlCdWZmZXIodGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aCkpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJWaWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLmJsb2NrTGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAodGhpcy5ibG9ja0xlbmd0aCAtIDEpOyBpKyspXHJcbiAgICAgICAgICAgICAgICByZXRWaWV3W2ldID0gY3VyVmlld1tpXSB8IDB4ODA7XHJcbiAgICAgICAgICAgIHJldFZpZXdbdGhpcy5ibG9ja0xlbmd0aCAtIDFdID0gY3VyVmlld1t0aGlzLmJsb2NrTGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIHJldHVybiByZXRWaWV3LmJ1ZmZlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZW5jb2RlZEJ1ZiA9IHB2dXRpbHMudXRpbFRvQmFzZSh0aGlzLnZhbHVlRGVjLCA3KTtcclxuICAgICAgICBpZiAoZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVycm9yIGR1cmluZyBlbmNvZGluZyBTSUQgdmFsdWVcIjtcclxuICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JVRkZFUjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KGVuY29kZWRCdWYuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgaWYgKCFzaXplT25seSkge1xyXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkVmlldyA9IG5ldyBVaW50OEFycmF5KGVuY29kZWRCdWYpO1xyXG4gICAgICAgICAgICBjb25zdCBsZW4gPSBlbmNvZGVkQnVmLmJ5dGVMZW5ndGggLSAxO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKVxyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tpXSA9IGVuY29kZWRWaWV3W2ldIHwgMHg4MDtcclxuICAgICAgICAgICAgcmV0Vmlld1tsZW5dID0gZW5jb2RlZFZpZXdbbGVuXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldFZpZXc7XHJcbiAgICB9XHJcbiAgICB0b1N0cmluZygpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICBpZiAodGhpcy5pc0hleE9ubHkpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHB2dHN1dGlscy5Db252ZXJ0LlRvSGV4KHRoaXMudmFsdWVIZXhWaWV3KTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNGaXJzdFNpZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNpZFZhbHVlID0gdGhpcy52YWx1ZURlYztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlRGVjIDw9IDM5KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFwiMC5cIjtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlRGVjIDw9IDc5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFwiMS5cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2lkVmFsdWUgLT0gNDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBcIjIuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZFZhbHVlIC09IDgwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzaWRWYWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMudmFsdWVEZWMudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWVEZWM6IHRoaXMudmFsdWVEZWMsXHJcbiAgICAgICAgICAgIGlzRmlyc3RTaWQ6IHRoaXMuaXNGaXJzdFNpZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsU2lkVmFsdWVCbG9jay5OQU1FID0gXCJzaWRCbG9ja1wiO1xuXG5jbGFzcyBMb2NhbE9iamVjdElkZW50aWZpZXJWYWx1ZUJsb2NrIGV4dGVuZHMgVmFsdWVCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlID0gRU1QVFlfU1RSSU5HLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0ID0gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaWRCbG9jayA9IG5ldyBMb2NhbFNpZFZhbHVlQmxvY2soKTtcclxuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ID0gc2lkQmxvY2suZnJvbUJFUihpbnB1dEJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBzaWRCbG9jay5lcnJvcjtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICAgICAgc2lkQmxvY2suaXNGaXJzdFNpZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gc2lkQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgICAgIGlucHV0TGVuZ3RoIC09IHNpZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnB1c2goc2lkQmxvY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHkpIHtcclxuICAgICAgICBjb25zdCByZXRCdWZmZXJzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQnVmID0gdGhpcy52YWx1ZVtpXS50b0JFUihzaXplT25seSk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUJ1Zi5ieXRlTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gdGhpcy52YWx1ZVtpXS5lcnJvcjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0QnVmZmVycy5wdXNoKHZhbHVlQnVmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmNhdChyZXRCdWZmZXJzKTtcclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xyXG4gICAgICAgIGxldCBwb3MxID0gMDtcclxuICAgICAgICBsZXQgcG9zMiA9IDA7XHJcbiAgICAgICAgbGV0IHNpZCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGZsYWcgPSBmYWxzZTtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHBvczIgPSBzdHJpbmcuaW5kZXhPZihcIi5cIiwgcG9zMSk7XHJcbiAgICAgICAgICAgIGlmIChwb3MyID09PSAtMSlcclxuICAgICAgICAgICAgICAgIHNpZCA9IHN0cmluZy5zdWJzdHJpbmcocG9zMSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHNpZCA9IHN0cmluZy5zdWJzdHJpbmcocG9zMSwgcG9zMik7XHJcbiAgICAgICAgICAgIHBvczEgPSBwb3MyICsgMTtcclxuICAgICAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpZEJsb2NrID0gdGhpcy52YWx1ZVswXTtcclxuICAgICAgICAgICAgICAgIGxldCBwbHVzID0gMDtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoc2lkQmxvY2sudmFsdWVEZWMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGx1cyA9IDQwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdXMgPSA4MDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRTSUQgPSBwYXJzZUludChzaWQsIDEwKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hTihwYXJzZWRTSUQpKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIHNpZEJsb2NrLnZhbHVlRGVjID0gcGFyc2VkU0lEICsgcGx1cztcclxuICAgICAgICAgICAgICAgIGZsYWcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpZEJsb2NrID0gbmV3IExvY2FsU2lkVmFsdWVCbG9jaygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNpZCA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0QmlnSW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lkVmFsdWUgPSBCaWdJbnQoc2lkKTtcclxuICAgICAgICAgICAgICAgICAgICBzaWRCbG9jay52YWx1ZUJpZ0ludCA9IHNpZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2lkQmxvY2sudmFsdWVEZWMgPSBwYXJzZUludChzaWQsIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oc2lkQmxvY2sudmFsdWVEZWMpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2lkQmxvY2suaXNGaXJzdFNpZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnB1c2goc2lkQmxvY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSB3aGlsZSAocG9zMiAhPT0gLTEpO1xyXG4gICAgfVxyXG4gICAgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGlzSGV4T25seSA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpc0hleE9ubHkgPSB0aGlzLnZhbHVlW2ldLmlzSGV4T25seTtcclxuICAgICAgICAgICAgbGV0IHNpZFN0ciA9IHRoaXMudmFsdWVbaV0udG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgaWYgKGkgIT09IDApXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBgJHtyZXN1bHR9LmA7XHJcbiAgICAgICAgICAgIGlmIChpc0hleE9ubHkpIHtcclxuICAgICAgICAgICAgICAgIHNpZFN0ciA9IGB7JHtzaWRTdHJ9fWA7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZVtpXS5pc0ZpcnN0U2lkKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGAyLnske3NpZFN0cn0gLSA4MH1gO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzaWRTdHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNpZFN0cjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBvYmplY3QgPSB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50b1N0cmluZygpLFxyXG4gICAgICAgICAgICBzaWRBcnJheTogW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgb2JqZWN0LnNpZEFycmF5LnB1c2godGhpcy52YWx1ZVtpXS50b0pTT04oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICB9XHJcbn1cclxuTG9jYWxPYmplY3RJZGVudGlmaWVyVmFsdWVCbG9jay5OQU1FID0gXCJPYmplY3RJZGVudGlmaWVyVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkbTtcclxuY2xhc3MgT2JqZWN0SWRlbnRpZmllciBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBMb2NhbE9iamVjdElkZW50aWZpZXJWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSA2O1xyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVCbG9jay50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgc2V0VmFsdWUodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suZnJvbVN0cmluZyh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3RoaXMudmFsdWVCbG9jay50b1N0cmluZygpIHx8IFwiZW1wdHlcIn1gO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRWYWx1ZSgpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuX2EkbSA9IE9iamVjdElkZW50aWZpZXI7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuT2JqZWN0SWRlbnRpZmllciA9IF9hJG07XHJcbn0pKCk7XHJcbk9iamVjdElkZW50aWZpZXIuTkFNRSA9IFwiT0JKRUNUIElERU5USUZJRVJcIjtcblxuY2xhc3MgTG9jYWxSZWxhdGl2ZVNpZFZhbHVlQmxvY2sgZXh0ZW5kcyBIZXhCbG9jayhMb2NhbEJhc2VCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZURlYyA9IDAsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy52YWx1ZURlYyA9IHZhbHVlRGVjO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKGlucHV0TGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgY29uc3QgaW5wdXRWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXModGhpcywgaW5wdXRWaWV3LCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKVxyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgY29uc3QgaW50QnVmZmVyID0gaW5wdXRWaWV3LnN1YmFycmF5KGlucHV0T2Zmc2V0LCBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KGlucHV0TGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0TGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXdbaV0gPSBpbnRCdWZmZXJbaV0gJiAweDdGO1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoKys7XHJcbiAgICAgICAgICAgIGlmICgoaW50QnVmZmVyW2ldICYgMHg4MCkgPT09IDB4MDApXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGVtcFZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLmJsb2NrTGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYmxvY2tMZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgdGVtcFZpZXdbaV0gPSB0aGlzLnZhbHVlSGV4Vmlld1tpXTtcclxuICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHRlbXBWaWV3O1xyXG4gICAgICAgIGlmICgoaW50QnVmZmVyW3RoaXMuYmxvY2tMZW5ndGggLSAxXSAmIDB4ODApICE9PSAweDAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVuZCBvZiBpbnB1dCByZWFjaGVkIGJlZm9yZSBtZXNzYWdlIHdhcyBmdWxseSBkZWNvZGVkXCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWVIZXhWaWV3WzBdID09PSAweDAwKVxyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJOZWVkbGVzc2x5IGxvbmcgZm9ybWF0IG9mIFNJRCBlbmNvZGluZ1wiKTtcclxuICAgICAgICBpZiAodGhpcy5ibG9ja0xlbmd0aCA8PSA4KVxyXG4gICAgICAgICAgICB0aGlzLnZhbHVlRGVjID0gcHZ1dGlscy51dGlsRnJvbUJhc2UodGhpcy52YWx1ZUhleFZpZXcsIDcpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIlRvbyBiaWcgU0lEIGZvciBkZWNvZGluZywgaGV4IG9ubHlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoaW5wdXRPZmZzZXQgKyB0aGlzLmJsb2NrTGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgIGlmIChzaXplT25seSlcclxuICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGgpKTtcclxuICAgICAgICAgICAgY29uc3QgY3VyVmlldyA9IHRoaXMudmFsdWVIZXhWaWV3O1xyXG4gICAgICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKHRoaXMuYmxvY2tMZW5ndGggLSAxKTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tpXSA9IGN1clZpZXdbaV0gfCAweDgwO1xyXG4gICAgICAgICAgICByZXRWaWV3W3RoaXMuYmxvY2tMZW5ndGggLSAxXSA9IGN1clZpZXdbdGhpcy5ibG9ja0xlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVuY29kZWRCdWYgPSBwdnV0aWxzLnV0aWxUb0Jhc2UodGhpcy52YWx1ZURlYywgNyk7XHJcbiAgICAgICAgaWYgKGVuY29kZWRCdWYuYnl0ZUxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFcnJvciBkdXJpbmcgZW5jb2RpbmcgU0lEIHZhbHVlXCI7XHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIGlmICghc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmKTtcclxuICAgICAgICAgICAgY29uc3QgbGVuID0gZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaV0gPSBlbmNvZGVkVmlld1tpXSB8IDB4ODA7XHJcbiAgICAgICAgICAgIHJldFZpZXdbbGVuXSA9IGVuY29kZWRWaWV3W2xlbl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRWaWV3LmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSGV4T25seSlcclxuICAgICAgICAgICAgcmVzdWx0ID0gcHZ0c3V0aWxzLkNvbnZlcnQuVG9IZXgodGhpcy52YWx1ZUhleFZpZXcpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnZhbHVlRGVjLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHZhbHVlRGVjOiB0aGlzLnZhbHVlRGVjLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuTG9jYWxSZWxhdGl2ZVNpZFZhbHVlQmxvY2suTkFNRSA9IFwicmVsYXRpdmVTaWRCbG9ja1wiO1xuXG5jbGFzcyBMb2NhbFJlbGF0aXZlT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2sgZXh0ZW5kcyBWYWx1ZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUgPSBFTVBUWV9TVFJJTkcsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZyb21TdHJpbmcodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSBpbnB1dE9mZnNldDtcclxuICAgICAgICB3aGlsZSAoaW5wdXRMZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpZEJsb2NrID0gbmV3IExvY2FsUmVsYXRpdmVTaWRWYWx1ZUJsb2NrKCk7XHJcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCA9IHNpZEJsb2NrLmZyb21CRVIoaW5wdXRCdWZmZXIsIHJlc3VsdE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gc2lkQmxvY2suZXJyb3I7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gc2lkQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgICAgIGlucHV0TGVuZ3RoIC09IHNpZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnB1c2goc2lkQmxvY2spO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGNvbnN0IHJldEJ1ZmZlcnMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVCdWYgPSB0aGlzLnZhbHVlW2ldLnRvQkVSKHNpemVPbmx5KTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlQnVmLmJ5dGVMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSB0aGlzLnZhbHVlW2ldLmVycm9yO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0JVRkZFUjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXRCdWZmZXJzLnB1c2godmFsdWVCdWYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29uY2F0KHJldEJ1ZmZlcnMpO1xyXG4gICAgfVxyXG4gICAgZnJvbVN0cmluZyhzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gW107XHJcbiAgICAgICAgbGV0IHBvczEgPSAwO1xyXG4gICAgICAgIGxldCBwb3MyID0gMDtcclxuICAgICAgICBsZXQgc2lkID0gXCJcIjtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHBvczIgPSBzdHJpbmcuaW5kZXhPZihcIi5cIiwgcG9zMSk7XHJcbiAgICAgICAgICAgIGlmIChwb3MyID09PSAtMSlcclxuICAgICAgICAgICAgICAgIHNpZCA9IHN0cmluZy5zdWJzdHJpbmcocG9zMSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHNpZCA9IHN0cmluZy5zdWJzdHJpbmcocG9zMSwgcG9zMik7XHJcbiAgICAgICAgICAgIHBvczEgPSBwb3MyICsgMTtcclxuICAgICAgICAgICAgY29uc3Qgc2lkQmxvY2sgPSBuZXcgTG9jYWxSZWxhdGl2ZVNpZFZhbHVlQmxvY2soKTtcclxuICAgICAgICAgICAgc2lkQmxvY2sudmFsdWVEZWMgPSBwYXJzZUludChzaWQsIDEwKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKHNpZEJsb2NrLnZhbHVlRGVjKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnB1c2goc2lkQmxvY2spO1xyXG4gICAgICAgIH0gd2hpbGUgKHBvczIgIT09IC0xKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xyXG4gICAgICAgIGxldCBpc0hleE9ubHkgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaXNIZXhPbmx5ID0gdGhpcy52YWx1ZVtpXS5pc0hleE9ubHk7XHJcbiAgICAgICAgICAgIGxldCBzaWRTdHIgPSB0aGlzLnZhbHVlW2ldLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGlmIChpICE9PSAwKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYCR7cmVzdWx0fS5gO1xyXG4gICAgICAgICAgICBpZiAoaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgICAgICBzaWRTdHIgPSBgeyR7c2lkU3RyfX1gO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNpZFN0cjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2lkU3RyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIHNpZEFycmF5OiBbXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgb2JqZWN0LnNpZEFycmF5LnB1c2godGhpcy52YWx1ZVtpXS50b0pTT04oKSk7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgIH1cclxufVxyXG5Mb2NhbFJlbGF0aXZlT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2suTkFNRSA9IFwiUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkbDtcclxuY2xhc3MgUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIExvY2FsUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTM7XHJcbiAgICB9XHJcbiAgICBnZXRWYWx1ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUJsb2NrLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBzZXRWYWx1ZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay5mcm9tU3RyaW5nKHZhbHVlKTtcclxuICAgIH1cclxuICAgIG9uQXNjaWlFbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfSA6ICR7dGhpcy52YWx1ZUJsb2NrLnRvU3RyaW5nKCkgfHwgXCJlbXB0eVwifWA7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldFZhbHVlKCksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5fYSRsID0gUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlJlbGF0aXZlT2JqZWN0SWRlbnRpZmllciA9IF9hJGw7XHJcbn0pKCk7XHJcblJlbGF0aXZlT2JqZWN0SWRlbnRpZmllci5OQU1FID0gXCJSZWxhdGl2ZU9iamVjdElkZW50aWZpZXJcIjtcblxudmFyIF9hJGs7XHJcbmNsYXNzIFNlcXVlbmNlIGV4dGVuZHMgQ29uc3RydWN0ZWQge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTY7XHJcbiAgICB9XHJcbn1cclxuX2EkayA9IFNlcXVlbmNlO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlNlcXVlbmNlID0gX2EkaztcclxufSkoKTtcclxuU2VxdWVuY2UuTkFNRSA9IFwiU0VRVUVOQ0VcIjtcblxudmFyIF9hJGo7XHJcbmNsYXNzIFNldCBleHRlbmRzIENvbnN0cnVjdGVkIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDE3O1xyXG4gICAgfVxyXG59XHJcbl9hJGogPSBTZXQ7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuU2V0ID0gX2EkajtcclxufSkoKTtcclxuU2V0Lk5BTUUgPSBcIlNFVFwiO1xuXG5jbGFzcyBMb2NhbFN0cmluZ1ZhbHVlQmxvY2sgZXh0ZW5kcyBIZXhCbG9jayhWYWx1ZUJsb2NrKSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pc0hleE9ubHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBFTVBUWV9TVFJJTkc7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuTG9jYWxTdHJpbmdWYWx1ZUJsb2NrLk5BTUUgPSBcIlN0cmluZ1ZhbHVlQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxTaW1wbGVTdHJpbmdWYWx1ZUJsb2NrIGV4dGVuZHMgTG9jYWxTdHJpbmdWYWx1ZUJsb2NrIHtcclxufVxyXG5Mb2NhbFNpbXBsZVN0cmluZ1ZhbHVlQmxvY2suTkFNRSA9IFwiU2ltcGxlU3RyaW5nVmFsdWVCbG9ja1wiO1xuXG5jbGFzcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIGV4dGVuZHMgQmFzZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBMb2NhbFNpbXBsZVN0cmluZ1ZhbHVlQmxvY2spO1xyXG4gICAgfVxyXG4gICAgZnJvbUJ1ZmZlcihpbnB1dEJ1ZmZlcikge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpKTtcclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoaW5wdXRTdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBzdHJMZW4gPSBpbnB1dFN0cmluZy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheShzdHJMZW4pO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyTGVuOyBpKyspXHJcbiAgICAgICAgICAgIHZpZXdbaV0gPSBpbnB1dFN0cmluZy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IGlucHV0U3RyaW5nO1xyXG4gICAgfVxyXG59XHJcbkxvY2FsU2ltcGxlU3RyaW5nQmxvY2suTkFNRSA9IFwiU0lNUExFIFNUUklOR1wiO1xuXG5jbGFzcyBMb2NhbFV0ZjhTdHJpbmdWYWx1ZUJsb2NrIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBmcm9tQnVmZmVyKGlucHV0QnVmZmVyKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBwdnRzdXRpbHMuQ29udmVydC5Ub1V0ZjhTdHJpbmcoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKGBFcnJvciBkdXJpbmcgXCJkZWNvZGVVUklDb21wb25lbnRcIjogJHtleH0sIHVzaW5nIHJhdyBzdHJpbmdgKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gcHZ0c3V0aWxzLkNvbnZlcnQuVG9CaW5hcnkoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoaW5wdXRTdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocHZ0c3V0aWxzLkNvbnZlcnQuRnJvbVV0ZjhTdHJpbmcoaW5wdXRTdHJpbmcpKTtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBpbnB1dFN0cmluZztcclxuICAgIH1cclxufVxyXG5Mb2NhbFV0ZjhTdHJpbmdWYWx1ZUJsb2NrLk5BTUUgPSBcIlV0ZjhTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSRpO1xyXG5jbGFzcyBVdGY4U3RyaW5nIGV4dGVuZHMgTG9jYWxVdGY4U3RyaW5nVmFsdWVCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAxMjtcclxuICAgIH1cclxufVxyXG5fYSRpID0gVXRmOFN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5VdGY4U3RyaW5nID0gX2EkaTtcclxufSkoKTtcclxuVXRmOFN0cmluZy5OQU1FID0gXCJVVEY4U3RyaW5nXCI7XG5cbmNsYXNzIExvY2FsQm1wU3RyaW5nVmFsdWVCbG9jayBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgZnJvbUJ1ZmZlcihpbnB1dEJ1ZmZlcikge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IHB2dHN1dGlscy5Db252ZXJ0LlRvVXRmMTZTdHJpbmcoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICB9XHJcbiAgICBmcm9tU3RyaW5nKGlucHV0U3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gaW5wdXRTdHJpbmc7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHB2dHN1dGlscy5Db252ZXJ0LkZyb21VdGYxNlN0cmluZyhpbnB1dFN0cmluZykpO1xyXG4gICAgfVxyXG59XHJcbkxvY2FsQm1wU3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJCbXBTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSRoO1xyXG5jbGFzcyBCbXBTdHJpbmcgZXh0ZW5kcyBMb2NhbEJtcFN0cmluZ1ZhbHVlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDMwO1xyXG4gICAgfVxyXG59XHJcbl9hJGggPSBCbXBTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuQm1wU3RyaW5nID0gX2EkaDtcclxufSkoKTtcclxuQm1wU3RyaW5nLk5BTUUgPSBcIkJNUFN0cmluZ1wiO1xuXG5jbGFzcyBMb2NhbFVuaXZlcnNhbFN0cmluZ1ZhbHVlQmxvY2sgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGZyb21CdWZmZXIoaW5wdXRCdWZmZXIpIHtcclxuICAgICAgICBjb25zdCBjb3B5QnVmZmVyID0gQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0QnVmZmVyKSA/IGlucHV0QnVmZmVyLnNsaWNlKCkuYnVmZmVyIDogaW5wdXRCdWZmZXIuc2xpY2UoMCk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoY29weUJ1ZmZlcik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVZpZXcubGVuZ3RoOyBpICs9IDQpIHtcclxuICAgICAgICAgICAgdmFsdWVWaWV3W2ldID0gdmFsdWVWaWV3W2kgKyAzXTtcclxuICAgICAgICAgICAgdmFsdWVWaWV3W2kgKyAxXSA9IHZhbHVlVmlld1tpICsgMl07XHJcbiAgICAgICAgICAgIHZhbHVlVmlld1tpICsgMl0gPSAweDAwO1xyXG4gICAgICAgICAgICB2YWx1ZVZpZXdbaSArIDNdID0gMHgwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDMyQXJyYXkoY29weUJ1ZmZlcikpO1xyXG4gICAgfVxyXG4gICAgZnJvbVN0cmluZyhpbnB1dFN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHN0ckxlbmd0aCA9IGlucHV0U3RyaW5nLmxlbmd0aDtcclxuICAgICAgICBjb25zdCB2YWx1ZUhleFZpZXcgPSB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoc3RyTGVuZ3RoICogNCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb2RlQnVmID0gcHZ1dGlscy51dGlsVG9CYXNlKGlucHV0U3RyaW5nLmNoYXJDb2RlQXQoaSksIDgpO1xyXG4gICAgICAgICAgICBjb25zdCBjb2RlVmlldyA9IG5ldyBVaW50OEFycmF5KGNvZGVCdWYpO1xyXG4gICAgICAgICAgICBpZiAoY29kZVZpZXcubGVuZ3RoID4gNClcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBkaWYgPSA0IC0gY29kZVZpZXcubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gKGNvZGVWaWV3Lmxlbmd0aCAtIDEpOyBqID49IDA7IGotLSlcclxuICAgICAgICAgICAgICAgIHZhbHVlSGV4Vmlld1tpICogNCArIGogKyBkaWZdID0gY29kZVZpZXdbal07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IGlucHV0U3RyaW5nO1xyXG4gICAgfVxyXG59XHJcbkxvY2FsVW5pdmVyc2FsU3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJVbml2ZXJzYWxTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSRnO1xyXG5jbGFzcyBVbml2ZXJzYWxTdHJpbmcgZXh0ZW5kcyBMb2NhbFVuaXZlcnNhbFN0cmluZ1ZhbHVlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI4O1xyXG4gICAgfVxyXG59XHJcbl9hJGcgPSBVbml2ZXJzYWxTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuVW5pdmVyc2FsU3RyaW5nID0gX2EkZztcclxufSkoKTtcclxuVW5pdmVyc2FsU3RyaW5nLk5BTUUgPSBcIlVuaXZlcnNhbFN0cmluZ1wiO1xuXG52YXIgX2EkZjtcclxuY2xhc3MgTnVtZXJpY1N0cmluZyBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTg7XHJcbiAgICB9XHJcbn1cclxuX2EkZiA9IE51bWVyaWNTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuTnVtZXJpY1N0cmluZyA9IF9hJGY7XHJcbn0pKCk7XHJcbk51bWVyaWNTdHJpbmcuTkFNRSA9IFwiTnVtZXJpY1N0cmluZ1wiO1xuXG52YXIgX2EkZTtcclxuY2xhc3MgUHJpbnRhYmxlU3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAxOTtcclxuICAgIH1cclxufVxyXG5fYSRlID0gUHJpbnRhYmxlU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlByaW50YWJsZVN0cmluZyA9IF9hJGU7XHJcbn0pKCk7XHJcblByaW50YWJsZVN0cmluZy5OQU1FID0gXCJQcmludGFibGVTdHJpbmdcIjtcblxudmFyIF9hJGQ7XHJcbmNsYXNzIFRlbGV0ZXhTdHJpbmcgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDIwO1xyXG4gICAgfVxyXG59XHJcbl9hJGQgPSBUZWxldGV4U3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlRlbGV0ZXhTdHJpbmcgPSBfYSRkO1xyXG59KSgpO1xyXG5UZWxldGV4U3RyaW5nLk5BTUUgPSBcIlRlbGV0ZXhTdHJpbmdcIjtcblxudmFyIF9hJGM7XHJcbmNsYXNzIFZpZGVvdGV4U3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyMTtcclxuICAgIH1cclxufVxyXG5fYSRjID0gVmlkZW90ZXhTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuVmlkZW90ZXhTdHJpbmcgPSBfYSRjO1xyXG59KSgpO1xyXG5WaWRlb3RleFN0cmluZy5OQU1FID0gXCJWaWRlb3RleFN0cmluZ1wiO1xuXG52YXIgX2EkYjtcclxuY2xhc3MgSUE1U3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyMjtcclxuICAgIH1cclxufVxyXG5fYSRiID0gSUE1U3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLklBNVN0cmluZyA9IF9hJGI7XHJcbn0pKCk7XHJcbklBNVN0cmluZy5OQU1FID0gXCJJQTVTdHJpbmdcIjtcblxudmFyIF9hJGE7XHJcbmNsYXNzIEdyYXBoaWNTdHJpbmcgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI1O1xyXG4gICAgfVxyXG59XHJcbl9hJGEgPSBHcmFwaGljU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkdyYXBoaWNTdHJpbmcgPSBfYSRhO1xyXG59KSgpO1xyXG5HcmFwaGljU3RyaW5nLk5BTUUgPSBcIkdyYXBoaWNTdHJpbmdcIjtcblxudmFyIF9hJDk7XHJcbmNsYXNzIFZpc2libGVTdHJpbmcgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI2O1xyXG4gICAgfVxyXG59XHJcbl9hJDkgPSBWaXNpYmxlU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlZpc2libGVTdHJpbmcgPSBfYSQ5O1xyXG59KSgpO1xyXG5WaXNpYmxlU3RyaW5nLk5BTUUgPSBcIlZpc2libGVTdHJpbmdcIjtcblxudmFyIF9hJDg7XHJcbmNsYXNzIEdlbmVyYWxTdHJpbmcgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI3O1xyXG4gICAgfVxyXG59XHJcbl9hJDggPSBHZW5lcmFsU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkdlbmVyYWxTdHJpbmcgPSBfYSQ4O1xyXG59KSgpO1xyXG5HZW5lcmFsU3RyaW5nLk5BTUUgPSBcIkdlbmVyYWxTdHJpbmdcIjtcblxudmFyIF9hJDc7XHJcbmNsYXNzIENoYXJhY3RlclN0cmluZyBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMjk7XHJcbiAgICB9XHJcbn1cclxuX2EkNyA9IENoYXJhY3RlclN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5DaGFyYWN0ZXJTdHJpbmcgPSBfYSQ3O1xyXG59KSgpO1xyXG5DaGFyYWN0ZXJTdHJpbmcuTkFNRSA9IFwiQ2hhcmFjdGVyU3RyaW5nXCI7XG5cbnZhciBfYSQ2O1xyXG5jbGFzcyBVVENUaW1lIGV4dGVuZHMgVmlzaWJsZVN0cmluZyB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlLCB2YWx1ZURhdGUsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy55ZWFyID0gMDtcclxuICAgICAgICB0aGlzLm1vbnRoID0gMDtcclxuICAgICAgICB0aGlzLmRheSA9IDA7XHJcbiAgICAgICAgdGhpcy5ob3VyID0gMDtcclxuICAgICAgICB0aGlzLm1pbnV0ZSA9IDA7XHJcbiAgICAgICAgdGhpcy5zZWNvbmQgPSAwO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZyb21TdHJpbmcodmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUubGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXdbaV0gPSB2YWx1ZS5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWVEYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbURhdGUodmFsdWVEYXRlKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMudG9CdWZmZXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDIzO1xyXG4gICAgfVxyXG4gICAgZnJvbUJ1ZmZlcihpbnB1dEJ1ZmZlcikge1xyXG4gICAgICAgIHRoaXMuZnJvbVN0cmluZyhTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKSkpO1xyXG4gICAgfVxyXG4gICAgdG9CdWZmZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyID0gdGhpcy50b1N0cmluZygpO1xyXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihzdHIubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgdmlld1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICB9XHJcbiAgICBmcm9tRGF0ZShpbnB1dERhdGUpIHtcclxuICAgICAgICB0aGlzLnllYXIgPSBpbnB1dERhdGUuZ2V0VVRDRnVsbFllYXIoKTtcclxuICAgICAgICB0aGlzLm1vbnRoID0gaW5wdXREYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xyXG4gICAgICAgIHRoaXMuZGF5ID0gaW5wdXREYXRlLmdldFVUQ0RhdGUoKTtcclxuICAgICAgICB0aGlzLmhvdXIgPSBpbnB1dERhdGUuZ2V0VVRDSG91cnMoKTtcclxuICAgICAgICB0aGlzLm1pbnV0ZSA9IGlucHV0RGF0ZS5nZXRVVENNaW51dGVzKCk7XHJcbiAgICAgICAgdGhpcy5zZWNvbmQgPSBpbnB1dERhdGUuZ2V0VVRDU2Vjb25kcygpO1xyXG4gICAgfVxyXG4gICAgdG9EYXRlKCkge1xyXG4gICAgICAgIHJldHVybiAobmV3IERhdGUoRGF0ZS5VVEModGhpcy55ZWFyLCB0aGlzLm1vbnRoIC0gMSwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kKSkpO1xyXG4gICAgfVxyXG4gICAgZnJvbVN0cmluZyhpbnB1dFN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlciA9IC8oXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSlaL2lnO1xyXG4gICAgICAgIGNvbnN0IHBhcnNlckFycmF5ID0gcGFyc2VyLmV4ZWMoaW5wdXRTdHJpbmcpO1xyXG4gICAgICAgIGlmIChwYXJzZXJBcnJheSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIjtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbMV0sIDEwKTtcclxuICAgICAgICBpZiAoeWVhciA+PSA1MClcclxuICAgICAgICAgICAgdGhpcy55ZWFyID0gMTkwMCArIHllYXI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLnllYXIgPSAyMDAwICsgeWVhcjtcclxuICAgICAgICB0aGlzLm1vbnRoID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbMl0sIDEwKTtcclxuICAgICAgICB0aGlzLmRheSA9IHBhcnNlSW50KHBhcnNlckFycmF5WzNdLCAxMCk7XHJcbiAgICAgICAgdGhpcy5ob3VyID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbNF0sIDEwKTtcclxuICAgICAgICB0aGlzLm1pbnV0ZSA9IHBhcnNlSW50KHBhcnNlckFycmF5WzVdLCAxMCk7XHJcbiAgICAgICAgdGhpcy5zZWNvbmQgPSBwYXJzZUludChwYXJzZXJBcnJheVs2XSwgMTApO1xyXG4gICAgfVxyXG4gICAgdG9TdHJpbmcoZW5jb2RpbmcgPSBcImlzb1wiKSB7XHJcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSBcImlzb1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEFycmF5ID0gbmV3IEFycmF5KDcpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheVswXSA9IHB2dXRpbHMucGFkTnVtYmVyKCgodGhpcy55ZWFyIDwgMjAwMCkgPyAodGhpcy55ZWFyIC0gMTkwMCkgOiAodGhpcy55ZWFyIC0gMjAwMCkpLCAyKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXlbMV0gPSBwdnV0aWxzLnBhZE51bWJlcih0aGlzLm1vbnRoLCAyKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXlbMl0gPSBwdnV0aWxzLnBhZE51bWJlcih0aGlzLmRheSwgMik7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5WzNdID0gcHZ1dGlscy5wYWROdW1iZXIodGhpcy5ob3VyLCAyKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXlbNF0gPSBwdnV0aWxzLnBhZE51bWJlcih0aGlzLm1pbnV0ZSwgMik7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5WzVdID0gcHZ1dGlscy5wYWROdW1iZXIodGhpcy5zZWNvbmQsIDIpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheVs2XSA9IFwiWlwiO1xyXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0QXJyYXkuam9pbihcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKGVuY29kaW5nKTtcclxuICAgIH1cclxuICAgIG9uQXNjaWlFbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfSA6ICR7dGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpfWA7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHllYXI6IHRoaXMueWVhcixcclxuICAgICAgICAgICAgbW9udGg6IHRoaXMubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogdGhpcy5kYXksXHJcbiAgICAgICAgICAgIGhvdXI6IHRoaXMuaG91cixcclxuICAgICAgICAgICAgbWludXRlOiB0aGlzLm1pbnV0ZSxcclxuICAgICAgICAgICAgc2Vjb25kOiB0aGlzLnNlY29uZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbl9hJDYgPSBVVENUaW1lO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlVUQ1RpbWUgPSBfYSQ2O1xyXG59KSgpO1xyXG5VVENUaW1lLk5BTUUgPSBcIlVUQ1RpbWVcIjtcblxudmFyIF9hJDU7XHJcbmNsYXNzIEdlbmVyYWxpemVkVGltZSBleHRlbmRzIFVUQ1RpbWUge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgdmFyIF9iO1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIChfYiA9IHRoaXMubWlsbGlzZWNvbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICh0aGlzLm1pbGxpc2Vjb25kID0gMCk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMjQ7XHJcbiAgICB9XHJcbiAgICBmcm9tRGF0ZShpbnB1dERhdGUpIHtcclxuICAgICAgICBzdXBlci5mcm9tRGF0ZShpbnB1dERhdGUpO1xyXG4gICAgICAgIHRoaXMubWlsbGlzZWNvbmQgPSBpbnB1dERhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XHJcbiAgICB9XHJcbiAgICB0b0RhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIChuZXcgRGF0ZShEYXRlLlVUQyh0aGlzLnllYXIsIHRoaXMubW9udGggLSAxLCB0aGlzLmRheSwgdGhpcy5ob3VyLCB0aGlzLm1pbnV0ZSwgdGhpcy5zZWNvbmQsIHRoaXMubWlsbGlzZWNvbmQpKSk7XHJcbiAgICB9XHJcbiAgICBmcm9tU3RyaW5nKGlucHV0U3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGlzVVRDID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHRpbWVTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBkYXRlVGltZVN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGZyYWN0aW9uUGFydCA9IDA7XHJcbiAgICAgICAgbGV0IHBhcnNlcjtcclxuICAgICAgICBsZXQgaG91ckRpZmZlcmVuY2UgPSAwO1xyXG4gICAgICAgIGxldCBtaW51dGVEaWZmZXJlbmNlID0gMDtcclxuICAgICAgICBpZiAoaW5wdXRTdHJpbmdbaW5wdXRTdHJpbmcubGVuZ3RoIC0gMV0gPT09IFwiWlwiKSB7XHJcbiAgICAgICAgICAgIHRpbWVTdHJpbmcgPSBpbnB1dFN0cmluZy5zdWJzdHJpbmcoMCwgaW5wdXRTdHJpbmcubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIGlzVVRDID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWJlciA9IG5ldyBOdW1iZXIoaW5wdXRTdHJpbmdbaW5wdXRTdHJpbmcubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgICAgICBpZiAoaXNOYU4obnVtYmVyLnZhbHVlT2YoKSkpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgIHRpbWVTdHJpbmcgPSBpbnB1dFN0cmluZztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzVVRDKSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lU3RyaW5nLmluZGV4T2YoXCIrXCIpICE9PSAtMSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICAgICAgaWYgKHRpbWVTdHJpbmcuaW5kZXhPZihcIi1cIikgIT09IC0xKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IG11bHRpcGxpZXIgPSAxO1xyXG4gICAgICAgICAgICBsZXQgZGlmZmVyZW5jZVBvc2l0aW9uID0gdGltZVN0cmluZy5pbmRleE9mKFwiK1wiKTtcclxuICAgICAgICAgICAgbGV0IGRpZmZlcmVuY2VTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBpZiAoZGlmZmVyZW5jZVBvc2l0aW9uID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgZGlmZmVyZW5jZVBvc2l0aW9uID0gdGltZVN0cmluZy5pbmRleE9mKFwiLVwiKTtcclxuICAgICAgICAgICAgICAgIG11bHRpcGxpZXIgPSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGlmZmVyZW5jZVBvc2l0aW9uICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgZGlmZmVyZW5jZVN0cmluZyA9IHRpbWVTdHJpbmcuc3Vic3RyaW5nKGRpZmZlcmVuY2VQb3NpdGlvbiArIDEpO1xyXG4gICAgICAgICAgICAgICAgdGltZVN0cmluZyA9IHRpbWVTdHJpbmcuc3Vic3RyaW5nKDAsIGRpZmZlcmVuY2VQb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAoKGRpZmZlcmVuY2VTdHJpbmcubGVuZ3RoICE9PSAyKSAmJiAoZGlmZmVyZW5jZVN0cmluZy5sZW5ndGggIT09IDQpKVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBudW1iZXIgPSBwYXJzZUludChkaWZmZXJlbmNlU3RyaW5nLnN1YnN0cmluZygwLCAyKSwgMTApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKG51bWJlci52YWx1ZU9mKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICAgICAgICAgIGhvdXJEaWZmZXJlbmNlID0gbXVsdGlwbGllciAqIG51bWJlcjtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlU3RyaW5nLmxlbmd0aCA9PT0gNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlciA9IHBhcnNlSW50KGRpZmZlcmVuY2VTdHJpbmcuc3Vic3RyaW5nKDIsIDQpLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG51bWJlci52YWx1ZU9mKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbWludXRlRGlmZmVyZW5jZSA9IG11bHRpcGxpZXIgKiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGZyYWN0aW9uUG9pbnRQb3NpdGlvbiA9IHRpbWVTdHJpbmcuaW5kZXhPZihcIi5cIik7XHJcbiAgICAgICAgaWYgKGZyYWN0aW9uUG9pbnRQb3NpdGlvbiA9PT0gLTEpXHJcbiAgICAgICAgICAgIGZyYWN0aW9uUG9pbnRQb3NpdGlvbiA9IHRpbWVTdHJpbmcuaW5kZXhPZihcIixcIik7XHJcbiAgICAgICAgaWYgKGZyYWN0aW9uUG9pbnRQb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgZnJhY3Rpb25QYXJ0Q2hlY2sgPSBuZXcgTnVtYmVyKGAwJHt0aW1lU3RyaW5nLnN1YnN0cmluZyhmcmFjdGlvblBvaW50UG9zaXRpb24pfWApO1xyXG4gICAgICAgICAgICBpZiAoaXNOYU4oZnJhY3Rpb25QYXJ0Q2hlY2sudmFsdWVPZigpKSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICAgICAgZnJhY3Rpb25QYXJ0ID0gZnJhY3Rpb25QYXJ0Q2hlY2sudmFsdWVPZigpO1xyXG4gICAgICAgICAgICBkYXRlVGltZVN0cmluZyA9IHRpbWVTdHJpbmcuc3Vic3RyaW5nKDAsIGZyYWN0aW9uUG9pbnRQb3NpdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZGF0ZVRpbWVTdHJpbmcgPSB0aW1lU3RyaW5nO1xyXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjYXNlIChkYXRlVGltZVN0cmluZy5sZW5ndGggPT09IDgpOlxyXG4gICAgICAgICAgICAgICAgcGFyc2VyID0gLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KS9pZztcclxuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gIT09IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIChkYXRlVGltZVN0cmluZy5sZW5ndGggPT09IDEwKTpcclxuICAgICAgICAgICAgICAgIHBhcnNlciA9IC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS9pZztcclxuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYWN0aW9uUmVzdWx0ID0gNjAgKiBmcmFjdGlvblBhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW51dGUgPSBNYXRoLmZsb29yKGZyYWN0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBmcmFjdGlvblJlc3VsdCA9IDYwICogKGZyYWN0aW9uUmVzdWx0IC0gdGhpcy5taW51dGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kID0gTWF0aC5mbG9vcihmcmFjdGlvblJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25SZXN1bHQgPSAxMDAwICogKGZyYWN0aW9uUmVzdWx0IC0gdGhpcy5zZWNvbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmQgPSBNYXRoLmZsb29yKGZyYWN0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIChkYXRlVGltZVN0cmluZy5sZW5ndGggPT09IDEyKTpcclxuICAgICAgICAgICAgICAgIHBhcnNlciA9IC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pL2lnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZyYWN0aW9uUG9pbnRQb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZnJhY3Rpb25SZXN1bHQgPSA2MCAqIGZyYWN0aW9uUGFydDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY29uZCA9IE1hdGguZmxvb3IoZnJhY3Rpb25SZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uUmVzdWx0ID0gMTAwMCAqIChmcmFjdGlvblJlc3VsdCAtIHRoaXMuc2Vjb25kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbGxpc2Vjb25kID0gTWF0aC5mbG9vcihmcmFjdGlvblJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoZGF0ZVRpbWVTdHJpbmcubGVuZ3RoID09PSAxNCk6XHJcbiAgICAgICAgICAgICAgICBwYXJzZXIgPSAvKFxcZHs0fSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pL2lnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZyYWN0aW9uUG9pbnRQb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmFjdGlvblJlc3VsdCA9IDEwMDAgKiBmcmFjdGlvblBhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZCA9IE1hdGguZmxvb3IoZnJhY3Rpb25SZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcnNlckFycmF5ID0gcGFyc2VyLmV4ZWMoZGF0ZVRpbWVTdHJpbmcpO1xyXG4gICAgICAgIGlmIChwYXJzZXJBcnJheSA9PT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgcGFyc2VyQXJyYXkubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgc3dpdGNoIChqKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbal0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbal0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRheSA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3VyID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbal0sIDEwKSArIGhvdXJEaWZmZXJlbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWludXRlID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbal0sIDEwKSArIG1pbnV0ZURpZmZlcmVuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSBwYXJzZUludChwYXJzZXJBcnJheVtqXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzVVRDID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wRGF0ZSA9IG5ldyBEYXRlKHRoaXMueWVhciwgdGhpcy5tb250aCwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLm1pbGxpc2Vjb25kKTtcclxuICAgICAgICAgICAgdGhpcy55ZWFyID0gdGVtcERhdGUuZ2V0VVRDRnVsbFllYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5tb250aCA9IHRlbXBEYXRlLmdldFVUQ01vbnRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF5ID0gdGVtcERhdGUuZ2V0VVRDRGF5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuaG91ciA9IHRlbXBEYXRlLmdldFVUQ0hvdXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMubWludXRlID0gdGVtcERhdGUuZ2V0VVRDTWludXRlcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNlY29uZCA9IHRlbXBEYXRlLmdldFVUQ1NlY29uZHMoKTtcclxuICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZCA9IHRlbXBEYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRvU3RyaW5nKGVuY29kaW5nID0gXCJpc29cIikge1xyXG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gXCJpc29cIikge1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKHB2dXRpbHMucGFkTnVtYmVyKHRoaXMueWVhciwgNCkpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKHB2dXRpbHMucGFkTnVtYmVyKHRoaXMubW9udGgsIDIpKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLmRheSwgMikpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKHB2dXRpbHMucGFkTnVtYmVyKHRoaXMuaG91ciwgMikpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKHB2dXRpbHMucGFkTnVtYmVyKHRoaXMubWludXRlLCAyKSk7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2gocHZ1dGlscy5wYWROdW1iZXIodGhpcy5zZWNvbmQsIDIpKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWlsbGlzZWNvbmQgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2goXCIuXCIpO1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLm1pbGxpc2Vjb25kLCAzKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChcIlpcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRBcnJheS5qb2luKFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoZW5jb2RpbmcpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICBtaWxsaXNlY29uZDogdGhpcy5taWxsaXNlY29uZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbl9hJDUgPSBHZW5lcmFsaXplZFRpbWU7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuR2VuZXJhbGl6ZWRUaW1lID0gX2EkNTtcclxufSkoKTtcclxuR2VuZXJhbGl6ZWRUaW1lLk5BTUUgPSBcIkdlbmVyYWxpemVkVGltZVwiO1xuXG52YXIgX2EkNDtcclxuY2xhc3MgREFURSBleHRlbmRzIFV0ZjhTdHJpbmcge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMzE7XHJcbiAgICB9XHJcbn1cclxuX2EkNCA9IERBVEU7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuREFURSA9IF9hJDQ7XHJcbn0pKCk7XHJcbkRBVEUuTkFNRSA9IFwiREFURVwiO1xuXG52YXIgX2EkMztcclxuY2xhc3MgVGltZU9mRGF5IGV4dGVuZHMgVXRmOFN0cmluZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAzMjtcclxuICAgIH1cclxufVxyXG5fYSQzID0gVGltZU9mRGF5O1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlRpbWVPZkRheSA9IF9hJDM7XHJcbn0pKCk7XHJcblRpbWVPZkRheS5OQU1FID0gXCJUaW1lT2ZEYXlcIjtcblxudmFyIF9hJDI7XHJcbmNsYXNzIERhdGVUaW1lIGV4dGVuZHMgVXRmOFN0cmluZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAzMztcclxuICAgIH1cclxufVxyXG5fYSQyID0gRGF0ZVRpbWU7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuRGF0ZVRpbWUgPSBfYSQyO1xyXG59KSgpO1xyXG5EYXRlVGltZS5OQU1FID0gXCJEYXRlVGltZVwiO1xuXG52YXIgX2EkMTtcclxuY2xhc3MgRHVyYXRpb24gZXh0ZW5kcyBVdGY4U3RyaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDM0O1xyXG4gICAgfVxyXG59XHJcbl9hJDEgPSBEdXJhdGlvbjtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5EdXJhdGlvbiA9IF9hJDE7XHJcbn0pKCk7XHJcbkR1cmF0aW9uLk5BTUUgPSBcIkR1cmF0aW9uXCI7XG5cbnZhciBfYTtcclxuY2xhc3MgVElNRSBleHRlbmRzIFV0ZjhTdHJpbmcge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTQ7XHJcbiAgICB9XHJcbn1cclxuX2EgPSBUSU1FO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlRJTUUgPSBfYTtcclxufSkoKTtcclxuVElNRS5OQU1FID0gXCJUSU1FXCI7XG5cbmNsYXNzIEFueSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IG5hbWUgPSBFTVBUWV9TVFJJTkcsIG9wdGlvbmFsID0gZmFsc2UsIH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIENob2ljZSBleHRlbmRzIEFueSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlID0gW10sIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFJlcGVhdGVkIGV4dGVuZHMgQW55IHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUgPSBuZXcgQW55KCksIGxvY2FsID0gZmFsc2UsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMubG9jYWwgPSBsb2NhbDtcclxuICAgIH1cclxufVxuXG5jbGFzcyBSYXdEYXRhIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgZGF0YSA9IEVNUFRZX1ZJRVcgfSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGRhdGEpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzZXQgZGF0YSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBlbmRMZW5ndGggPSBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcikuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGVuZExlbmd0aCk7XHJcbiAgICAgICAgcmV0dXJuIGVuZExlbmd0aDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICB9XHJcbn1cblxuZnVuY3Rpb24gY29tcGFyZVNjaGVtYShyb290LCBpbnB1dERhdGEsIGlucHV0U2NoZW1hKSB7XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEgaW5zdGFuY2VvZiBDaG9pY2UpIHtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlucHV0U2NoZW1hLnZhbHVlLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmVTY2hlbWEocm9vdCwgaW5wdXREYXRhLCBpbnB1dFNjaGVtYS52YWx1ZVtqXSk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQudmVyaWZpZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc3QgX3Jlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBcIldyb25nIHZhbHVlcyBmb3IgQ2hvaWNlIHR5cGVcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLmhhc093blByb3BlcnR5KE5BTUUpKVxyXG4gICAgICAgICAgICAgICAgX3Jlc3VsdC5uYW1lID0gaW5wdXRTY2hlbWEubmFtZTtcclxuICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0U2NoZW1hIGluc3RhbmNlb2YgQW55KSB7XHJcbiAgICAgICAgaWYgKGlucHV0U2NoZW1hLmhhc093blByb3BlcnR5KE5BTUUpKVxyXG4gICAgICAgICAgICByb290W2lucHV0U2NoZW1hLm5hbWVdID0gaW5wdXREYXRhO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKChyb290IGluc3RhbmNlb2YgT2JqZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyByb290IG9iamVjdFwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKChpbnB1dERhdGEgaW5zdGFuY2VvZiBPYmplY3QpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIGRhdGFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgoaW5wdXRTY2hlbWEgaW5zdGFuY2VvZiBPYmplY3QpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKChJRF9CTE9DSyBpbiBpbnB1dFNjaGVtYSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoKEZST01fQkVSIGluIGlucHV0U2NoZW1hLmlkQmxvY2spID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKChUT19CRVIgaW4gaW5wdXRTY2hlbWEuaWRCbG9jaykgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBlbmNvZGVkSWQgPSBpbnB1dFNjaGVtYS5pZEJsb2NrLnRvQkVSKGZhbHNlKTtcclxuICAgIGlmIChlbmNvZGVkSWQuYnl0ZUxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIkVycm9yIGVuY29kaW5nIGlkQmxvY2sgZm9yIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVjb2RlZE9mZnNldCA9IGlucHV0U2NoZW1hLmlkQmxvY2suZnJvbUJFUihlbmNvZGVkSWQsIDAsIGVuY29kZWRJZC5ieXRlTGVuZ3RoKTtcclxuICAgIGlmIChkZWNvZGVkT2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIkVycm9yIGRlY29kaW5nIGlkQmxvY2sgZm9yIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0U2NoZW1hLmlkQmxvY2suaGFzT3duUHJvcGVydHkoVEFHX0NMQVNTKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLnRhZ0NsYXNzICE9PSBpbnB1dERhdGEuaWRCbG9jay50YWdDbGFzcykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLmhhc093blByb3BlcnR5KFRBR19OVU1CRVIpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0U2NoZW1hLmlkQmxvY2sudGFnTnVtYmVyICE9PSBpbnB1dERhdGEuaWRCbG9jay50YWdOdW1iZXIpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEuaWRCbG9jay5oYXNPd25Qcm9wZXJ0eShJU19DT05TVFJVQ1RFRCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEuaWRCbG9jay5pc0NvbnN0cnVjdGVkICE9PSBpbnB1dERhdGEuaWRCbG9jay5pc0NvbnN0cnVjdGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKCEoSVNfSEVYX09OTFkgaW4gaW5wdXRTY2hlbWEuaWRCbG9jaykpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLmlzSGV4T25seSAhPT0gaW5wdXREYXRhLmlkQmxvY2suaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0U2NoZW1hLmlkQmxvY2suaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgaWYgKChWQUxVRV9IRVhfVklFVyBpbiBpbnB1dFNjaGVtYS5pZEJsb2NrKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjaGVtYVZpZXcgPSBpbnB1dFNjaGVtYS5pZEJsb2NrLnZhbHVlSGV4VmlldztcclxuICAgICAgICBjb25zdCBhc24xVmlldyA9IGlucHV0RGF0YS5pZEJsb2NrLnZhbHVlSGV4VmlldztcclxuICAgICAgICBpZiAoc2NoZW1hVmlldy5sZW5ndGggIT09IGFzbjFWaWV3Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hVmlldy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hVmlld1tpXSAhPT0gYXNuMVZpZXdbMV0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgaW5wdXRTY2hlbWEubmFtZSA9IGlucHV0U2NoZW1hLm5hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgRU1QVFlfU1RSSU5HKTtcclxuICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSlcclxuICAgICAgICAgICAgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXSA9IGlucHV0RGF0YTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYSBpbnN0YW5jZW9mIHR5cGVTdG9yZS5Db25zdHJ1Y3RlZCkge1xyXG4gICAgICAgIGxldCBhZG1pc3Npb24gPSAwO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7XHJcbiAgICAgICAgICAgICAgICBlcnJvcjogXCJVbmtub3duIGVycm9yXCIsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCBtYXhMZW5ndGggPSBpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlLmxlbmd0aDtcclxuICAgICAgICBpZiAobWF4TGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVswXSBpbnN0YW5jZW9mIFJlcGVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGggPSBpbnB1dERhdGEudmFsdWVCbG9jay52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKChpbnB1dERhdGEudmFsdWVCbG9jay52YWx1ZS5sZW5ndGggPT09IDApICYmXHJcbiAgICAgICAgICAgIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlLmxlbmd0aCAhPT0gMCkpIHtcclxuICAgICAgICAgICAgbGV0IF9vcHRpb25hbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIF9vcHRpb25hbCA9IF9vcHRpb25hbCAmJiAoaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVtpXS5vcHRpb25hbCB8fCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmIChfb3B0aW9uYWwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvb3RbaW5wdXRTY2hlbWEubmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcm9vdC5lcnJvciA9IFwiSW5jb25zaXN0ZW50IG9iamVjdCBsZW5ndGhcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICgoaSAtIGFkbWlzc2lvbikgPj0gaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVtpXS5vcHRpb25hbCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBfcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5lcnJvciA9IFwiSW5jb25zaXN0ZW50IGxlbmd0aCBiZXR3ZWVuIEFTTi4xIGRhdGEgYW5kIHNjaGVtYVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U2NoZW1hLm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csIEVNUFRZX1NUUklORyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQubmFtZSA9IGlucHV0U2NoZW1hLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVswXSBpbnN0YW5jZW9mIFJlcGVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZVNjaGVtYShyb290LCBpbnB1dERhdGEudmFsdWVCbG9jay52YWx1ZVtpXSwgaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVswXS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52ZXJpZmllZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0ub3B0aW9uYWwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pc3Npb24rKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U2NoZW1hLm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csIEVNUFRZX1NUUklORyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb290W2lucHV0U2NoZW1hLm5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoKE5BTUUgaW4gaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVswXSkgJiYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0ubmFtZS5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyYXlSb290ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoTE9DQUwgaW4gaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVswXSkgJiYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0ubG9jYWwpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlSb290ID0gaW5wdXREYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVJvb3QgPSByb290O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFycmF5Um9vdFtpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm5hbWVdID09PSBcInVuZGVmaW5lZFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlSb290W2lucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0ubmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlSb290W2lucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0ubmFtZV0ucHVzaChpbnB1dERhdGEudmFsdWVCbG9jay52YWx1ZVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZVNjaGVtYShyb290LCBpbnB1dERhdGEudmFsdWVCbG9jay52YWx1ZVtpIC0gYWRtaXNzaW9uXSwgaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52ZXJpZmllZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbaV0ub3B0aW9uYWwpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pc3Npb24rKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U2NoZW1hLm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csIEVNUFRZX1NUUklORyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb290W2lucHV0U2NoZW1hLm5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzdWx0LnZlcmlmaWVkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb25zdCBfcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0Lm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5wcmltaXRpdmVTY2hlbWEgJiZcclxuICAgICAgICAoVkFMVUVfSEVYX1ZJRVcgaW4gaW5wdXREYXRhLnZhbHVlQmxvY2spKSB7XHJcbiAgICAgICAgY29uc3QgYXNuMSA9IGxvY2FsRnJvbUJFUihpbnB1dERhdGEudmFsdWVCbG9jay52YWx1ZUhleFZpZXcpO1xyXG4gICAgICAgIGlmIChhc24xLm9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgX3Jlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogYXNuMS5yZXN1bHRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0U2NoZW1hLm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csIEVNUFRZX1NUUklORyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb290W2lucHV0U2NoZW1hLm5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIF9yZXN1bHQubmFtZSA9IGlucHV0U2NoZW1hLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb21wYXJlU2NoZW1hKHJvb3QsIGFzbjEucmVzdWx0LCBpbnB1dFNjaGVtYS5wcmltaXRpdmVTY2hlbWEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcclxuICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gdmVyaWZ5U2NoZW1hKGlucHV0QnVmZmVyLCBpbnB1dFNjaGVtYSkge1xyXG4gICAgaWYgKChpbnB1dFNjaGVtYSBpbnN0YW5jZW9mIE9iamVjdCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hIHR5cGVcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFzbjEgPSBsb2NhbEZyb21CRVIocHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpKTtcclxuICAgIGlmIChhc24xLm9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogYXNuMS5yZXN1bHRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbXBhcmVTY2hlbWEoYXNuMS5yZXN1bHQsIGFzbjEucmVzdWx0LCBpbnB1dFNjaGVtYSk7XHJcbn1cblxuZXhwb3J0IHsgQW55LCBCYXNlQmxvY2ssIEJhc2VTdHJpbmdCbG9jaywgQml0U3RyaW5nLCBCbXBTdHJpbmcsIEJvb2xlYW4sIENoYXJhY3RlclN0cmluZywgQ2hvaWNlLCBDb25zdHJ1Y3RlZCwgREFURSwgRGF0ZVRpbWUsIER1cmF0aW9uLCBFbmRPZkNvbnRlbnQsIEVudW1lcmF0ZWQsIEdlbmVyYWxTdHJpbmcsIEdlbmVyYWxpemVkVGltZSwgR3JhcGhpY1N0cmluZywgSGV4QmxvY2ssIElBNVN0cmluZywgSW50ZWdlciwgTnVsbCwgTnVtZXJpY1N0cmluZywgT2JqZWN0SWRlbnRpZmllciwgT2N0ZXRTdHJpbmcsIFByaW1pdGl2ZSwgUHJpbnRhYmxlU3RyaW5nLCBSYXdEYXRhLCBSZWxhdGl2ZU9iamVjdElkZW50aWZpZXIsIFJlcGVhdGVkLCBTZXF1ZW5jZSwgU2V0LCBUSU1FLCBUZWxldGV4U3RyaW5nLCBUaW1lT2ZEYXksIFVUQ1RpbWUsIFVuaXZlcnNhbFN0cmluZywgVXRmOFN0cmluZywgVmFsdWVCbG9jaywgVmlkZW90ZXhTdHJpbmcsIFZpZXdXcml0ZXIsIFZpc2libGVTdHJpbmcsIGNvbXBhcmVTY2hlbWEsIGZyb21CRVIsIHZlcmlmeVNjaGVtYSB9O1xuIiwgImV4cG9ydCB2YXIgQXNuVHlwZVR5cGVzO1xuKGZ1bmN0aW9uIChBc25UeXBlVHlwZXMpIHtcbiAgICBBc25UeXBlVHlwZXNbQXNuVHlwZVR5cGVzW1wiU2VxdWVuY2VcIl0gPSAwXSA9IFwiU2VxdWVuY2VcIjtcbiAgICBBc25UeXBlVHlwZXNbQXNuVHlwZVR5cGVzW1wiU2V0XCJdID0gMV0gPSBcIlNldFwiO1xuICAgIEFzblR5cGVUeXBlc1tBc25UeXBlVHlwZXNbXCJDaG9pY2VcIl0gPSAyXSA9IFwiQ2hvaWNlXCI7XG59KShBc25UeXBlVHlwZXMgfHwgKEFzblR5cGVUeXBlcyA9IHt9KSk7XG5leHBvcnQgdmFyIEFzblByb3BUeXBlcztcbihmdW5jdGlvbiAoQXNuUHJvcFR5cGVzKSB7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkFueVwiXSA9IDFdID0gXCJBbnlcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiQm9vbGVhblwiXSA9IDJdID0gXCJCb29sZWFuXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIk9jdGV0U3RyaW5nXCJdID0gM10gPSBcIk9jdGV0U3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkJpdFN0cmluZ1wiXSA9IDRdID0gXCJCaXRTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiSW50ZWdlclwiXSA9IDVdID0gXCJJbnRlZ2VyXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkVudW1lcmF0ZWRcIl0gPSA2XSA9IFwiRW51bWVyYXRlZFwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJPYmplY3RJZGVudGlmaWVyXCJdID0gN10gPSBcIk9iamVjdElkZW50aWZpZXJcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVXRmOFN0cmluZ1wiXSA9IDhdID0gXCJVdGY4U3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkJtcFN0cmluZ1wiXSA9IDldID0gXCJCbXBTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVW5pdmVyc2FsU3RyaW5nXCJdID0gMTBdID0gXCJVbml2ZXJzYWxTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiTnVtZXJpY1N0cmluZ1wiXSA9IDExXSA9IFwiTnVtZXJpY1N0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJQcmludGFibGVTdHJpbmdcIl0gPSAxMl0gPSBcIlByaW50YWJsZVN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJUZWxldGV4U3RyaW5nXCJdID0gMTNdID0gXCJUZWxldGV4U3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIlZpZGVvdGV4U3RyaW5nXCJdID0gMTRdID0gXCJWaWRlb3RleFN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJJQTVTdHJpbmdcIl0gPSAxNV0gPSBcIklBNVN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJHcmFwaGljU3RyaW5nXCJdID0gMTZdID0gXCJHcmFwaGljU3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIlZpc2libGVTdHJpbmdcIl0gPSAxN10gPSBcIlZpc2libGVTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiR2VuZXJhbFN0cmluZ1wiXSA9IDE4XSA9IFwiR2VuZXJhbFN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJDaGFyYWN0ZXJTdHJpbmdcIl0gPSAxOV0gPSBcIkNoYXJhY3RlclN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJVVENUaW1lXCJdID0gMjBdID0gXCJVVENUaW1lXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkdlbmVyYWxpemVkVGltZVwiXSA9IDIxXSA9IFwiR2VuZXJhbGl6ZWRUaW1lXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkRBVEVcIl0gPSAyMl0gPSBcIkRBVEVcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVGltZU9mRGF5XCJdID0gMjNdID0gXCJUaW1lT2ZEYXlcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiRGF0ZVRpbWVcIl0gPSAyNF0gPSBcIkRhdGVUaW1lXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkR1cmF0aW9uXCJdID0gMjVdID0gXCJEdXJhdGlvblwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJUSU1FXCJdID0gMjZdID0gXCJUSU1FXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIk51bGxcIl0gPSAyN10gPSBcIk51bGxcIjtcbn0pKEFzblByb3BUeXBlcyB8fCAoQXNuUHJvcFR5cGVzID0ge30pKTtcbiIsICJpbXBvcnQgKiBhcyBhc24xanMgZnJvbSBcImFzbjFqc1wiO1xuaW1wb3J0IHsgQXNuUHJvcFR5cGVzIH0gZnJvbSBcIi4vZW51bXNcIjtcbmV4cG9ydCBjb25zdCBBc25BbnlDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGFzbjFqcy5OdWxsID8gbnVsbCA6IHZhbHVlLnZhbHVlQmVmb3JlRGVjb2RlVmlldyxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBhc24xanMuTnVsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGFzbjFqcy5mcm9tQkVSKHZhbHVlKTtcbiAgICAgICAgaWYgKHNjaGVtYS5yZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzY2hlbWEucmVzdWx0LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NoZW1hLnJlc3VsdDtcbiAgICB9LFxufTtcbmV4cG9ydCBjb25zdCBBc25JbnRlZ2VyQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aCA+PSA0XG4gICAgICAgID8gdmFsdWUudmFsdWVCbG9jay50b1N0cmluZygpXG4gICAgICAgIDogdmFsdWUudmFsdWVCbG9jay52YWx1ZURlYyxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgYXNuMWpzLkludGVnZXIoeyB2YWx1ZTogK3ZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25FbnVtZXJhdGVkQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZURlYyxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgYXNuMWpzLkVudW1lcmF0ZWQoeyB2YWx1ZSB9KSxcbn07XG5leHBvcnQgY29uc3QgQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleFZpZXcsXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5JbnRlZ2VyKHsgdmFsdWVIZXg6IHZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25JbnRlZ2VyQmlnSW50Q29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudG9CaWdJbnQoKSxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBhc24xanMuSW50ZWdlci5mcm9tQmlnSW50KHZhbHVlKSxcbn07XG5leHBvcnQgY29uc3QgQXNuQml0U3RyaW5nQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleFZpZXcsXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5CaXRTdHJpbmcoeyB2YWx1ZUhleDogdmFsdWUgfSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbk9iamVjdElkZW50aWZpZXJDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZS52YWx1ZUJsb2NrLnRvU3RyaW5nKCksXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5PYmplY3RJZGVudGlmaWVyKHsgdmFsdWUgfSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbkJvb2xlYW5Db252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZS52YWx1ZUJsb2NrLnZhbHVlLFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuQm9vbGVhbih7IHZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25PY3RldFN0cmluZ0NvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3LFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuT2N0ZXRTdHJpbmcoeyB2YWx1ZUhleDogdmFsdWUgfSksXG59O1xuZnVuY3Rpb24gY3JlYXRlU3RyaW5nQ29udmVydGVyKEFzbjFUeXBlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZS52YWx1ZUJsb2NrLnZhbHVlLFxuICAgICAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgQXNuMVR5cGUoeyB2YWx1ZSB9KSxcbiAgICB9O1xufVxuZXhwb3J0IGNvbnN0IEFzblV0ZjhTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLlV0ZjhTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzbkJtcFN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuQm1wU3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25Vbml2ZXJzYWxTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLlVuaXZlcnNhbFN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuTnVtZXJpY1N0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuTnVtZXJpY1N0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuUHJpbnRhYmxlU3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5QcmludGFibGVTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzblRlbGV0ZXhTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLlRlbGV0ZXhTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzblZpZGVvdGV4U3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5WaWRlb3RleFN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuSUE1U3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5JQTVTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzbkdyYXBoaWNTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLkdyYXBoaWNTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzblZpc2libGVTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLlZpc2libGVTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzbkdlbmVyYWxTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLkdlbmVyYWxTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzbkNoYXJhY3RlclN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuQ2hhcmFjdGVyU3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25VVENUaW1lQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudG9EYXRlKCksXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5VVENUaW1lKHsgdmFsdWVEYXRlOiB2YWx1ZSB9KSxcbn07XG5leHBvcnQgY29uc3QgQXNuR2VuZXJhbGl6ZWRUaW1lQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudG9EYXRlKCksXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5HZW5lcmFsaXplZFRpbWUoeyB2YWx1ZURhdGU6IHZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25OdWxsQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICgpID0+IG51bGwsXG4gICAgdG9BU046ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBhc24xanMuTnVsbCgpO1xuICAgIH0sXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRDb252ZXJ0ZXIodHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5Bbnk6XG4gICAgICAgICAgICByZXR1cm4gQXNuQW55Q29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5CaXRTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuQml0U3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5CbXBTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuQm1wU3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5Cb29sZWFuOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkJvb2xlYW5Db252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkNoYXJhY3RlclN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25DaGFyYWN0ZXJTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkVudW1lcmF0ZWQ6XG4gICAgICAgICAgICByZXR1cm4gQXNuRW51bWVyYXRlZENvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuR2VuZXJhbFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25HZW5lcmFsU3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5HZW5lcmFsaXplZFRpbWU6XG4gICAgICAgICAgICByZXR1cm4gQXNuR2VuZXJhbGl6ZWRUaW1lQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5HcmFwaGljU3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkdyYXBoaWNTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLklBNVN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25JQTVTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkludGVnZXI6XG4gICAgICAgICAgICByZXR1cm4gQXNuSW50ZWdlckNvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuTnVsbDpcbiAgICAgICAgICAgIHJldHVybiBBc25OdWxsQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5OdW1lcmljU3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzbk51bWVyaWNTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLk9iamVjdElkZW50aWZpZXI6XG4gICAgICAgICAgICByZXR1cm4gQXNuT2JqZWN0SWRlbnRpZmllckNvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuT2N0ZXRTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuT2N0ZXRTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLlByaW50YWJsZVN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25QcmludGFibGVTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLlRlbGV0ZXhTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuVGVsZXRleFN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuVVRDVGltZTpcbiAgICAgICAgICAgIHJldHVybiBBc25VVENUaW1lQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5Vbml2ZXJzYWxTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuVW5pdmVyc2FsU3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5VdGY4U3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzblV0ZjhTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLlZpZGVvdGV4U3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzblZpZGVvdGV4U3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5WaXNpYmxlU3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzblZpc2libGVTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCAiaW1wb3J0ICogYXMgYXNuMWpzIGZyb20gXCJhc24xanNcIjtcbmltcG9ydCB7IEJ1ZmZlclNvdXJjZUNvbnZlcnRlciB9IGZyb20gXCJwdnRzdXRpbHNcIjtcbmV4cG9ydCBjbGFzcyBCaXRTdHJpbmcge1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcywgdW51c2VkQml0cyA9IDApIHtcbiAgICAgICAgdGhpcy51bnVzZWRCaXRzID0gMDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyb21OdW1iZXIocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEJ1ZmZlclNvdXJjZUNvbnZlcnRlci5pc0J1ZmZlclNvdXJjZShwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnVzZWRCaXRzID0gdW51c2VkQml0cztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIlVuc3VwcG9ydGVkIHR5cGUgb2YgJ3BhcmFtcycgYXJndW1lbnQgZm9yIEJpdFN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmcm9tQVNOKGFzbikge1xuICAgICAgICBpZiAoIShhc24gaW5zdGFuY2VvZiBhc24xanMuQml0U3RyaW5nKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50ICdhc24nIGlzIG5vdCBpbnN0YW5jZSBvZiBBU04uMSBCaXRTdHJpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bnVzZWRCaXRzID0gYXNuLnZhbHVlQmxvY2sudW51c2VkQml0cztcbiAgICAgICAgdGhpcy52YWx1ZSA9IGFzbi52YWx1ZUJsb2NrLnZhbHVlSGV4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9BU04oKSB7XG4gICAgICAgIHJldHVybiBuZXcgYXNuMWpzLkJpdFN0cmluZyh7IHVudXNlZEJpdHM6IHRoaXMudW51c2VkQml0cywgdmFsdWVIZXg6IHRoaXMudmFsdWUgfSk7XG4gICAgfVxuICAgIHRvU2NoZW1hKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhc24xanMuQml0U3RyaW5nKHsgbmFtZSB9KTtcbiAgICB9XG4gICAgdG9OdW1iZXIoKSB7XG4gICAgICAgIGxldCByZXMgPSBcIlwiO1xuICAgICAgICBjb25zdCB1aW50QXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLnZhbHVlKTtcbiAgICAgICAgZm9yIChjb25zdCBvY3RldCBvZiB1aW50QXJyYXkpIHtcbiAgICAgICAgICAgIHJlcyArPSBvY3RldC50b1N0cmluZygyKS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gcmVzLnNwbGl0KFwiXCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuICAgICAgICBpZiAodGhpcy51bnVzZWRCaXRzKSB7XG4gICAgICAgICAgICByZXMgPSByZXMuc2xpY2UodGhpcy51bnVzZWRCaXRzKS5wYWRTdGFydCh0aGlzLnVudXNlZEJpdHMsIFwiMFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VJbnQocmVzLCAyKTtcbiAgICB9XG4gICAgZnJvbU51bWJlcih2YWx1ZSkge1xuICAgICAgICBsZXQgYml0cyA9IHZhbHVlLnRvU3RyaW5nKDIpO1xuICAgICAgICBjb25zdCBvY3RldFNpemUgPSAoYml0cy5sZW5ndGggKyA3KSA+PiAzO1xuICAgICAgICB0aGlzLnVudXNlZEJpdHMgPSAob2N0ZXRTaXplIDw8IDMpIC0gYml0cy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG9jdGV0cyA9IG5ldyBVaW50OEFycmF5KG9jdGV0U2l6ZSk7XG4gICAgICAgIGJpdHMgPSBiaXRzLnBhZFN0YXJ0KG9jdGV0U2l6ZSA8PCAzLCBcIjBcIikuc3BsaXQoXCJcIikucmV2ZXJzZSgpLmpvaW4oXCJcIik7XG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IG9jdGV0U2l6ZSkge1xuICAgICAgICAgICAgb2N0ZXRzW2luZGV4XSA9IHBhcnNlSW50KGJpdHMuc2xpY2UoaW5kZXggPDwgMywgKGluZGV4IDw8IDMpICsgOCksIDIpO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gb2N0ZXRzLmJ1ZmZlcjtcbiAgICB9XG59XG4iLCAiaW1wb3J0ICogYXMgYXNuMWpzIGZyb20gXCJhc24xanNcIjtcbmltcG9ydCB7IEJ1ZmZlclNvdXJjZUNvbnZlcnRlciB9IGZyb20gXCJwdnRzdXRpbHNcIjtcbmV4cG9ydCBjbGFzcyBPY3RldFN0cmluZyB7XG4gICAgY29uc3RydWN0b3IocGFyYW0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIocGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKEJ1ZmZlclNvdXJjZUNvbnZlcnRlci5pc0J1ZmZlclNvdXJjZShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHBhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheShwYXJhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgYnl0ZUxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIGdldCBieXRlT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZnJvbUFTTihhc24pIHtcbiAgICAgICAgaWYgKCEoYXNuIGluc3RhbmNlb2YgYXNuMWpzLk9jdGV0U3RyaW5nKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50ICdhc24nIGlzIG5vdCBpbnN0YW5jZSBvZiBBU04uMSBPY3RldFN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlciA9IGFzbi52YWx1ZUJsb2NrLnZhbHVlSGV4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9BU04oKSB7XG4gICAgICAgIHJldHVybiBuZXcgYXNuMWpzLk9jdGV0U3RyaW5nKHsgdmFsdWVIZXg6IHRoaXMuYnVmZmVyIH0pO1xuICAgIH1cbiAgICB0b1NjaGVtYShuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgYXNuMWpzLk9jdGV0U3RyaW5nKHsgbmFtZSB9KTtcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vYml0X3N0cmluZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb2N0ZXRfc3RyaW5nXCI7XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzQ29udmVydGlibGUodGFyZ2V0KSB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgICAgIGlmICh0YXJnZXQucHJvdG90eXBlLnRvQVNOICYmIHRhcmdldC5wcm90b3R5cGUuZnJvbUFTTikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNDb252ZXJ0aWJsZSh0YXJnZXQucHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuICEhKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmIFwidG9BU05cIiBpbiB0YXJnZXQgJiYgXCJmcm9tQVNOXCIgaW4gdGFyZ2V0KTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlT2ZBcnJheSh0YXJnZXQpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xuICAgICAgICBpZiAoKChfYSA9IHByb3RvID09PSBudWxsIHx8IHByb3RvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm90by5wcm90b3R5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb25zdHJ1Y3RvcikgPT09IEFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNUeXBlT2ZBcnJheShwcm90byk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5RXF1YWwoYnl0ZXMxLCBieXRlczIpIHtcbiAgICBpZiAoIShieXRlczEgJiYgYnl0ZXMyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChieXRlczEuYnl0ZUxlbmd0aCAhPT0gYnl0ZXMyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBiMSA9IG5ldyBVaW50OEFycmF5KGJ5dGVzMSk7XG4gICAgY29uc3QgYjIgPSBuZXcgVWludDhBcnJheShieXRlczIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMxLmJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYjFbaV0gIT09IGIyW2ldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCAiaW1wb3J0ICogYXMgYXNuMWpzIGZyb20gXCJhc24xanNcIjtcbmltcG9ydCB7IEFzblByb3BUeXBlcywgQXNuVHlwZVR5cGVzIH0gZnJvbSBcIi4vZW51bXNcIjtcbmltcG9ydCB7IGlzQ29udmVydGlibGUgfSBmcm9tIFwiLi9oZWxwZXJcIjtcbmV4cG9ydCBjbGFzcyBBc25TY2hlbWFTdG9yYWdlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgfVxuICAgIGhhcyh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuaGFzKHRhcmdldCk7XG4gICAgfVxuICAgIGdldCh0YXJnZXQsIGNoZWNrU2NoZW1hID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5pdGVtcy5nZXQodGFyZ2V0KTtcbiAgICAgICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCBzY2hlbWEgZm9yICcke3RhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZX0nIHRhcmdldGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja1NjaGVtYSAmJiAhc2NoZW1hLnNjaGVtYSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlbWEgJyR7dGFyZ2V0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lfScgZG9lc24ndCBjb250YWluIEFTTi4xIHNjaGVtYS4gQ2FsbCAnQXNuU2NoZW1hU3RvcmFnZS5jYWNoZScuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9XG4gICAgY2FjaGUodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0KHRhcmdldCk7XG4gICAgICAgIGlmICghc2NoZW1hLnNjaGVtYSkge1xuICAgICAgICAgICAgc2NoZW1hLnNjaGVtYSA9IHRoaXMuY3JlYXRlKHRhcmdldCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlRGVmYXVsdCh0YXJnZXQpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgICAgICAgdHlwZTogQXNuVHlwZVR5cGVzLlNlcXVlbmNlLFxuICAgICAgICAgICAgaXRlbXM6IHt9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYXJlbnRTY2hlbWEgPSB0aGlzLmZpbmRQYXJlbnRTY2hlbWEodGFyZ2V0KTtcbiAgICAgICAgaWYgKHBhcmVudFNjaGVtYSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzY2hlbWEsIHBhcmVudFNjaGVtYSk7XG4gICAgICAgICAgICBzY2hlbWEuaXRlbXMgPSBPYmplY3QuYXNzaWduKHt9LCBzY2hlbWEuaXRlbXMsIHBhcmVudFNjaGVtYS5pdGVtcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9XG4gICAgY3JlYXRlKHRhcmdldCwgdXNlTmFtZXMpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5pdGVtcy5nZXQodGFyZ2V0KSB8fCB0aGlzLmNyZWF0ZURlZmF1bHQodGFyZ2V0KTtcbiAgICAgICAgY29uc3QgYXNuMVZhbHVlID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5pdGVtcykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHNjaGVtYS5pdGVtc1trZXldO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHVzZU5hbWVzID8ga2V5IDogXCJcIjtcbiAgICAgICAgICAgIGxldCBhc24xSXRlbTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGl0ZW0udHlwZSkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBBc24xVHlwZU5hbWUgPSBBc25Qcm9wVHlwZXNbaXRlbS50eXBlXTtcbiAgICAgICAgICAgICAgICBjb25zdCBBc24xVHlwZSA9IGFzbjFqc1tBc24xVHlwZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghQXNuMVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IEFTTjEgY2xhc3MgYnkgbmFtZSAnJHtBc24xVHlwZU5hbWV9J2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IG5ldyBBc24xVHlwZSh7IG5hbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0NvbnZlcnRpYmxlKGl0ZW0udHlwZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBpdGVtLnR5cGUoKTtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IGluc3RhbmNlLnRvU2NoZW1hKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1TY2hlbWEgPSB0aGlzLmdldChpdGVtLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtU2NoZW1hLnR5cGUgPT09IEFzblR5cGVUeXBlcy5DaG9pY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSBuZXcgYXNuMWpzLkFueSh7IG5hbWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhc24xSXRlbSA9IHRoaXMuY3JlYXRlKGl0ZW0udHlwZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBhc24xSXRlbS5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IG5ldyBhc24xanMuQW55KHsgbmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbmFsID0gISFpdGVtLm9wdGlvbmFsIHx8IGl0ZW0uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoaXRlbS5yZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtLm5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lciA9IGl0ZW0ucmVwZWF0ZWQgPT09IFwic2V0XCJcbiAgICAgICAgICAgICAgICAgICAgPyBhc24xanMuU2V0XG4gICAgICAgICAgICAgICAgICAgIDogYXNuMWpzLlNlcXVlbmNlO1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtID0gbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgYXNuMWpzLlJlcGVhdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhc24xSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGl0ZW0uY29udGV4dCAhPT0gbnVsbCAmJiBpdGVtLmNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbS50eXBlID09PSBcIm51bWJlclwiIHx8IGlzQ29udmVydGlibGUoaXRlbS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyID0gaXRlbS5yZXBlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXNuMWpzLkNvbnN0cnVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhc24xanMuUHJpbWl0aXZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZEJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXNzOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IGl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZShpdGVtLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZXBlYXRlZCA9ICEhaXRlbS5yZXBlYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9ICFpc1JlcGVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldChpdGVtLnR5cGUsIHRydWUpLnNjaGVtYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXNuMUl0ZW07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFwidmFsdWVCbG9ja1wiIGluIHZhbHVlID8gdmFsdWUudmFsdWVCbG9jay52YWx1ZSA6IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IGFzbjFqcy5Db25zdHJ1Y3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogIWlzUmVwZWF0ZWQgPyBuYW1lIDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZEJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXNzOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IGl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IGFzbjFqcy5Db25zdHJ1Y3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkQmxvY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzczogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IGl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW2FzbjFJdGVtXSxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtLm9wdGlvbmFsID0gb3B0aW9uYWw7XG4gICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2goYXNuMUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoc2NoZW1hLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLlNlcXVlbmNlOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYXNuMWpzLlNlcXVlbmNlKHsgdmFsdWU6IGFzbjFWYWx1ZSwgbmFtZTogXCJcIiB9KTtcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLlNldDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGFzbjFqcy5TZXQoeyB2YWx1ZTogYXNuMVZhbHVlLCBuYW1lOiBcIlwiIH0pO1xuICAgICAgICAgICAgY2FzZSBBc25UeXBlVHlwZXMuQ2hvaWNlOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYXNuMWpzLkNob2ljZSh7IHZhbHVlOiBhc24xVmFsdWUsIG5hbWU6IFwiXCIgfSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQVNOMSB0eXBlIGluIHVzZWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldCh0YXJnZXQsIHNjaGVtYSkge1xuICAgICAgICB0aGlzLml0ZW1zLnNldCh0YXJnZXQsIHNjaGVtYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmaW5kUGFyZW50U2NoZW1hKHRhcmdldCkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0YXJnZXQuX19wcm90b19fO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLml0ZW1zLmdldChwYXJlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYSB8fCB0aGlzLmZpbmRQYXJlbnRTY2hlbWEocGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQXNuU2NoZW1hU3RvcmFnZSB9IGZyb20gXCIuL3NjaGVtYVwiO1xuZXhwb3J0IGNvbnN0IHNjaGVtYVN0b3JhZ2UgPSBuZXcgQXNuU2NoZW1hU3RvcmFnZSgpO1xuIiwgImltcG9ydCAqIGFzIGNvbnZlcnRlcnMgZnJvbSBcIi4vY29udmVydGVyc1wiO1xuaW1wb3J0IHsgQXNuVHlwZVR5cGVzIH0gZnJvbSBcIi4vZW51bXNcIjtcbmltcG9ydCB7IHNjaGVtYVN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5leHBvcnQgY29uc3QgQXNuVHlwZSA9IChvcHRpb25zKSA9PiAodGFyZ2V0KSA9PiB7XG4gICAgbGV0IHNjaGVtYTtcbiAgICBpZiAoIXNjaGVtYVN0b3JhZ2UuaGFzKHRhcmdldCkpIHtcbiAgICAgICAgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5jcmVhdGVEZWZhdWx0KHRhcmdldCk7XG4gICAgICAgIHNjaGVtYVN0b3JhZ2Uuc2V0KHRhcmdldCwgc2NoZW1hKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuZ2V0KHRhcmdldCk7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24oc2NoZW1hLCBvcHRpb25zKTtcbn07XG5leHBvcnQgY29uc3QgQXNuQ2hvaWNlVHlwZSA9ICgpID0+IEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuQ2hvaWNlIH0pO1xuZXhwb3J0IGNvbnN0IEFzblNldFR5cGUgPSAob3B0aW9ucykgPT4gQXNuVHlwZSh7IHR5cGU6IEFzblR5cGVUeXBlcy5TZXQsIC4uLm9wdGlvbnMgfSk7XG5leHBvcnQgY29uc3QgQXNuU2VxdWVuY2VUeXBlID0gKG9wdGlvbnMpID0+IEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuU2VxdWVuY2UsIC4uLm9wdGlvbnMgfSk7XG5leHBvcnQgY29uc3QgQXNuUHJvcCA9IChvcHRpb25zKSA9PiAodGFyZ2V0LCBwcm9wZXJ0eUtleSkgPT4ge1xuICAgIGxldCBzY2hlbWE7XG4gICAgaWYgKCFzY2hlbWFTdG9yYWdlLmhhcyh0YXJnZXQuY29uc3RydWN0b3IpKSB7XG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuY3JlYXRlRGVmYXVsdCh0YXJnZXQuY29uc3RydWN0b3IpO1xuICAgICAgICBzY2hlbWFTdG9yYWdlLnNldCh0YXJnZXQuY29uc3RydWN0b3IsIHNjaGVtYSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmdldCh0YXJnZXQuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgICBjb25zdCBjb3B5T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIGlmICh0eXBlb2YgY29weU9wdGlvbnMudHlwZSA9PT0gXCJudW1iZXJcIiAmJiAhY29weU9wdGlvbnMuY29udmVydGVyKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXIgPSBjb252ZXJ0ZXJzLmRlZmF1bHRDb252ZXJ0ZXIob3B0aW9ucy50eXBlKTtcbiAgICAgICAgaWYgKCFkZWZhdWx0Q29udmVydGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBnZXQgZGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHByb3BlcnR5ICcke3Byb3BlcnR5S2V5fScgb2YgJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb3B5T3B0aW9ucy5jb252ZXJ0ZXIgPSBkZWZhdWx0Q29udmVydGVyO1xuICAgIH1cbiAgICBzY2hlbWEuaXRlbXNbcHJvcGVydHlLZXldID0gY29weU9wdGlvbnM7XG59O1xuIiwgImV4cG9ydCBjbGFzcyBBc25TY2hlbWFWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuc2NoZW1hcyA9IFtdO1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9zY2hlbWFfdmFsaWRhdGlvblwiO1xuIiwgImltcG9ydCAqIGFzIGFzbjFqcyBmcm9tIFwiYXNuMWpzXCI7XG5pbXBvcnQgeyBBc25Qcm9wVHlwZXMsIEFzblR5cGVUeXBlcyB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgKiBhcyBjb252ZXJ0ZXJzIGZyb20gXCIuL2NvbnZlcnRlcnNcIjtcbmltcG9ydCB7IEFzblNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgaXNDb252ZXJ0aWJsZSwgaXNUeXBlT2ZBcnJheSB9IGZyb20gXCIuL2hlbHBlclwiO1xuaW1wb3J0IHsgc2NoZW1hU3RvcmFnZSB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmV4cG9ydCBjbGFzcyBBc25QYXJzZXIge1xuICAgIHN0YXRpYyBwYXJzZShkYXRhLCB0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgYXNuMVBhcnNlZCA9IGFzbjFqcy5mcm9tQkVSKGRhdGEpO1xuICAgICAgICBpZiAoYXNuMVBhcnNlZC5yZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihhc24xUGFyc2VkLnJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5mcm9tQVNOKGFzbjFQYXJzZWQucmVzdWx0LCB0YXJnZXQpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUFTTihhc24xU2NoZW1hLCB0YXJnZXQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGlzQ29udmVydGlibGUodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IHRhcmdldCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5mcm9tQVNOKGFzbjFTY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5nZXQodGFyZ2V0KTtcbiAgICAgICAgICAgIHNjaGVtYVN0b3JhZ2UuY2FjaGUodGFyZ2V0KTtcbiAgICAgICAgICAgIGxldCB0YXJnZXRTY2hlbWEgPSBzY2hlbWEuc2NoZW1hO1xuICAgICAgICAgICAgaWYgKGFzbjFTY2hlbWEuY29uc3RydWN0b3IgPT09IGFzbjFqcy5Db25zdHJ1Y3RlZCAmJiBzY2hlbWEudHlwZSAhPT0gQXNuVHlwZVR5cGVzLkNob2ljZSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFNjaGVtYSA9IG5ldyBhc24xanMuQ29uc3RydWN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICBpZEJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzczogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ051bWJlcjogYXNuMVNjaGVtYS5pZEJsb2NrLnRhZ051bWJlcixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNjaGVtYS5zY2hlbWEudmFsdWVCbG9jay52YWx1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFzbjFTY2hlbWFba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhc24xQ29tcGFyZWRTY2hlbWEgPSBhc24xanMuY29tcGFyZVNjaGVtYSh7fSwgYXNuMVNjaGVtYSwgdGFyZ2V0U2NoZW1hKTtcbiAgICAgICAgICAgIGlmICghYXNuMUNvbXBhcmVkU2NoZW1hLnZlcmlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzblNjaGVtYVZhbGlkYXRpb25FcnJvcihgRGF0YSBkb2VzIG5vdCBtYXRjaCB0byAke3RhcmdldC5uYW1lfSBBU04xIHNjaGVtYS4gJHthc24xQ29tcGFyZWRTY2hlbWEucmVzdWx0LmVycm9yfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzID0gbmV3IHRhcmdldCgpO1xuICAgICAgICAgICAgaWYgKGlzVHlwZU9mQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGlmICghKFwidmFsdWVcIiBpbiBhc24xU2NoZW1hLnZhbHVlQmxvY2sgJiYgQXJyYXkuaXNBcnJheShhc24xU2NoZW1hLnZhbHVlQmxvY2sudmFsdWUpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBnZXQgaXRlbXMgZnJvbSB0aGUgQVNOLjEgcGFyc2VkIHZhbHVlLiBBU04uMSBvYmplY3QgaXMgbm90IGNvbnN0cnVjdGVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHNjaGVtYS5pdGVtVHlwZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW1UeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IGNvbnZlcnRlcnMuZGVmYXVsdENvbnZlcnRlcihpdGVtVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBnZXQgZGVmYXVsdCBjb252ZXJ0ZXIgZm9yIGFycmF5IGl0ZW0gb2YgJHt0YXJnZXQubmFtZX0gQVNOMSBzY2hlbWFgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmZyb20oYXNuMVNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlLCAoZWxlbWVudCkgPT4gY29udmVydGVyLmZyb21BU04oZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5mcm9tKGFzbjFTY2hlbWEudmFsdWVCbG9jay52YWx1ZSwgKGVsZW1lbnQpID0+IHRoaXMuZnJvbUFTTihlbGVtZW50LCBpdGVtVHlwZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5pdGVtcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzbjFTY2hlbWFWYWx1ZSA9IGFzbjFDb21wYXJlZFNjaGVtYS5yZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoIWFzbjFTY2hlbWFWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hSXRlbSA9IHNjaGVtYS5pdGVtc1trZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYUl0ZW1UeXBlID0gc2NoZW1hSXRlbS50eXBlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbVR5cGUgPT09IFwibnVtYmVyXCIgfHwgaXNDb252ZXJ0aWJsZShzY2hlbWFJdGVtVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gKF9hID0gc2NoZW1hSXRlbS5jb252ZXJ0ZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChpc0NvbnZlcnRpYmxlKHNjaGVtYUl0ZW1UeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgc2NoZW1hSXRlbVR5cGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnRlciBpcyBlbXB0eVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hSXRlbS5yZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUl0ZW0uaW1wbGljaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250YWluZXIgPSBzY2hlbWFJdGVtLnJlcGVhdGVkID09PSBcInNlcXVlbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhc24xanMuU2VxdWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhc24xanMuU2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW0gPSBuZXcgQ29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXRlbS52YWx1ZUJsb2NrID0gYXNuMVNjaGVtYVZhbHVlLnZhbHVlQmxvY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3SXRlbUFzbiA9IGFzbjFqcy5mcm9tQkVSKG5ld0l0ZW0udG9CRVIoZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SXRlbUFzbi5vZmZzZXQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBjaGlsZCBpdGVtLiAke25ld0l0ZW1Bc24ucmVzdWx0LmVycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShcInZhbHVlXCIgaW4gbmV3SXRlbUFzbi5yZXN1bHQudmFsdWVCbG9jayAmJiBBcnJheS5pc0FycmF5KG5ld0l0ZW1Bc24ucmVzdWx0LnZhbHVlQmxvY2sudmFsdWUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZ2V0IGl0ZW1zIGZyb20gdGhlIEFTTi4xIHBhcnNlZCB2YWx1ZS4gQVNOLjEgb2JqZWN0IGlzIG5vdCBjb25zdHJ1Y3RlZC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmV3SXRlbUFzbi5yZXN1bHQudmFsdWVCbG9jay52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IEFycmF5LmZyb20odmFsdWUsIChlbGVtZW50KSA9PiBjb252ZXJ0ZXIuZnJvbUFTTihlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IEFycmF5LmZyb20oYXNuMVNjaGVtYVZhbHVlLCAoZWxlbWVudCkgPT4gY29udmVydGVyLmZyb21BU04oZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gYXNuMVNjaGVtYVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUl0ZW0uaW1wbGljaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb252ZXJ0aWJsZShzY2hlbWFJdGVtVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXRlbSA9IG5ldyBzY2hlbWFJdGVtVHlwZSgpLnRvU2NoZW1hKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXNuMVR5cGVOYW1lID0gQXNuUHJvcFR5cGVzW3NjaGVtYUl0ZW1UeXBlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXNuMVR5cGUgPSBhc24xanNbQXNuMVR5cGVOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBc24xVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0ICcke0FzbjFUeXBlTmFtZX0nIGNsYXNzIGZyb20gYXNuMWpzIG1vZHVsZWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSBuZXcgQXNuMVR5cGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXRlbS52YWx1ZUJsb2NrID0gdmFsdWUudmFsdWVCbG9jaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFzbjFqcy5mcm9tQkVSKG5ld0l0ZW0udG9CRVIoZmFsc2UpKS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IGNvbnZlcnRlci5mcm9tQVNOKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUl0ZW0ucmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhc24xU2NoZW1hVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdldCBsaXN0IG9mIGl0ZW1zIGZyb20gdGhlIEFTTi4xIHBhcnNlZCB2YWx1ZS4gQVNOLjEgdmFsdWUgc2hvdWxkIGJlIGl0ZXJhYmxlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gQXJyYXkuZnJvbShhc24xU2NoZW1hVmFsdWUsIChlbGVtZW50KSA9PiB0aGlzLmZyb21BU04oZWxlbWVudCwgc2NoZW1hSXRlbVR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gdGhpcy5mcm9tQVNOKGFzbjFTY2hlbWFWYWx1ZSwgc2NoZW1hSXRlbVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFzblNjaGVtYVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yLnNjaGVtYXMucHVzaCh0YXJnZXQubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBhc24xanMgZnJvbSBcImFzbjFqc1wiO1xuaW1wb3J0ICogYXMgY29udmVydGVycyBmcm9tIFwiLi9jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgeyBBc25Qcm9wVHlwZXMsIEFzblR5cGVUeXBlcyB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBpc0NvbnZlcnRpYmxlLCBpc0FycmF5RXF1YWwgfSBmcm9tIFwiLi9oZWxwZXJcIjtcbmltcG9ydCB7IHNjaGVtYVN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5leHBvcnQgY2xhc3MgQXNuU2VyaWFsaXplciB7XG4gICAgc3RhdGljIHNlcmlhbGl6ZShvYmopIHtcbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIGFzbjFqcy5CYXNlQmxvY2spIHtcbiAgICAgICAgICAgIHJldHVybiBvYmoudG9CRVIoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRvQVNOKG9iaikudG9CRVIoZmFsc2UpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9BU04ob2JqKSB7XG4gICAgICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBpc0NvbnZlcnRpYmxlKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmoudG9BU04oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgMSBzaG91bGQgYmUgdHlwZSBvZiBPYmplY3QuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG9iai5jb25zdHJ1Y3RvcjtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5nZXQodGFyZ2V0KTtcbiAgICAgICAgc2NoZW1hU3RvcmFnZS5jYWNoZSh0YXJnZXQpO1xuICAgICAgICBsZXQgYXNuMVZhbHVlID0gW107XG4gICAgICAgIGlmIChzY2hlbWEuaXRlbVR5cGUpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAxIHNob3VsZCBiZSB0eXBlIG9mIEFycmF5LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLml0ZW1UeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gY29udmVydGVycy5kZWZhdWx0Q29udmVydGVyKHNjaGVtYS5pdGVtVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IGRlZmF1bHQgY29udmVydGVyIGZvciBhcnJheSBpdGVtIG9mICR7dGFyZ2V0Lm5hbWV9IEFTTjEgc2NoZW1hYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFzbjFWYWx1ZSA9IG9iai5tYXAoKG8pID0+IGNvbnZlcnRlci50b0FTTihvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc24xVmFsdWUgPSBvYmoubWFwKChvKSA9PiB0aGlzLnRvQXNuSXRlbSh7IHR5cGU6IHNjaGVtYS5pdGVtVHlwZSB9LCBcIltdXCIsIHRhcmdldCwgbykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hSXRlbSA9IHNjaGVtYS5pdGVtc1trZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9ialByb3AgPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAob2JqUHJvcCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHx8IHNjaGVtYUl0ZW0uZGVmYXVsdFZhbHVlID09PSBvYmpQcm9wXG4gICAgICAgICAgICAgICAgICAgIHx8ICh0eXBlb2Ygc2NoZW1hSXRlbS5kZWZhdWx0VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9ialByb3AgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzQXJyYXlFcXVhbCh0aGlzLnNlcmlhbGl6ZShzY2hlbWFJdGVtLmRlZmF1bHRWYWx1ZSksIHRoaXMuc2VyaWFsaXplKG9ialByb3ApKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGFzbjFJdGVtID0gQXNuU2VyaWFsaXplci50b0Fzbkl0ZW0oc2NoZW1hSXRlbSwga2V5LCB0YXJnZXQsIG9ialByb3ApO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbS5jb250ZXh0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLmltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYUl0ZW0ucmVwZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodHlwZW9mIHNjaGVtYUl0ZW0udHlwZSA9PT0gXCJudW1iZXJcIiB8fCBpc0NvbnZlcnRpYmxlKHNjaGVtYUl0ZW0udHlwZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZUhleCA9IGFzbjFJdGVtIGluc3RhbmNlb2YgYXNuMWpzLk51bGwgPyBhc24xSXRlbS52YWx1ZUJlZm9yZURlY29kZVZpZXcgOiBhc24xSXRlbS52YWx1ZUJsb2NrLnRvQkVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IGFzbjFqcy5QcmltaXRpdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogc2NoZW1hSXRlbS5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2xhc3M6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IHNjaGVtYUl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IGFzbjFqcy5Db25zdHJ1Y3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiBzY2hlbWFJdGVtLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZEJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzczogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ051bWJlcjogc2NoZW1hSXRlbS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYXNuMUl0ZW0udmFsdWVCbG9jay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc24xVmFsdWUucHVzaChuZXcgYXNuMWpzLkNvbnN0cnVjdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogc2NoZW1hSXRlbS5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZEJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXNzOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IHNjaGVtYUl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbYXNuMUl0ZW1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYUl0ZW0ucmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlID0gYXNuMVZhbHVlLmNvbmNhdChhc24xSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhc24xVmFsdWUucHVzaChhc24xSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBhc25TY2hlbWE7XG4gICAgICAgIHN3aXRjaCAoc2NoZW1hLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLlNlcXVlbmNlOlxuICAgICAgICAgICAgICAgIGFzblNjaGVtYSA9IG5ldyBhc24xanMuU2VxdWVuY2UoeyB2YWx1ZTogYXNuMVZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBc25UeXBlVHlwZXMuU2V0OlxuICAgICAgICAgICAgICAgIGFzblNjaGVtYSA9IG5ldyBhc24xanMuU2V0KHsgdmFsdWU6IGFzbjFWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLkNob2ljZTpcbiAgICAgICAgICAgICAgICBpZiAoIWFzbjFWYWx1ZVswXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVtYSAnJHt0YXJnZXQubmFtZX0nIGhhcyB3cm9uZyBkYXRhLiBDaG9pY2UgY2Fubm90IGJlIGVtcHR5LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc25TY2hlbWEgPSBhc24xVmFsdWVbMF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzblNjaGVtYTtcbiAgICB9XG4gICAgc3RhdGljIHRvQXNuSXRlbShzY2hlbWFJdGVtLCBrZXksIHRhcmdldCwgb2JqUHJvcCkge1xuICAgICAgICBsZXQgYXNuMUl0ZW07XG4gICAgICAgIGlmICh0eXBlb2YgKHNjaGVtYUl0ZW0udHlwZSkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IHNjaGVtYUl0ZW0uY29udmVydGVyO1xuICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5ICcke2tleX0nIGRvZXNuJ3QgaGF2ZSBjb252ZXJ0ZXIgZm9yIHR5cGUgJHtBc25Qcm9wVHlwZXNbc2NoZW1hSXRlbS50eXBlXX0gaW4gc2NoZW1hICcke3RhcmdldC5uYW1lfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLnJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9ialByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgJ29ialByb3AnIHNob3VsZCBiZSB0eXBlIG9mIEFycmF5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKG9ialByb3AsIChlbGVtZW50KSA9PiBjb252ZXJ0ZXIudG9BU04oZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lciA9IHNjaGVtYUl0ZW0ucmVwZWF0ZWQgPT09IFwic2VxdWVuY2VcIlxuICAgICAgICAgICAgICAgICAgICA/IGFzbjFqcy5TZXF1ZW5jZVxuICAgICAgICAgICAgICAgICAgICA6IGFzbjFqcy5TZXQ7XG4gICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSBuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1zLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSBjb252ZXJ0ZXIudG9BU04ob2JqUHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hSXRlbS5yZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvYmpQcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyICdvYmpQcm9wJyBzaG91bGQgYmUgdHlwZSBvZiBBcnJheS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShvYmpQcm9wLCAoZWxlbWVudCkgPT4gdGhpcy50b0FTTihlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyID0gc2NoZW1hSXRlbS5yZXBlYXRlZCA9PT0gXCJzZXF1ZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgID8gYXNuMWpzLlNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgIDogYXNuMWpzLlNldDtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IG5ldyBDb250YWluZXIoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IHRoaXMudG9BU04ob2JqUHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzbjFJdGVtO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgQXNuQXJyYXkgZXh0ZW5kcyBBcnJheSB7XG4gICAgY29uc3RydWN0b3IoaXRlbXMgPSBbXSkge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1zID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBzdXBlcihpdGVtcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCAqIGFzIGFzbjFqcyBmcm9tIFwiYXNuMWpzXCI7XG5pbXBvcnQgeyBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIgfSBmcm9tIFwicHZ0c3V0aWxzXCI7XG5pbXBvcnQgeyBBc25QYXJzZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB7IEFzblNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9zZXJpYWxpemVyXCI7XG5leHBvcnQgY2xhc3MgQXNuQ29udmVydCB7XG4gICAgc3RhdGljIHNlcmlhbGl6ZShvYmopIHtcbiAgICAgICAgcmV0dXJuIEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKG9iaik7XG4gICAgfVxuICAgIHN0YXRpYyBwYXJzZShkYXRhLCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIEFzblBhcnNlci5wYXJzZShkYXRhLCB0YXJnZXQpO1xuICAgIH1cbiAgICBzdGF0aWMgdG9TdHJpbmcoZGF0YSkge1xuICAgICAgICBjb25zdCBidWYgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIuaXNCdWZmZXJTb3VyY2UoZGF0YSlcbiAgICAgICAgICAgID8gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoZGF0YSlcbiAgICAgICAgICAgIDogQXNuQ29udmVydC5zZXJpYWxpemUoZGF0YSk7XG4gICAgICAgIGNvbnN0IGFzbiA9IGFzbjFqcy5mcm9tQkVSKGJ1Zik7XG4gICAgICAgIGlmIChhc24ub2Zmc2V0ID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZGVjb2RlIEFTTi4xIGRhdGEuICR7YXNuLnJlc3VsdC5lcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNuLnJlc3VsdC50b1N0cmluZygpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9jb252ZXJ0ZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9pbmRleFwiO1xuZXhwb3J0IHsgQXNuUHJvcCwgQXNuVHlwZSwgQXNuQ2hvaWNlVHlwZSwgQXNuU2VxdWVuY2VUeXBlLCBBc25TZXRUeXBlIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0IHsgQXNuVHlwZVR5cGVzLCBBc25Qcm9wVHlwZXMgfSBmcm9tIFwiLi9lbnVtc1wiO1xuZXhwb3J0IHsgQXNuUGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyXCI7XG5leHBvcnQgeyBBc25TZXJpYWxpemVyIH0gZnJvbSBcIi4vc2VyaWFsaXplclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vYmplY3RzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb252ZXJ0XCI7XG4iLCAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBnbG9iYWwsIGRlZmluZSwgU3lzdGVtLCBSZWZsZWN0LCBQcm9taXNlICovXHJcbnZhciBfX2V4dGVuZHM7XHJcbnZhciBfX2Fzc2lnbjtcclxudmFyIF9fcmVzdDtcclxudmFyIF9fZGVjb3JhdGU7XHJcbnZhciBfX3BhcmFtO1xyXG52YXIgX19tZXRhZGF0YTtcclxudmFyIF9fYXdhaXRlcjtcclxudmFyIF9fZ2VuZXJhdG9yO1xyXG52YXIgX19leHBvcnRTdGFyO1xyXG52YXIgX192YWx1ZXM7XHJcbnZhciBfX3JlYWQ7XHJcbnZhciBfX3NwcmVhZDtcclxudmFyIF9fc3ByZWFkQXJyYXlzO1xyXG52YXIgX19zcHJlYWRBcnJheTtcclxudmFyIF9fYXdhaXQ7XHJcbnZhciBfX2FzeW5jR2VuZXJhdG9yO1xyXG52YXIgX19hc3luY0RlbGVnYXRvcjtcclxudmFyIF9fYXN5bmNWYWx1ZXM7XHJcbnZhciBfX21ha2VUZW1wbGF0ZU9iamVjdDtcclxudmFyIF9faW1wb3J0U3RhcjtcclxudmFyIF9faW1wb3J0RGVmYXVsdDtcclxudmFyIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ7XHJcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0O1xyXG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZEluO1xyXG52YXIgX19jcmVhdGVCaW5kaW5nO1xyXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcclxuICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6IHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6IHt9O1xyXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgZGVmaW5lKFwidHNsaWJcIiwgW1wiZXhwb3J0c1wiXSwgZnVuY3Rpb24gKGV4cG9ydHMpIHsgZmFjdG9yeShjcmVhdGVFeHBvcnRlcihyb290LCBjcmVhdGVFeHBvcnRlcihleHBvcnRzKSkpOyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgZmFjdG9yeShjcmVhdGVFeHBvcnRlcihyb290LCBjcmVhdGVFeHBvcnRlcihtb2R1bGUuZXhwb3J0cykpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCkpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gY3JlYXRlRXhwb3J0ZXIoZXhwb3J0cywgcHJldmlvdXMpIHtcclxuICAgICAgICBpZiAoZXhwb3J0cyAhPT0gcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGlkLCB2KSB7IHJldHVybiBleHBvcnRzW2lkXSA9IHByZXZpb3VzID8gcHJldmlvdXMoaWQsIHYpIDogdjsgfTtcclxuICAgIH1cclxufSlcclxuKGZ1bmN0aW9uIChleHBvcnRlcikge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbiAgICBfX2V4dGVuZHMgPSBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3Jlc3QgPSBmdW5jdGlvbiAocywgZSkge1xyXG4gICAgICAgIHZhciB0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZGVjb3JhdGUgPSBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICAgICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3BhcmFtID0gZnVuY3Rpb24gKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX21ldGFkYXRhID0gZnVuY3Rpb24gKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hd2FpdGVyID0gZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZ2VuZXJhdG9yID0gZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgICAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX19leHBvcnRTdGFyID0gZnVuY3Rpb24obSwgbykge1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxuICAgIH07XHJcblxyXG4gICAgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbiAgICB9KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICAgICAgb1trMl0gPSBtW2tdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgX192YWx1ZXMgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcmVhZCA9IGZ1bmN0aW9uIChvLCBuKSB7XHJcbiAgICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkICovXHJcbiAgICBfX3NwcmVhZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkICovXHJcbiAgICBfX3NwcmVhZEFycmF5cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgICAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICAgICAgcmV0dXJuIHI7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fc3ByZWFkQXJyYXkgPSBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcclxuICAgICAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2F3YWl0ID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxuICAgIH07XHJcblxyXG4gICAgX19hc3luY0dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICAgICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNEZWxlZ2F0b3IgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBpLCBwO1xyXG4gICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICAgICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX2FzeW5jVmFsdWVzID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICAgICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgICAgICByZXR1cm4gY29va2VkO1xyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG4gICAgfSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICAgICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2ltcG9ydFN0YXIgPSBmdW5jdGlvbiAobW9kKSB7XHJcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcblxyXG4gICAgX19pbXBvcnREZWZhdWx0ID0gZnVuY3Rpb24gKG1vZCkge1xyXG4gICAgICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0ID0gZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgICAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0ID0gZnVuY3Rpb24gKHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICAgICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbiA9IGZ1bmN0aW9uIChzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgICAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRlcihcIl9fZXh0ZW5kc1wiLCBfX2V4dGVuZHMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2Fzc2lnblwiLCBfX2Fzc2lnbik7XHJcbiAgICBleHBvcnRlcihcIl9fcmVzdFwiLCBfX3Jlc3QpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2RlY29yYXRlXCIsIF9fZGVjb3JhdGUpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3BhcmFtXCIsIF9fcGFyYW0pO1xyXG4gICAgZXhwb3J0ZXIoXCJfX21ldGFkYXRhXCIsIF9fbWV0YWRhdGEpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2F3YWl0ZXJcIiwgX19hd2FpdGVyKTtcclxuICAgIGV4cG9ydGVyKFwiX19nZW5lcmF0b3JcIiwgX19nZW5lcmF0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2V4cG9ydFN0YXJcIiwgX19leHBvcnRTdGFyKTtcclxuICAgIGV4cG9ydGVyKFwiX19jcmVhdGVCaW5kaW5nXCIsIF9fY3JlYXRlQmluZGluZyk7XHJcbiAgICBleHBvcnRlcihcIl9fdmFsdWVzXCIsIF9fdmFsdWVzKTtcclxuICAgIGV4cG9ydGVyKFwiX19yZWFkXCIsIF9fcmVhZCk7XHJcbiAgICBleHBvcnRlcihcIl9fc3ByZWFkXCIsIF9fc3ByZWFkKTtcclxuICAgIGV4cG9ydGVyKFwiX19zcHJlYWRBcnJheXNcIiwgX19zcHJlYWRBcnJheXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3NwcmVhZEFycmF5XCIsIF9fc3ByZWFkQXJyYXkpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2F3YWl0XCIsIF9fYXdhaXQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jR2VuZXJhdG9yXCIsIF9fYXN5bmNHZW5lcmF0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jRGVsZWdhdG9yXCIsIF9fYXN5bmNEZWxlZ2F0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jVmFsdWVzXCIsIF9fYXN5bmNWYWx1ZXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX21ha2VUZW1wbGF0ZU9iamVjdFwiLCBfX21ha2VUZW1wbGF0ZU9iamVjdCk7XHJcbiAgICBleHBvcnRlcihcIl9faW1wb3J0U3RhclwiLCBfX2ltcG9ydFN0YXIpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2ltcG9ydERlZmF1bHRcIiwgX19pbXBvcnREZWZhdWx0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZEdldFwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZFNldFwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZEluXCIsIF9fY2xhc3NQcml2YXRlRmllbGRJbik7XHJcbn0pO1xyXG4iLCAiaW1wb3J0IHRzbGliIGZyb20gJy4uL3RzbGliLmpzJztcclxuY29uc3Qge1xyXG4gICAgX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ24sXHJcbiAgICBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbSxcclxuICAgIF9fbWV0YWRhdGEsXHJcbiAgICBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcixcclxuICAgIF9fZXhwb3J0U3RhcixcclxuICAgIF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fdmFsdWVzLFxyXG4gICAgX19yZWFkLFxyXG4gICAgX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5cyxcclxuICAgIF9fc3ByZWFkQXJyYXksXHJcbiAgICBfX2F3YWl0LFxyXG4gICAgX19hc3luY0dlbmVyYXRvcixcclxuICAgIF9fYXN5bmNEZWxlZ2F0b3IsXHJcbiAgICBfX2FzeW5jVmFsdWVzLFxyXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXIsXHJcbiAgICBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxufSA9IHRzbGliO1xyXG5leHBvcnQge1xyXG4gICAgX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ24sXHJcbiAgICBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbSxcclxuICAgIF9fbWV0YWRhdGEsXHJcbiAgICBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcixcclxuICAgIF9fZXhwb3J0U3RhcixcclxuICAgIF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fdmFsdWVzLFxyXG4gICAgX19yZWFkLFxyXG4gICAgX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5cyxcclxuICAgIF9fc3ByZWFkQXJyYXksXHJcbiAgICBfX2F3YWl0LFxyXG4gICAgX19hc3luY0dlbmVyYXRvcixcclxuICAgIF9fYXN5bmNEZWxlZ2F0b3IsXHJcbiAgICBfX2FzeW5jVmFsdWVzLFxyXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXIsXHJcbiAgICBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxufTtcclxuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIwLCBQZWN1bGlhciBWZW50dXJlcywgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqL1xuXG5jbGFzcyBKc29uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBpbm5lckVycm9yKSB7XHJcbiAgICAgICAgc3VwZXIoaW5uZXJFcnJvclxyXG4gICAgICAgICAgICA/IGAke21lc3NhZ2V9LiBTZWUgdGhlIGlubmVyIGV4Y2VwdGlvbiBmb3IgbW9yZSBkZXRhaWxzLmBcclxuICAgICAgICAgICAgOiBtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIHRoaXMuaW5uZXJFcnJvciA9IGlubmVyRXJyb3I7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgVHJhbnNmb3JtRXJyb3IgZXh0ZW5kcyBKc29uRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBtZXNzYWdlLCBpbm5lckVycm9yKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgaW5uZXJFcnJvcik7XHJcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUGFyc2VyRXJyb3IgZXh0ZW5kcyBUcmFuc2Zvcm1FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEsIG1lc3NhZ2UsIGlubmVyRXJyb3IpIHtcclxuICAgICAgICBzdXBlcihzY2hlbWEsIGBKU09OIGRvZXNuJ3QgbWF0Y2ggdG8gJyR7c2NoZW1hLnRhcmdldC5uYW1lfScgc2NoZW1hLiAke21lc3NhZ2V9YCwgaW5uZXJFcnJvcik7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgSnNvbkVycm9yIHtcclxufVxuXG5jbGFzcyBTZXJpYWxpemVyRXJyb3IgZXh0ZW5kcyBKc29uRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3Ioc2NoZW1hTmFtZSwgbWVzc2FnZSwgaW5uZXJFcnJvcikge1xyXG4gICAgICAgIHN1cGVyKGBDYW5ub3Qgc2VyaWFsaXplIGJ5ICcke3NjaGVtYU5hbWV9JyBzY2hlbWEuICR7bWVzc2FnZX1gLCBpbm5lckVycm9yKTtcclxuICAgICAgICB0aGlzLnNjaGVtYU5hbWUgPSBzY2hlbWFOYW1lO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEtleUVycm9yIGV4dGVuZHMgUGFyc2VyRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBrZXlzLCBlcnJvcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHNjaGVtYSwgXCJTb21lIGtleXMgZG9lc24ndCBtYXRjaCB0byBzY2hlbWFcIik7XHJcbiAgICAgICAgdGhpcy5rZXlzID0ga2V5cztcclxuICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcclxuICAgIH1cclxufVxuXG52YXIgSnNvblByb3BUeXBlcztcclxuKGZ1bmN0aW9uIChKc29uUHJvcFR5cGVzKSB7XHJcbiAgICBKc29uUHJvcFR5cGVzW0pzb25Qcm9wVHlwZXNbXCJBbnlcIl0gPSAwXSA9IFwiQW55XCI7XHJcbiAgICBKc29uUHJvcFR5cGVzW0pzb25Qcm9wVHlwZXNbXCJCb29sZWFuXCJdID0gMV0gPSBcIkJvb2xlYW5cIjtcclxuICAgIEpzb25Qcm9wVHlwZXNbSnNvblByb3BUeXBlc1tcIk51bWJlclwiXSA9IDJdID0gXCJOdW1iZXJcIjtcclxuICAgIEpzb25Qcm9wVHlwZXNbSnNvblByb3BUeXBlc1tcIlN0cmluZ1wiXSA9IDNdID0gXCJTdHJpbmdcIjtcclxufSkoSnNvblByb3BUeXBlcyB8fCAoSnNvblByb3BUeXBlcyA9IHt9KSk7XG5cbmZ1bmN0aW9uIGNoZWNrVHlwZSh2YWx1ZSwgdHlwZSkge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSBKc29uUHJvcFR5cGVzLkJvb2xlYW46XHJcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiO1xyXG4gICAgICAgIGNhc2UgSnNvblByb3BUeXBlcy5OdW1iZXI6XHJcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCI7XHJcbiAgICAgICAgY2FzZSBKc29uUHJvcFR5cGVzLlN0cmluZzpcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIjtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIHRocm93SWZUeXBlSXNXcm9uZyh2YWx1ZSwgdHlwZSkge1xyXG4gICAgaWYgKCFjaGVja1R5cGUodmFsdWUsIHR5cGUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVmFsdWUgbXVzdCBiZSAke0pzb25Qcm9wVHlwZXNbdHlwZV19YCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gaXNDb252ZXJ0aWJsZSh0YXJnZXQpIHtcclxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LnByb3RvdHlwZSkge1xyXG4gICAgICAgIGlmICh0YXJnZXQucHJvdG90eXBlLnRvSlNPTiAmJiB0YXJnZXQucHJvdG90eXBlLmZyb21KU09OKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlzQ29udmVydGlibGUodGFyZ2V0LnByb3RvdHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICEhKHRhcmdldCAmJiB0YXJnZXQudG9KU09OICYmIHRhcmdldC5mcm9tSlNPTik7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgSnNvblNjaGVtYVN0b3JhZ2Uge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIGhhcyh0YXJnZXQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5oYXModGFyZ2V0KSB8fCAhIXRoaXMuZmluZFBhcmVudFNjaGVtYSh0YXJnZXQpO1xyXG4gICAgfVxyXG4gICAgZ2V0KHRhcmdldCkge1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuaXRlbXMuZ2V0KHRhcmdldCkgfHwgdGhpcy5maW5kUGFyZW50U2NoZW1hKHRhcmdldCk7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdldCBzY2hlbWEgZm9yIGN1cnJlbnQgdGFyZ2V0XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2NoZW1hO1xyXG4gICAgfVxyXG4gICAgY3JlYXRlKHRhcmdldCkge1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHsgbmFtZXM6IHt9IH07XHJcbiAgICAgICAgY29uc3QgcGFyZW50U2NoZW1hID0gdGhpcy5maW5kUGFyZW50U2NoZW1hKHRhcmdldCk7XHJcbiAgICAgICAgaWYgKHBhcmVudFNjaGVtYSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwgcGFyZW50U2NoZW1hKTtcclxuICAgICAgICAgICAgc2NoZW1hLm5hbWVzID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBwYXJlbnRTY2hlbWEubmFtZXMpIHtcclxuICAgICAgICAgICAgICAgIHNjaGVtYS5uYW1lc1tuYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmVudFNjaGVtYS5uYW1lc1tuYW1lXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgc2NoZW1hLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICByZXR1cm4gc2NoZW1hO1xyXG4gICAgfVxyXG4gICAgc2V0KHRhcmdldCwgc2NoZW1hKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQodGFyZ2V0LCBzY2hlbWEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgZmluZFBhcmVudFNjaGVtYSh0YXJnZXQpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnQgPSB0YXJnZXQuX19wcm90b19fO1xyXG4gICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5pdGVtcy5nZXQocGFyZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYSB8fCB0aGlzLmZpbmRQYXJlbnRTY2hlbWEocGFyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cblxuY29uc3QgREVGQVVMVF9TQ0hFTUEgPSBcImRlZmF1bHRcIjtcclxuY29uc3Qgc2NoZW1hU3RvcmFnZSA9IG5ldyBKc29uU2NoZW1hU3RvcmFnZSgpO1xuXG5jbGFzcyBQYXR0ZXJuVmFsaWRhdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XHJcbiAgICAgICAgdGhpcy5wYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcclxuICAgIH1cclxuICAgIHZhbGlkYXRlKHZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAodGhpcy5wYXR0ZXJuLnNvdXJjZSwgdGhpcy5wYXR0ZXJuLmZsYWdzKTtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJJbmNvbWluZyB2YWx1ZSBtdXN0IGJlIHN0cmluZ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFwYXR0ZXJuLmV4ZWModmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFZhbHVlIGRvZXNuJ3QgbWF0Y2ggdG8gcGF0dGVybiAnJHtwYXR0ZXJuLnRvU3RyaW5nKCl9J2ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBJbmNsdXNpdmVWYWxpZGF0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKG1pbiA9IE51bWJlci5NSU5fVkFMVUUsIG1heCA9IE51bWJlci5NQVhfVkFMVUUpIHtcclxuICAgICAgICB0aGlzLm1pbiA9IG1pbjtcclxuICAgICAgICB0aGlzLm1heCA9IG1heDtcclxuICAgIH1cclxuICAgIHZhbGlkYXRlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhyb3dJZlR5cGVJc1dyb25nKHZhbHVlLCBKc29uUHJvcFR5cGVzLk51bWJlcik7XHJcbiAgICAgICAgaWYgKCEodGhpcy5taW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gdGhpcy5tYXgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluID09PSBOdW1iZXIuTUlOX1ZBTFVFID8gXCJNSU5cIiA6IHRoaXMubWluO1xyXG4gICAgICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heCA9PT0gTnVtYmVyLk1BWF9WQUxVRSA/IFwiTUFYXCIgOiB0aGlzLm1heDtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVmFsdWUgZG9lc24ndCBtYXRjaCB0byBkaWFwYXNvbiBbJHttaW59LCR7bWF4fV1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgRXhjbHVzaXZlVmFsaWRhdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihtaW4gPSBOdW1iZXIuTUlOX1ZBTFVFLCBtYXggPSBOdW1iZXIuTUFYX1ZBTFVFKSB7XHJcbiAgICAgICAgdGhpcy5taW4gPSBtaW47XHJcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XHJcbiAgICB9XHJcbiAgICB2YWxpZGF0ZSh2YWx1ZSkge1xyXG4gICAgICAgIHRocm93SWZUeXBlSXNXcm9uZyh2YWx1ZSwgSnNvblByb3BUeXBlcy5OdW1iZXIpO1xyXG4gICAgICAgIGlmICghKHRoaXMubWluIDwgdmFsdWUgJiYgdmFsdWUgPCB0aGlzLm1heCkpIHtcclxuICAgICAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4gPT09IE51bWJlci5NSU5fVkFMVUUgPyBcIk1JTlwiIDogdGhpcy5taW47XHJcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4ID09PSBOdW1iZXIuTUFYX1ZBTFVFID8gXCJNQVhcIiA6IHRoaXMubWF4O1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBkb2Vzbid0IG1hdGNoIHRvIGRpYXBhc29uICgke21pbn0sJHttYXh9KWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBMZW5ndGhWYWxpZGF0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgbWluTGVuZ3RoLCBtYXhMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcclxuICAgICAgICB0aGlzLm1pbkxlbmd0aCA9IG1pbkxlbmd0aDtcclxuICAgICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDtcclxuICAgIH1cclxuICAgIHZhbGlkYXRlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFZhbHVlIGxlbmd0aCBtdXN0IGJlIGV4YWN0bHkgJHt0aGlzLmxlbmd0aH0uYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5taW5MZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFZhbHVlIGxlbmd0aCBtdXN0IGJlIG1vcmUgdGhhbiAke3RoaXMubWluTGVuZ3RofS5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFZhbHVlIGxlbmd0aCBtdXN0IGJlIGxlc3MgdGhhbiAke3RoaXMubWF4TGVuZ3RofS5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBFbnVtZXJhdGlvblZhbGlkYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoZW51bWVyYXRpb24pIHtcclxuICAgICAgICB0aGlzLmVudW1lcmF0aW9uID0gZW51bWVyYXRpb247XHJcbiAgICB9XHJcbiAgICB2YWxpZGF0ZSh2YWx1ZSkge1xyXG4gICAgICAgIHRocm93SWZUeXBlSXNXcm9uZyh2YWx1ZSwgSnNvblByb3BUeXBlcy5TdHJpbmcpO1xyXG4gICAgICAgIGlmICghdGhpcy5lbnVtZXJhdGlvbi5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVmFsdWUgbXVzdCBiZSBvbmUgb2YgJHt0aGlzLmVudW1lcmF0aW9uLm1hcCgodikgPT4gYCcke3Z9J2ApLmpvaW4oXCIsIFwiKX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgSnNvblRyYW5zZm9ybSB7XHJcbiAgICBzdGF0aWMgY2hlY2tWYWx1ZXMoZGF0YSwgc2NoZW1hSXRlbSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdO1xyXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBzY2hlbWFJdGVtLnZhbGlkYXRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbiBpbnN0YW5jZW9mIExlbmd0aFZhbGlkYXRpb24gJiYgc2NoZW1hSXRlbS5yZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBjaGVja1R5cGVzKHZhbHVlLCBzY2hlbWFJdGVtKSB7XHJcbiAgICAgICAgaWYgKHNjaGVtYUl0ZW0ucmVwZWF0ZWQgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJWYWx1ZSBtdXN0IGJlIEFycmF5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW0udHlwZSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3dJZlR5cGVJc1dyb25nKHYsIHNjaGVtYUl0ZW0udHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0U2NoZW1hQnlOYW1lKHNjaGVtYSwgbmFtZSA9IERFRkFVTFRfU0NIRU1BKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uc2NoZW1hLm5hbWVzW0RFRkFVTFRfU0NIRU1BXSwgLi4uc2NoZW1hLm5hbWVzW25hbWVdIH07XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgSnNvblNlcmlhbGl6ZXIgZXh0ZW5kcyBKc29uVHJhbnNmb3JtIHtcclxuICAgIHN0YXRpYyBzZXJpYWxpemUob2JqLCBvcHRpb25zLCByZXBsYWNlciwgc3BhY2UpIHtcclxuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04ob2JqLCBvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbiwgcmVwbGFjZXIsIHNwYWNlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyB0b0pTT04ob2JqLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBsZXQgcmVzO1xyXG4gICAgICAgIGxldCB0YXJnZXRTY2hlbWEgPSBvcHRpb25zLnRhcmdldFNjaGVtYTtcclxuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gb3B0aW9ucy5zY2hlbWFOYW1lIHx8IERFRkFVTFRfU0NIRU1BO1xyXG4gICAgICAgIGlmIChpc0NvbnZlcnRpYmxlKG9iaikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iai50b0pTT04oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgICAgICAgICByZXMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iaikge1xyXG4gICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy50b0pTT04oaXRlbSwgb3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgaWYgKHRhcmdldFNjaGVtYSAmJiAhc2NoZW1hU3RvcmFnZS5oYXModGFyZ2V0U2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25FcnJvcihcIkNhbm5vdCBnZXQgc2NoZW1hIGZvciBgdGFyZ2V0U2NoZW1hYCBwYXJhbVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0YXJnZXRTY2hlbWEgPSAodGFyZ2V0U2NoZW1hIHx8IG9iai5jb25zdHJ1Y3Rvcik7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWFTdG9yYWdlLmhhcyh0YXJnZXRTY2hlbWEpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmdldCh0YXJnZXRTY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgcmVzID0ge307XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lZFNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hQnlOYW1lKHNjaGVtYSwgc2NoZW1hTmFtZSk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuYW1lZFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuYW1lZFNjaGVtYVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmpJdGVtID0gb2JqW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLm9wdGlvbmFsICYmIG9iakl0ZW0gPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpdGVtLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG9iakl0ZW0gPT09IGl0ZW0uZGVmYXVsdFZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLm9wdGlvbmFsICYmIG9iakl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6ZXJFcnJvcih0YXJnZXRTY2hlbWEubmFtZSwgYFByb3BlcnR5ICcke2tleX0nIGlzIHJlcXVpcmVkLmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbS50eXBlID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb252ZXJ0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5yZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iakl0ZW0ubWFwKChlbCkgPT4gaXRlbS5jb252ZXJ0ZXIudG9KU09OKGVsLCBvYmopKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRlbS5jb252ZXJ0ZXIudG9KU09OKG9iakl0ZW0sIG9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvYmpJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ucmVwZWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iakl0ZW0ubWFwKChlbCkgPT4gdGhpcy50b0pTT04oZWwsIHsgc2NoZW1hTmFtZSB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMudG9KU09OKG9iakl0ZW0sIHsgc2NoZW1hTmFtZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVHlwZXModmFsdWUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmFsdWVzKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2l0ZW0ubmFtZSB8fCBrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU2VyaWFsaXplckVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6ZXJFcnJvcihzY2hlbWEudGFyZ2V0Lm5hbWUsIGBQcm9wZXJ0eSAnJHtrZXl9JyBpcyB3cm9uZy4gJHtlLm1lc3NhZ2V9YCwgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gdGhpcy50b0pTT04ob2JqW2tleV0sIHsgc2NoZW1hTmFtZSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVzID0gb2JqO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEpzb25QYXJzZXIgZXh0ZW5kcyBKc29uVHJhbnNmb3JtIHtcclxuICAgIHN0YXRpYyBwYXJzZShkYXRhLCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5mcm9tSlNPTihvYmosIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21KU09OKHRhcmdldCwgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldFNjaGVtYSA9IG9wdGlvbnMudGFyZ2V0U2NoZW1hO1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBvcHRpb25zLnNjaGVtYU5hbWUgfHwgREVGQVVMVF9TQ0hFTUE7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gbmV3IHRhcmdldFNjaGVtYSgpO1xyXG4gICAgICAgIGlmIChpc0NvbnZlcnRpYmxlKG9iaikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iai5mcm9tSlNPTih0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmdldCh0YXJnZXRTY2hlbWEpO1xyXG4gICAgICAgIGNvbnN0IG5hbWVkU2NoZW1hID0gdGhpcy5nZXRTY2hlbWFCeU5hbWUoc2NoZW1hLCBzY2hlbWFOYW1lKTtcclxuICAgICAgICBjb25zdCBrZXlFcnJvcnMgPSB7fTtcclxuICAgICAgICBpZiAob3B0aW9ucy5zdHJpY3RQcm9wZXJ0eSAmJiAhQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIEpzb25QYXJzZXIuY2hlY2tTdHJpY3RQcm9wZXJ0eSh0YXJnZXQsIG5hbWVkU2NoZW1hLCBzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuYW1lZFNjaGVtYSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG5hbWVkU2NoZW1hW2tleV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaXRlbS5uYW1lIHx8IGtleTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W25hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgKGl0ZW0ub3B0aW9uYWwgfHwgaXRlbS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghaXRlbS5vcHRpb25hbCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlckVycm9yKHNjaGVtYSwgYFByb3BlcnR5ICcke25hbWV9JyBpcyByZXF1aXJlZC5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tUeXBlcyh2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmFsdWVzKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGl0ZW0udHlwZSkgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb252ZXJ0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ucmVwZWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWUubWFwKChlbCkgPT4gaXRlbS5jb252ZXJ0ZXIuZnJvbUpTT04oZWwsIG9iaikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSBpdGVtLmNvbnZlcnRlci5mcm9tSlNPTih2YWx1ZSwgb2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTY2hlbWE6IGl0ZW0udHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnJlcGVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWUubWFwKChlbCkgPT4gdGhpcy5mcm9tSlNPTihlbCwgbmV3T3B0aW9ucykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB0aGlzLmZyb21KU09OKHZhbHVlLCBuZXdPcHRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBQYXJzZXJFcnJvcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlID0gbmV3IFBhcnNlckVycm9yKHNjaGVtYSwgYFByb3BlcnR5ICcke2tleX0nIGlzIHdyb25nLiAke2UubWVzc2FnZX1gLCBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0cmljdEFsbEtleXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXlFcnJvcnNba2V5XSA9IGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhrZXlFcnJvcnMpO1xyXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgS2V5RXJyb3Ioc2NoZW1hLCBrZXlzLCBrZXlFcnJvcnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNoZWNrU3RyaWN0UHJvcGVydHkodGFyZ2V0LCBuYW1lZFNjaGVtYSwgc2NoZW1hKSB7XHJcbiAgICAgICAgY29uc3QganNvblByb3BzID0gT2JqZWN0LmtleXModGFyZ2V0KTtcclxuICAgICAgICBjb25zdCBzY2hlbWFQcm9wcyA9IE9iamVjdC5rZXlzKG5hbWVkU2NoZW1hKTtcclxuICAgICAgICBjb25zdCBrZXlzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YganNvblByb3BzKSB7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWFQcm9wcy5pbmRleE9mKGtleSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoa2V5cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEtleUVycm9yKHNjaGVtYSwga2V5cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRpb25zKGl0ZW0pIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25zID0gW107XHJcbiAgICBpZiAoaXRlbS5wYXR0ZXJuKSB7XHJcbiAgICAgICAgdmFsaWRhdGlvbnMucHVzaChuZXcgUGF0dGVyblZhbGlkYXRpb24oaXRlbS5wYXR0ZXJuKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoaXRlbS50eXBlID09PSBKc29uUHJvcFR5cGVzLk51bWJlciB8fCBpdGVtLnR5cGUgPT09IEpzb25Qcm9wVHlwZXMuQW55KSB7XHJcbiAgICAgICAgaWYgKGl0ZW0ubWluSW5jbHVzaXZlICE9PSB1bmRlZmluZWQgfHwgaXRlbS5tYXhJbmNsdXNpdmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKG5ldyBJbmNsdXNpdmVWYWxpZGF0aW9uKGl0ZW0ubWluSW5jbHVzaXZlLCBpdGVtLm1heEluY2x1c2l2ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5taW5FeGNsdXNpdmUgIT09IHVuZGVmaW5lZCB8fCBpdGVtLm1heEV4Y2x1c2l2ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25zLnB1c2gobmV3IEV4Y2x1c2l2ZVZhbGlkYXRpb24oaXRlbS5taW5FeGNsdXNpdmUsIGl0ZW0ubWF4RXhjbHVzaXZlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLmVudW1lcmF0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbnMucHVzaChuZXcgRW51bWVyYXRpb25WYWxpZGF0aW9uKGl0ZW0uZW51bWVyYXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaXRlbS50eXBlID09PSBKc29uUHJvcFR5cGVzLlN0cmluZyB8fCBpdGVtLnJlcGVhdGVkIHx8IGl0ZW0udHlwZSA9PT0gSnNvblByb3BUeXBlcy5BbnkpIHtcclxuICAgICAgICBpZiAoaXRlbS5sZW5ndGggIT09IHVuZGVmaW5lZCB8fCBpdGVtLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkIHx8IGl0ZW0ubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbnMucHVzaChuZXcgTGVuZ3RoVmFsaWRhdGlvbihpdGVtLmxlbmd0aCwgaXRlbS5taW5MZW5ndGgsIGl0ZW0ubWF4TGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbGlkYXRpb25zO1xyXG59XHJcbmNvbnN0IEpzb25Qcm9wID0gKG9wdGlvbnMgPSB7fSkgPT4gKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBDYW5ub3Qgc2V0IHR5cGUgZm9yICR7cHJvcGVydHlLZXl9IHByb3BlcnR5IG9mICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9IHNjaGVtYWA7XHJcbiAgICBsZXQgc2NoZW1hO1xyXG4gICAgaWYgKCFzY2hlbWFTdG9yYWdlLmhhcyh0YXJnZXQuY29uc3RydWN0b3IpKSB7XHJcbiAgICAgICAgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5jcmVhdGUodGFyZ2V0LmNvbnN0cnVjdG9yKTtcclxuICAgICAgICBzY2hlbWFTdG9yYWdlLnNldCh0YXJnZXQuY29uc3RydWN0b3IsIHNjaGVtYSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmdldCh0YXJnZXQuY29uc3RydWN0b3IpO1xyXG4gICAgICAgIGlmIChzY2hlbWEudGFyZ2V0ICE9PSB0YXJnZXQuY29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5jcmVhdGUodGFyZ2V0LmNvbnN0cnVjdG9yKTtcclxuICAgICAgICAgICAgc2NoZW1hU3RvcmFnZS5zZXQodGFyZ2V0LmNvbnN0cnVjdG9yLCBzY2hlbWEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGRlZmF1bHRTY2hlbWEgPSB7XHJcbiAgICAgICAgdHlwZTogSnNvblByb3BUeXBlcy5BbnksXHJcbiAgICAgICAgdmFsaWRhdGlvbnM6IFtdLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IGNvcHlPcHRpb25zID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0U2NoZW1hLCBvcHRpb25zKTtcclxuICAgIGNvcHlPcHRpb25zLnZhbGlkYXRpb25zID0gZ2V0VmFsaWRhdGlvbnMoY29weU9wdGlvbnMpO1xyXG4gICAgaWYgKHR5cGVvZiBjb3B5T3B0aW9ucy50eXBlICE9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWFTdG9yYWdlLmhhcyhjb3B5T3B0aW9ucy50eXBlKSAmJiAhaXNDb252ZXJ0aWJsZShjb3B5T3B0aW9ucy50eXBlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JNZXNzYWdlfS4gQXNzaWduaW5nIHR5cGUgZG9lc24ndCBoYXZlIHNjaGVtYS5gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgc2NoZW1hTmFtZXM7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnNjaGVtYSkpIHtcclxuICAgICAgICBzY2hlbWFOYW1lcyA9IG9wdGlvbnMuc2NoZW1hO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgc2NoZW1hTmFtZXMgPSBbb3B0aW9ucy5zY2hlbWEgfHwgREVGQVVMVF9TQ0hFTUFdO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBzY2hlbWFOYW1lIG9mIHNjaGVtYU5hbWVzKSB7XHJcbiAgICAgICAgaWYgKCFzY2hlbWEubmFtZXNbc2NoZW1hTmFtZV0pIHtcclxuICAgICAgICAgICAgc2NoZW1hLm5hbWVzW3NjaGVtYU5hbWVdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5hbWVkU2NoZW1hID0gc2NoZW1hLm5hbWVzW3NjaGVtYU5hbWVdO1xyXG4gICAgICAgIG5hbWVkU2NoZW1hW3Byb3BlcnR5S2V5XSA9IGNvcHlPcHRpb25zO1xyXG4gICAgfVxyXG59O1xuXG5leHBvcnQgeyBKc29uRXJyb3IsIEpzb25QYXJzZXIsIEpzb25Qcm9wLCBKc29uUHJvcFR5cGVzLCBKc29uU2VyaWFsaXplciwgS2V5RXJyb3IsIFBhcnNlckVycm9yLCBTZXJpYWxpemVyRXJyb3IsIFRyYW5zZm9ybUVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfTtcbiIsICIvKiFcbiBDb3B5cmlnaHQgKGMpIFBlY3VsaWFyIFZlbnR1cmVzLCBMTENcbiovXG5cbmltcG9ydCB7IENvbnZlcnQsIEJ1ZmZlclNvdXJjZUNvbnZlcnRlciwgY29tYmluZSB9IGZyb20gJ3B2dHN1dGlscyc7XG5leHBvcnQgeyBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIgfSBmcm9tICdwdnRzdXRpbHMnO1xuaW1wb3J0IHsgQXNuUHJvcCwgQXNuUHJvcFR5cGVzLCBBc25UeXBlLCBBc25UeXBlVHlwZXMsIEFzbkludGVnZXJDb252ZXJ0ZXIsIEFzblNlcmlhbGl6ZXIsIEFzbkNvbnZlcnQgfSBmcm9tICdAcGVjdWxpYXIvYXNuMS1zY2hlbWEnO1xuaW1wb3J0IHsgX19kZWNvcmF0ZSB9IGZyb20gJ3RzbGliJztcbmltcG9ydCB7IEpzb25Qcm9wLCBKc29uUHJvcFR5cGVzIH0gZnJvbSAnQHBlY3VsaWFyL2pzb24tc2NoZW1hJztcbmltcG9ydCAqIGFzIGFzbjEgZnJvbSAnYXNuMWpzJztcblxuY2xhc3MgQ3J5cHRvRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbn1cblxuY2xhc3MgQWxnb3JpdGhtRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XHJcbn1cblxuY2xhc3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvciBleHRlbmRzIENyeXB0b0Vycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1ldGhvZE5hbWUpIHtcclxuICAgICAgICBzdXBlcihgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAke21ldGhvZE5hbWUgPyBgJHttZXRob2ROYW1lfWAgOiBcIlwifWApO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIE9wZXJhdGlvbkVycm9yIGV4dGVuZHMgQ3J5cHRvRXJyb3Ige1xyXG59XG5cbmNsYXNzIFJlcXVpcmVkUHJvcGVydHlFcnJvciBleHRlbmRzIENyeXB0b0Vycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BOYW1lKSB7XHJcbiAgICAgICAgc3VwZXIoYCR7cHJvcE5hbWV9OiBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5YCk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUGVtQ29udmVydGVyIHtcclxuICAgIHN0YXRpYyB0b0FycmF5QnVmZmVyKHBlbSkge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NCA9IHBlbVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvLXs1fShCRUdJTnxFTkQpIC4qLXs1fS9nLCBcIlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZShcIlxcclwiLCBcIlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZShcIlxcblwiLCBcIlwiKTtcclxuICAgICAgICByZXR1cm4gQ29udmVydC5Gcm9tQmFzZTY0KGJhc2U2NCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgdG9VaW50OEFycmF5KHBlbSkge1xyXG4gICAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy50b0FycmF5QnVmZmVyKHBlbSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tQnVmZmVyU291cmNlKGJ1ZmZlciwgdGFnKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0ID0gQ29udmVydC5Ub0Jhc2U2NChidWZmZXIpO1xyXG4gICAgICAgIGxldCBzbGljZWQ7XHJcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XHJcbiAgICAgICAgY29uc3Qgcm93cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIHNsaWNlZCA9IGJhc2U2NC5zbGljZShvZmZzZXQsIG9mZnNldCA9IG9mZnNldCArIDY0KTtcclxuICAgICAgICAgICAgaWYgKHNsaWNlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHJvd3MucHVzaChzbGljZWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNsaWNlZC5sZW5ndGggPCA2NCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdXBwZXJDYXNlVGFnID0gdGFnLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIGAtLS0tLUJFR0lOICR7dXBwZXJDYXNlVGFnfS0tLS0tXFxuJHtyb3dzLmpvaW4oXCJcXG5cIil9XFxuLS0tLS1FTkQgJHt1cHBlckNhc2VUYWd9LS0tLS1gO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzUEVNKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gLy0tLS0tQkVHSU4gListLS0tLVtBLVphLXowLTkrXFwvXFwrXFw9XFxzXFxuXSstLS0tLUVORCAuKy0tLS0tL2kudGVzdChkYXRhKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBnZXRUYWdOYW1lKHBlbSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1BFTShwZW0pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBwYXJhbWV0ZXIuIEluY29taW5nIGRhdGEgaXMgbm90IHJpZ2h0IFBFTVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzID0gLy0tLS0tQkVHSU4gKC4rKS0tLS0tLy5leGVjKHBlbSk7XHJcbiAgICAgICAgaWYgKCFyZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdldCB0YWcgZnJvbSBQRU1cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNbMV07XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaGFzVGFnTmFtZShwZW0sIHRhZ05hbWUpIHtcclxuICAgICAgICBjb25zdCB0YWcgPSB0aGlzLmdldFRhZ05hbWUocGVtKTtcclxuICAgICAgICByZXR1cm4gdGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWcudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBpc0NlcnRpZmljYXRlKHBlbSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhhc1RhZ05hbWUocGVtLCBcImNlcnRpZmljYXRlXCIpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzQ2VydGlmaWNhdGVSZXF1ZXN0KHBlbSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhhc1RhZ05hbWUocGVtLCBcImNlcnRpZmljYXRlIHJlcXVlc3RcIik7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNDUkwocGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVGFnTmFtZShwZW0sIFwieDUwOSBjcmxcIik7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNQdWJsaWNLZXkocGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVGFnTmFtZShwZW0sIFwicHVibGljIGtleVwiKTtcclxuICAgIH1cclxufVxuXG5mdW5jdGlvbiBpc0pXSyhkYXRhKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJrdHlcIiBpbiBkYXRhO1xyXG59XG5cbmNsYXNzIFByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGFzeW5jIGRpZ2VzdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0RpZ2VzdC5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vbkRpZ2VzdC5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGNoZWNrRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImRpZ2VzdFwiKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGdlbmVyYXRlS2V5KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrR2VuZXJhdGVLZXkuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub25HZW5lcmF0ZUtleS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGNoZWNrR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobU5hbWUoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKTtcclxuICAgICAgICBpZiAoIShrZXlVc2FnZXMgJiYga2V5VXNhZ2VzLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVXNhZ2VzIGNhbm5vdCBiZSBlbXB0eSB3aGVuIGNyZWF0aW5nIGEga2V5LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgYWxsb3dlZFVzYWdlcztcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnVzYWdlcykpIHtcclxuICAgICAgICAgICAgYWxsb3dlZFVzYWdlcyA9IHRoaXMudXNhZ2VzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYWxsb3dlZFVzYWdlcyA9IHRoaXMudXNhZ2VzLnByaXZhdGVLZXkuY29uY2F0KHRoaXMudXNhZ2VzLnB1YmxpY0tleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hlY2tLZXlVc2FnZXMoa2V5VXNhZ2VzLCBhbGxvd2VkVXNhZ2VzKTtcclxuICAgIH1cclxuICAgIGNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4uYXJncykge1xyXG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFwiZ2VuZXJhdGVLZXlcIik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBzaWduKC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrU2lnbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vblNpZ24uYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja1NpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEsIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGtleSwgXCJzaWduXCIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TaWduKGFsZ29yaXRobSwga2V5LCBkYXRhLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJzaWduXCIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdmVyaWZ5KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrVmVyaWZ5LmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uVmVyaWZ5LmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tWZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSwgLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5LCBcInZlcmlmeVwiKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uVmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEsIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcInZlcmlmeVwiKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGVuY3J5cHQoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tFbmNyeXB0LmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uRW5jcnlwdC5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGNoZWNrRW5jcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSwgb3B0aW9ucyA9IHt9LCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobU5hbWUoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXksIG9wdGlvbnMua2V5VXNhZ2UgPyBcImVuY3J5cHRcIiA6IHZvaWQgMCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEsIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImVuY3J5cHRcIik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBkZWNyeXB0KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRGVjcnlwdC5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vbkRlY3J5cHQuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0RlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEsIG9wdGlvbnMgPSB7fSwgLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5LCBvcHRpb25zLmtleVVzYWdlID8gXCJkZWNyeXB0XCIgOiB2b2lkIDApO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJkZWNyeXB0XCIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZGVyaXZlQml0cyguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Rlcml2ZUJpdHMuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub25EZXJpdmVCaXRzLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tEZXJpdmVCaXRzKGFsZ29yaXRobSwgYmFzZUtleSwgbGVuZ3RoLCBvcHRpb25zID0ge30sIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGJhc2VLZXksIG9wdGlvbnMua2V5VXNhZ2UgPyBcImRlcml2ZUJpdHNcIiA6IHZvaWQgMCk7XHJcbiAgICAgICAgaWYgKGxlbmd0aCAlIDggIT09IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwibGVuZ3RoOiBJcyBub3QgbXVsdGlwbGUgb2YgOFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRlcml2ZUJpdHMoYWxnb3JpdGhtLCBiYXNlS2V5LCBsZW5ndGgsIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImRlcml2ZUJpdHNcIik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBleHBvcnRLZXkoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tFeHBvcnRLZXkuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub25FeHBvcnRLZXkuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0V4cG9ydEtleShmb3JtYXQsIGtleSwgLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tLZXlGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgaWYgKCFrZXkuZXh0cmFjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IENyeXB0b0Vycm9yKFwia2V5OiBJcyBub3QgZXh0cmFjdGFibGVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXksIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImV4cG9ydEtleVwiKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGltcG9ydEtleSguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0ltcG9ydEtleS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vbkltcG9ydEtleS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGNoZWNrSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0tleUZvcm1hdChmb3JtYXQpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tLZXlEYXRhKGZvcm1hdCwga2V5RGF0YSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobU5hbWUoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrSW1wb3J0UGFyYW1zKGFsZ29yaXRobSk7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy51c2FnZXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tLZXlVc2FnZXMoa2V5VXNhZ2VzLCB0aGlzLnVzYWdlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImltcG9ydEtleVwiKTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pIHtcclxuICAgICAgICBpZiAoYWxnb3JpdGhtLm5hbWUudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uYW1lLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFsZ29yaXRobUVycm9yKFwiVW5yZWNvZ25pemVkIG5hbWVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICB9XHJcbiAgICBjaGVja0Rlcml2ZWRLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICB9XHJcbiAgICBjaGVja0tleVVzYWdlcyh1c2FnZXMsIGFsbG93ZWQpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHVzYWdlIG9mIHVzYWdlcykge1xyXG4gICAgICAgICAgICBpZiAoYWxsb3dlZC5pbmRleE9mKHVzYWdlKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGEga2V5IHVzaW5nIHRoZSBzcGVjaWZpZWQga2V5IHVzYWdlc1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShrZXkuYWxnb3JpdGhtKTtcclxuICAgICAgICBpZiAoa2V5VXNhZ2UgJiYga2V5LnVzYWdlcy5pbmRleE9mKGtleVVzYWdlKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IENyeXB0b0Vycm9yKGBrZXkgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiBvcGVyYXRpb25gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja1JlcXVpcmVkUHJvcGVydHkoZGF0YSwgcHJvcE5hbWUpIHtcclxuICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiBkYXRhKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVxdWlyZWRQcm9wZXJ0eUVycm9yKHByb3BOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0hhc2hBbGdvcml0aG0oYWxnb3JpdGhtLCBoYXNoQWxnb3JpdGhtcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBoYXNoQWxnb3JpdGhtcykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50b0xvd2VyQ2FzZSgpID09PSBhbGdvcml0aG0ubmFtZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKGBoYXNoOiBNdXN0IGJlIG9uZSBvZiAke2hhc2hBbGdvcml0aG1zLmpvaW4oXCIsIFwiKX1gKTtcclxuICAgIH1cclxuICAgIGNoZWNrSW1wb3J0UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgfVxyXG4gICAgY2hlY2tLZXlGb3JtYXQoZm9ybWF0KSB7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQpIHtcclxuICAgICAgICAgICAgY2FzZSBcInJhd1wiOlxyXG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjpcclxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjpcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZm9ybWF0OiBJcyBpbnZhbGlkIHZhbHVlLiBNdXN0IGJlICdqd2snLCAncmF3JywgJ3Nwa2knLCBvciAncGtjczgnXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrS2V5RGF0YShmb3JtYXQsIGtleURhdGEpIHtcclxuICAgICAgICBpZiAoIWtleURhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleURhdGE6IENhbm5vdCBiZSBlbXB0eSBvbiBlbXB0eSBvbiBrZXkgaW1wb3J0aW5nXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImp3a1wiKSB7XHJcbiAgICAgICAgICAgIGlmICghaXNKV0soa2V5RGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXlEYXRhOiBJcyBub3QgSnNvbldlYlRva2VuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCFCdWZmZXJTb3VyY2VDb252ZXJ0ZXIuaXNCdWZmZXJTb3VyY2Uoa2V5RGF0YSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleURhdGE6IElzIG5vdCBBcnJheUJ1ZmZlclZpZXcgb3IgQXJyYXlCdWZmZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJlcGFyZURhdGEoZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihkYXRhKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBBZXNQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImxlbmd0aFwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxlbmd0aDogSXMgbm90IG9mIHR5cGUgTnVtYmVyXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY2FzZSAxMjg6XHJcbiAgICAgICAgICAgIGNhc2UgMTkyOlxyXG4gICAgICAgICAgICBjYXNlIDI1NjpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxlbmd0aDogTXVzdCBiZSAxMjgsIDE5Miwgb3IgMjU2XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrRGVyaXZlZEtleVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBBZXNDYmNQcm92aWRlciBleHRlbmRzIEFlc1Byb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBRVMtQ0JDXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiLCBcIndyYXBLZXlcIiwgXCJ1bndyYXBLZXlcIl07XHJcbiAgICB9XHJcbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwiaXZcIik7XHJcbiAgICAgICAgaWYgKCEoYWxnb3JpdGhtLml2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KGFsZ29yaXRobS5pdikpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpdjogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5pdi5ieXRlTGVuZ3RoICE9PSAxNikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXY6IE11c3QgaGF2ZSBsZW5ndGggMTYgYnl0ZXNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEFlc0NtYWNQcm92aWRlciBleHRlbmRzIEFlc1Byb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBRVMtQ01BQ1wiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wic2lnblwiLCBcInZlcmlmeVwiXTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJsZW5ndGhcIik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0ubGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBhIE51bWJlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImxlbmd0aDogTXVzdCBiZSBtb3JlIHRoYW4gMFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzQ3RyUHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUNUUlwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIiwgXCJ3cmFwS2V5XCIsIFwidW53cmFwS2V5XCJdO1xyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImNvdW50ZXJcIik7XHJcbiAgICAgICAgaWYgKCEoYWxnb3JpdGhtLmNvdW50ZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYWxnb3JpdGhtLmNvdW50ZXIpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY291bnRlcjogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5jb3VudGVyLmJ5dGVMZW5ndGggIT09IDE2KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpdjogTXVzdCBoYXZlIGxlbmd0aCAxNiBieXRlc1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImxlbmd0aFwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxlbmd0aDogSXMgbm90IGEgTnVtYmVyXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWxnb3JpdGhtLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwibGVuZ3RoOiBNdXN0IGJlIG1vcmUgdGhhbiAwXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBBZXNFY2JQcm92aWRlciBleHRlbmRzIEFlc1Byb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBRVMtRUNCXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiLCBcIndyYXBLZXlcIiwgXCJ1bndyYXBLZXlcIl07XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzR2NtUHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUdDTVwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIiwgXCJ3cmFwS2V5XCIsIFwidW53cmFwS2V5XCJdO1xyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcIml2XCIpO1xyXG4gICAgICAgIGlmICghKGFsZ29yaXRobS5pdiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhhbGdvcml0aG0uaXYpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXY6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbGdvcml0aG0uaXYuYnl0ZUxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwiaXY6IE11c3QgaGF2ZSBsZW5ndGggbW9yZSB0aGFuIDAgYW5kIGxlc3MgdGhhbiAyXjY0IC0gMVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEoXCJ0YWdMZW5ndGhcIiBpbiBhbGdvcml0aG0pKSB7XHJcbiAgICAgICAgICAgIGFsZ29yaXRobS50YWdMZW5ndGggPSAxMjg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoYWxnb3JpdGhtLnRhZ0xlbmd0aCkge1xyXG4gICAgICAgICAgICBjYXNlIDMyOlxyXG4gICAgICAgICAgICBjYXNlIDY0OlxyXG4gICAgICAgICAgICBjYXNlIDk2OlxyXG4gICAgICAgICAgICBjYXNlIDEwNDpcclxuICAgICAgICAgICAgY2FzZSAxMTI6XHJcbiAgICAgICAgICAgIGNhc2UgMTIwOlxyXG4gICAgICAgICAgICBjYXNlIDEyODpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwidGFnTGVuZ3RoOiBNdXN0IGJlIG9uZSBvZiAzMiwgNjQsIDk2LCAxMDQsIDExMiwgMTIwIG9yIDEyOFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzS3dQcm92aWRlciBleHRlbmRzIEFlc1Byb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBRVMtS1dcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcIndyYXBLZXlcIiwgXCJ1bndyYXBLZXlcIl07XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgRGVzUHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlckNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIiwgXCJ3cmFwS2V5XCIsIFwidW53cmFwS2V5XCJdO1xyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXZTaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJpdlwiKTtcclxuICAgICAgICAgICAgaWYgKCEoYWxnb3JpdGhtLml2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KGFsZ29yaXRobS5pdikpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXY6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFsZ29yaXRobS5pdi5ieXRlTGVuZ3RoICE9PSB0aGlzLml2U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaXY6IE11c3QgaGF2ZSBsZW5ndGggJHt0aGlzLml2U2l6ZX0gYnl0ZXNgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImxlbmd0aFwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxlbmd0aDogSXMgbm90IG9mIHR5cGUgTnVtYmVyXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWxnb3JpdGhtLmxlbmd0aCAhPT0gdGhpcy5rZXlTaXplQml0cykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoYGFsZ29yaXRobS5sZW5ndGg6IE11c3QgYmUgJHt0aGlzLmtleVNpemVCaXRzfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrRGVyaXZlZEtleVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBSc2FQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5oYXNoQWxnb3JpdGhtcyA9IFtcIlNIQS0xXCIsIFwiU0hBLTI1NlwiLCBcIlNIQS0zODRcIiwgXCJTSEEtNTEyXCJdO1xyXG4gICAgfVxyXG4gICAgY2hlY2tHZW5lcmF0ZUtleVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwiaGFzaFwiKTtcclxuICAgICAgICB0aGlzLmNoZWNrSGFzaEFsZ29yaXRobShhbGdvcml0aG0uaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtcyk7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcInB1YmxpY0V4cG9uZW50XCIpO1xyXG4gICAgICAgIGlmICghKGFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCAmJiBhbGdvcml0aG0ucHVibGljRXhwb25lbnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwicHVibGljRXhwb25lbnQ6IE1pc3Npbmcgb3Igbm90IGEgVWludDhBcnJheVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHVibGljRXhwb25lbnQgPSBDb252ZXJ0LlRvQmFzZTY0KGFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCk7XHJcbiAgICAgICAgaWYgKCEocHVibGljRXhwb25lbnQgPT09IFwiQXc9PVwiIHx8IHB1YmxpY0V4cG9uZW50ID09PSBcIkFRQUJcIikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInB1YmxpY0V4cG9uZW50OiBNdXN0IGJlIFszXSBvciBbMSwwLDFdXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibW9kdWx1c0xlbmd0aFwiKTtcclxuICAgICAgICBpZiAoYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGggJSA4XHJcbiAgICAgICAgICAgIHx8IGFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoIDwgMjU2XHJcbiAgICAgICAgICAgIHx8IGFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoID4gMTYzODQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBtb2R1bHVzIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBiaXRzIGFuZCA+PSAyNTYgYW5kIDw9IDE2Mzg0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrSW1wb3J0UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJoYXNoXCIpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG1zKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBSc2FTc2FQcm92aWRlciBleHRlbmRzIFJzYVByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSU0FTU0EtUEtDUzEtdjFfNVwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0ge1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5OiBbXCJzaWduXCJdLFxyXG4gICAgICAgICAgICBwdWJsaWNLZXk6IFtcInZlcmlmeVwiXSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFJzYVBzc1Byb3ZpZGVyIGV4dGVuZHMgUnNhUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIlJTQS1QU1NcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wic2lnblwiXSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBbXCJ2ZXJpZnlcIl0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJzYWx0TGVuZ3RoXCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgYWxnb3JpdGhtLnNhbHRMZW5ndGggIT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInNhbHRMZW5ndGg6IElzIG5vdCBhIE51bWJlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5zYWx0TGVuZ3RoIDwgMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNhbHRMZW5ndGg6IE11c3QgYmUgcG9zaXRpdmUgbnVtYmVyXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBSc2FPYWVwUHJvdmlkZXIgZXh0ZW5kcyBSc2FQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiUlNBLU9BRVBcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wiZGVjcnlwdFwiLCBcInVud3JhcEtleVwiXSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBbXCJlbmNyeXB0XCIsIFwid3JhcEtleVwiXSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5sYWJlbFxyXG4gICAgICAgICAgICAmJiAhKGFsZ29yaXRobS5sYWJlbCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhhbGdvcml0aG0ubGFiZWwpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGFiZWw6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVsbGlwdGljUHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlckNyeXB0byB7XHJcbiAgICBjaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJuYW1lZEN1cnZlXCIpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tOYW1lZEN1cnZlKGFsZ29yaXRobS5uYW1lZEN1cnZlKTtcclxuICAgIH1cclxuICAgIGNoZWNrTmFtZWRDdXJ2ZShuYW1lZEN1cnZlKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMubmFtZWRDdXJ2ZXMpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udG9Mb3dlckNhc2UoKSA9PT0gbmFtZWRDdXJ2ZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKGBuYW1lZEN1cnZlOiBNdXN0IGJlIG9uZSBvZiAke3RoaXMubmFtZWRDdXJ2ZXMuam9pbihcIiwgXCIpfWApO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVjZHNhUHJvdmlkZXIgZXh0ZW5kcyBFbGxpcHRpY1Byb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJFQ0RTQVwiO1xyXG4gICAgICAgIHRoaXMuaGFzaEFsZ29yaXRobXMgPSBbXCJTSEEtMVwiLCBcIlNIQS0yNTZcIiwgXCJTSEEtMzg0XCIsIFwiU0hBLTUxMlwiXTtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wic2lnblwiXSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBbXCJ2ZXJpZnlcIl0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm5hbWVkQ3VydmVzID0gW1wiUC0yNTZcIiwgXCJQLTM4NFwiLCBcIlAtNTIxXCIsIFwiSy0yNTZcIl07XHJcbiAgICB9XHJcbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwiaGFzaFwiKTtcclxuICAgICAgICB0aGlzLmNoZWNrSGFzaEFsZ29yaXRobShhbGdvcml0aG0uaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtcyk7XHJcbiAgICB9XHJcbn1cblxuY29uc3QgS0VZX1RZUEVTID0gW1wic2VjcmV0XCIsIFwicHJpdmF0ZVwiLCBcInB1YmxpY1wiXTtcclxuY2xhc3MgQ3J5cHRvS2V5IHtcclxuICAgIHN0YXRpYyBjcmVhdGUoYWxnb3JpdGhtLCB0eXBlLCBleHRyYWN0YWJsZSwgdXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IHRoaXMoKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xyXG4gICAgICAgIGtleS50eXBlID0gdHlwZTtcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0gdXNhZ2VzO1xyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNLZXlUeXBlKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gS0VZX1RZUEVTLmluZGV4T2YoZGF0YSkgIT09IC0xO1xyXG4gICAgfVxyXG4gICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xyXG4gICAgICAgIHJldHVybiBcIkNyeXB0b0tleVwiO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVjZGhQcm92aWRlciBleHRlbmRzIEVsbGlwdGljUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkVDREhcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wiZGVyaXZlQml0c1wiLCBcImRlcml2ZUtleVwiXSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBbXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMubmFtZWRDdXJ2ZXMgPSBbXCJQLTI1NlwiLCBcIlAtMzg0XCIsIFwiUC01MjFcIiwgXCJLLTI1NlwiXTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJwdWJsaWNcIik7XHJcbiAgICAgICAgaWYgKCEoYWxnb3JpdGhtLnB1YmxpYyBpbnN0YW5jZW9mIENyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInB1YmxpYzogSXMgbm90IGEgQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWxnb3JpdGhtLnB1YmxpYy50eXBlICE9PSBcInB1YmxpY1wiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcInB1YmxpYzogSXMgbm90IGEgcHVibGljIGtleVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5wdWJsaWMuYWxnb3JpdGhtLm5hbWUgIT09IHRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoYHB1YmxpYzogSXMgbm90ICR7dGhpcy5uYW1lfSBrZXlgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgRWNkaEVzUHJvdmlkZXIgZXh0ZW5kcyBFY2RoUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkVDREgtRVNcIjtcclxuICAgICAgICB0aGlzLm5hbWVkQ3VydmVzID0gW1wiWDI1NTE5XCIsIFwiWDQ0OFwiXTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBFZERzYVByb3ZpZGVyIGV4dGVuZHMgRWxsaXB0aWNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiRWREU0FcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wic2lnblwiXSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBbXCJ2ZXJpZnlcIl0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm5hbWVkQ3VydmVzID0gW1wiRWQyNTUxOVwiLCBcIkVkNDQ4XCJdO1xyXG4gICAgfVxyXG59XG5cbmxldCBPYmplY3RJZGVudGlmaWVyID0gY2xhc3MgT2JqZWN0SWRlbnRpZmllciB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuT2JqZWN0SWRlbnRpZmllciB9KVxyXG5dLCBPYmplY3RJZGVudGlmaWVyLnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB2b2lkIDApO1xyXG5PYmplY3RJZGVudGlmaWVyID0gX19kZWNvcmF0ZShbXHJcbiAgICBBc25UeXBlKHsgdHlwZTogQXNuVHlwZVR5cGVzLkNob2ljZSB9KVxyXG5dLCBPYmplY3RJZGVudGlmaWVyKTtcblxuY2xhc3MgQWxnb3JpdGhtSWRlbnRpZmllciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHBhcmFtcyk7XHJcbiAgICB9XHJcbn1cclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHtcclxuICAgICAgICB0eXBlOiBBc25Qcm9wVHlwZXMuT2JqZWN0SWRlbnRpZmllcixcclxuICAgIH0pXHJcbl0sIEFsZ29yaXRobUlkZW50aWZpZXIucHJvdG90eXBlLCBcImFsZ29yaXRobVwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3Aoe1xyXG4gICAgICAgIHR5cGU6IEFzblByb3BUeXBlcy5BbnksXHJcbiAgICAgICAgb3B0aW9uYWw6IHRydWUsXHJcbiAgICB9KVxyXG5dLCBBbGdvcml0aG1JZGVudGlmaWVyLnByb3RvdHlwZSwgXCJwYXJhbWV0ZXJzXCIsIHZvaWQgMCk7XG5cbmNsYXNzIFByaXZhdGVLZXlJbmZvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IDA7XHJcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5QWxnb3JpdGhtID0gbmV3IEFsZ29yaXRobUlkZW50aWZpZXIoKTtcclxuICAgICAgICB0aGlzLnByaXZhdGVLZXkgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICB9XHJcbn1cclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIgfSlcclxuXSwgUHJpdmF0ZUtleUluZm8ucHJvdG90eXBlLCBcInZlcnNpb25cIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQWxnb3JpdGhtSWRlbnRpZmllciB9KVxyXG5dLCBQcml2YXRlS2V5SW5mby5wcm90b3R5cGUsIFwicHJpdmF0ZUtleUFsZ29yaXRobVwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuT2N0ZXRTdHJpbmcgfSlcclxuXSwgUHJpdmF0ZUtleUluZm8ucHJvdG90eXBlLCBcInByaXZhdGVLZXlcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkFueSwgb3B0aW9uYWw6IHRydWUgfSlcclxuXSwgUHJpdmF0ZUtleUluZm8ucHJvdG90eXBlLCBcImF0dHJpYnV0ZXNcIiwgdm9pZCAwKTtcblxuY2xhc3MgUHVibGljS2V5SW5mbyB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnB1YmxpY0tleUFsZ29yaXRobSA9IG5ldyBBbGdvcml0aG1JZGVudGlmaWVyKCk7XHJcbiAgICAgICAgdGhpcy5wdWJsaWNLZXkgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICB9XHJcbn1cclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQWxnb3JpdGhtSWRlbnRpZmllciB9KVxyXG5dLCBQdWJsaWNLZXlJbmZvLnByb3RvdHlwZSwgXCJwdWJsaWNLZXlBbGdvcml0aG1cIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkJpdFN0cmluZyB9KVxyXG5dLCBQdWJsaWNLZXlJbmZvLnByb3RvdHlwZSwgXCJwdWJsaWNLZXlcIiwgdm9pZCAwKTtcblxuY29uc3QgSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyID0ge1xyXG4gICAgZnJvbUpTT046ICh2YWx1ZSkgPT4gQ29udmVydC5Gcm9tQmFzZTY0VXJsKHZhbHVlKSxcclxuICAgIHRvSlNPTjogKHZhbHVlKSA9PiBDb252ZXJ0LlRvQmFzZTY0VXJsKG5ldyBVaW50OEFycmF5KHZhbHVlKSksXHJcbn07XG5cbmNvbnN0IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciA9IHtcclxuICAgIGZyb21BU046ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlSGV4ID0gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleDtcclxuICAgICAgICByZXR1cm4gIShuZXcgVWludDhBcnJheSh2YWx1ZUhleClbMF0pXHJcbiAgICAgICAgICAgID8gdmFsdWUudmFsdWVCbG9jay52YWx1ZUhleC5zbGljZSgxKVxyXG4gICAgICAgICAgICA6IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXg7XHJcbiAgICB9LFxyXG4gICAgdG9BU046ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlSGV4ID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpWzBdID4gMTI3XHJcbiAgICAgICAgICAgID8gY29tYmluZShuZXcgVWludDhBcnJheShbMF0pLmJ1ZmZlciwgdmFsdWUpXHJcbiAgICAgICAgICAgIDogdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBhc24xLkludGVnZXIoeyB2YWx1ZUhleCB9KTtcclxuICAgIH0sXHJcbn07XG5cbnZhciBpbmRleCQzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyLFxuICBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlclxufSk7XG5cbmNsYXNzIFJzYVByaXZhdGVLZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gMDtcclxuICAgICAgICB0aGlzLm1vZHVsdXMgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5wdWJsaWNFeHBvbmVudCA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB0aGlzLnByaXZhdGVFeHBvbmVudCA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB0aGlzLnByaW1lMSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB0aGlzLnByaW1lMiA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB0aGlzLmV4cG9uZW50MSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB0aGlzLmV4cG9uZW50MiA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB0aGlzLmNvZWZmaWNpZW50ID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgfVxyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJDb252ZXJ0ZXIgfSlcclxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwidmVyc2lvblwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwiblwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxyXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJtb2R1bHVzXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJlXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXHJcbl0sIFJzYVByaXZhdGVLZXkucHJvdG90eXBlLCBcInB1YmxpY0V4cG9uZW50XCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJkXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXHJcbl0sIFJzYVByaXZhdGVLZXkucHJvdG90eXBlLCBcInByaXZhdGVFeHBvbmVudFwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwicFwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxyXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJwcmltZTFcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyIH0pLFxyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcInFcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcclxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwicHJpbWUyXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJkcFwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxyXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJleHBvbmVudDFcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyIH0pLFxyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImRxXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXHJcbl0sIFJzYVByaXZhdGVLZXkucHJvdG90eXBlLCBcImV4cG9uZW50MlwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwicWlcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcclxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwiY29lZmZpY2llbnRcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkFueSwgb3B0aW9uYWw6IHRydWUgfSlcclxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwib3RoZXJQcmltZUluZm9zXCIsIHZvaWQgMCk7XG5cbmNsYXNzIFJzYVB1YmxpY0tleSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLm1vZHVsdXMgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5wdWJsaWNFeHBvbmVudCA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgIH1cclxufVxyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwiblwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxyXG5dLCBSc2FQdWJsaWNLZXkucHJvdG90eXBlLCBcIm1vZHVsdXNcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyIH0pLFxyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImVcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcclxuXSwgUnNhUHVibGljS2V5LnByb3RvdHlwZSwgXCJwdWJsaWNFeHBvbmVudFwiLCB2b2lkIDApO1xuXG5sZXQgRWNQdWJsaWNLZXkgPSBjbGFzcyBFY1B1YmxpY0tleSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgaWYgKGJ5dGVzWzBdICE9PSAweDA0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBDcnlwdG9FcnJvcihcIldyb25nIEVDUG9pbnQuIEN1cnJlbnQgdmVyc2lvbiBzdXBwb3J0cyBvbmx5IFVuY29tcHJlc3NlZCAoMHgwNCkgcG9pbnRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZS5zbGljZSgxKSk7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGJ5dGVzLmxlbmd0aCAvIDI7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMDtcclxuICAgICAgICBjb25zdCBqc29uID0ge1xyXG4gICAgICAgICAgICB4OiBDb252ZXJ0LlRvQmFzZTY0VXJsKGJ5dGVzLmJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpKSxcclxuICAgICAgICAgICAgeTogQ29udmVydC5Ub0Jhc2U2NFVybChieXRlcy5idWZmZXIuc2xpY2Uob2Zmc2V0ICsgc2l6ZSwgb2Zmc2V0ICsgc2l6ZSArIHNpemUpKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBqc29uO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICghKFwieFwiIGluIGpzb24pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIng6IE1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKFwieVwiIGluIGpzb24pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInk6IE1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHggPSBDb252ZXJ0LkZyb21CYXNlNjRVcmwoanNvbi54KTtcclxuICAgICAgICBjb25zdCB5ID0gQ29udmVydC5Gcm9tQmFzZTY0VXJsKGpzb24ueSk7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb21iaW5lKG5ldyBVaW50OEFycmF5KFsweDA0XSkuYnVmZmVyLCB4LCB5KTtcclxuICAgICAgICB0aGlzLnZhbHVlID0gbmV3IFVpbnQ4QXJyYXkodmFsdWUpLmJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLk9jdGV0U3RyaW5nIH0pXHJcbl0sIEVjUHVibGljS2V5LnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB2b2lkIDApO1xyXG5FY1B1YmxpY0tleSA9IF9fZGVjb3JhdGUoW1xyXG4gICAgQXNuVHlwZSh7IHR5cGU6IEFzblR5cGVUeXBlcy5DaG9pY2UgfSlcclxuXSwgRWNQdWJsaWNLZXkpO1xuXG5jbGFzcyBFY1ByaXZhdGVLZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gMTtcclxuICAgICAgICB0aGlzLnByaXZhdGVLZXkgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICB9XHJcbiAgICBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgaWYgKCEoXCJkXCIgaW4ganNvbikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZDogTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gQ29udmVydC5Gcm9tQmFzZTY0VXJsKGpzb24uZCk7XHJcbiAgICAgICAgaWYgKFwieFwiIGluIGpzb24pIHtcclxuICAgICAgICAgICAgY29uc3QgcHVibGljS2V5ID0gbmV3IEVjUHVibGljS2V5KCk7XHJcbiAgICAgICAgICAgIHB1YmxpY0tleS5mcm9tSlNPTihqc29uKTtcclxuICAgICAgICAgICAgdGhpcy5wdWJsaWNLZXkgPSBBc25TZXJpYWxpemVyLnRvQVNOKHB1YmxpY0tleSkudmFsdWVCbG9jay52YWx1ZUhleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3QgandrID0ge307XHJcbiAgICAgICAgandrLmQgPSBDb252ZXJ0LlRvQmFzZTY0VXJsKHRoaXMucHJpdmF0ZUtleSk7XHJcbiAgICAgICAgaWYgKHRoaXMucHVibGljS2V5KSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oandrLCBuZXcgRWNQdWJsaWNLZXkodGhpcy5wdWJsaWNLZXkpLnRvSlNPTigpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGp3aztcclxuICAgIH1cclxufVxyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQ29udmVydGVyIH0pXHJcbl0sIEVjUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwidmVyc2lvblwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuT2N0ZXRTdHJpbmcgfSlcclxuXSwgRWNQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJwcml2YXRlS2V5XCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IGNvbnRleHQ6IDAsIHR5cGU6IEFzblByb3BUeXBlcy5BbnksIG9wdGlvbmFsOiB0cnVlIH0pXHJcbl0sIEVjUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwicGFyYW1ldGVyc1wiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyBjb250ZXh0OiAxLCB0eXBlOiBBc25Qcm9wVHlwZXMuQml0U3RyaW5nLCBvcHRpb25hbDogdHJ1ZSB9KVxyXG5dLCBFY1ByaXZhdGVLZXkucHJvdG90eXBlLCBcInB1YmxpY0tleVwiLCB2b2lkIDApO1xuXG5jb25zdCBBc25JbnRlZ2VyV2l0aG91dFBhZGRpbmdDb252ZXJ0ZXIgPSB7XHJcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXgpO1xyXG4gICAgICAgIHJldHVybiAoYnl0ZXNbMF0gPT09IDApXHJcbiAgICAgICAgICAgID8gYnl0ZXMuYnVmZmVyLnNsaWNlKDEpXHJcbiAgICAgICAgICAgIDogYnl0ZXMuYnVmZmVyO1xyXG4gICAgfSxcclxuICAgIHRvQVNOOiAodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHZhbHVlKTtcclxuICAgICAgICBpZiAoYnl0ZXNbMF0gPiAxMjcpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBuZXcgVWludDhBcnJheShieXRlcy5sZW5ndGggKyAxKTtcclxuICAgICAgICAgICAgbmV3VmFsdWUuc2V0KGJ5dGVzLCAxKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBhc24xLkludGVnZXIoeyB2YWx1ZUhleDogbmV3VmFsdWUuYnVmZmVyIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IGFzbjEuSW50ZWdlcih7IHZhbHVlSGV4OiB2YWx1ZSB9KTtcclxuICAgIH0sXHJcbn07XG5cbnZhciBpbmRleCQyID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIEFzbkludGVnZXJXaXRob3V0UGFkZGluZ0NvbnZlcnRlcjogQXNuSW50ZWdlcldpdGhvdXRQYWRkaW5nQ29udmVydGVyXG59KTtcblxuY2xhc3MgRWNVdGlscyB7XHJcbiAgICBzdGF0aWMgZGVjb2RlUG9pbnQoZGF0YSwgcG9pbnRTaXplKSB7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoZGF0YSk7XHJcbiAgICAgICAgaWYgKCh2aWV3Lmxlbmd0aCA9PT0gMCkgfHwgKHZpZXdbMF0gIT09IDQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9ubHkgdW5jb21wcmVzc2VkIHBvaW50IGZvcm1hdCBzdXBwb3J0ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG4gPSAodmlldy5sZW5ndGggLSAxKSAvIDI7XHJcbiAgICAgICAgaWYgKG4gIT09IChNYXRoLmNlaWwocG9pbnRTaXplIC8gOCkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBvaW50IGRvZXMgbm90IG1hdGNoIGZpZWxkIHNpemVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHhiID0gdmlldy5zbGljZSgxLCBuICsgMSk7XHJcbiAgICAgICAgY29uc3QgeWIgPSB2aWV3LnNsaWNlKG4gKyAxLCBuICsgMSArIG4pO1xyXG4gICAgICAgIHJldHVybiB7IHg6IHhiLCB5OiB5YiB9O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGVuY29kZVBvaW50KHBvaW50LCBwb2ludFNpemUpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gTWF0aC5jZWlsKHBvaW50U2l6ZSAvIDgpO1xyXG4gICAgICAgIGlmIChwb2ludC54LmJ5dGVMZW5ndGggIT09IHNpemUgfHwgcG9pbnQueS5ieXRlTGVuZ3RoICE9PSBzaXplKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlgsWSBjb29yZGluYXRlcyBkb24ndCBtYXRjaCBwb2ludCBzaXplIGNyaXRlcmlhXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB4ID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShwb2ludC54KTtcclxuICAgICAgICBjb25zdCB5ID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShwb2ludC55KTtcclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShzaXplICogMiArIDEpO1xyXG4gICAgICAgIHJlc1swXSA9IDQ7XHJcbiAgICAgICAgcmVzLnNldCh4LCAxKTtcclxuICAgICAgICByZXMuc2V0KHksIHNpemUgKyAxKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGdldFNpemUocG9pbnRTaXplKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChwb2ludFNpemUgLyA4KTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBlbmNvZGVTaWduYXR1cmUoc2lnbmF0dXJlLCBwb2ludFNpemUpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5nZXRTaXplKHBvaW50U2l6ZSk7XHJcbiAgICAgICAgY29uc3QgciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoc2lnbmF0dXJlLnIpO1xyXG4gICAgICAgIGNvbnN0IHMgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHNpZ25hdHVyZS5zKTtcclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShzaXplICogMik7XHJcbiAgICAgICAgcmVzLnNldCh0aGlzLnBhZFN0YXJ0KHIsIHNpemUpKTtcclxuICAgICAgICByZXMuc2V0KHRoaXMucGFkU3RhcnQocywgc2l6ZSksIHNpemUpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZGVjb2RlU2lnbmF0dXJlKGRhdGEsIHBvaW50U2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLmdldFNpemUocG9pbnRTaXplKTtcclxuICAgICAgICBjb25zdCB2aWV3ID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShkYXRhKTtcclxuICAgICAgICBpZiAodmlldy5sZW5ndGggIT09IChzaXplICogMikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jb3JyZWN0IHNpemUgb2YgdGhlIHNpZ25hdHVyZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgciA9IHZpZXcuc2xpY2UoMCwgc2l6ZSk7XHJcbiAgICAgICAgY29uc3QgcyA9IHZpZXcuc2xpY2Uoc2l6ZSk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcjogdGhpcy50cmltU3RhcnQociksXHJcbiAgICAgICAgICAgIHM6IHRoaXMudHJpbVN0YXJ0KHMpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgdHJpbVN0YXJ0KGRhdGEpIHtcclxuICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgd2hpbGUgKChpIDwgZGF0YS5sZW5ndGggLSAxKSAmJiAoZGF0YVtpXSA9PT0gMCkpIHtcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaSA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRhdGEuc2xpY2UoaSwgZGF0YS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHBhZFN0YXJ0KGRhdGEsIHNpemUpIHtcclxuICAgICAgICBpZiAoc2l6ZSA9PT0gZGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xyXG4gICAgICAgIHJlcy5zZXQoZGF0YSwgc2l6ZSAtIGRhdGEubGVuZ3RoKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVjRHNhU2lnbmF0dXJlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB0aGlzLnMgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZnJvbVdlYkNyeXB0b1NpZ25hdHVyZSh2YWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHBvaW50U2l6ZSA9IHZhbHVlLmJ5dGVMZW5ndGggLyAyO1xyXG4gICAgICAgIGNvbnN0IHBvaW50ID0gRWNVdGlscy5kZWNvZGVTaWduYXR1cmUodmFsdWUsIHBvaW50U2l6ZSAqIDgpO1xyXG4gICAgICAgIGNvbnN0IGVjU2lnbmF0dXJlID0gbmV3IEVjRHNhU2lnbmF0dXJlKCk7XHJcbiAgICAgICAgZWNTaWduYXR1cmUuciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHBvaW50LnIpO1xyXG4gICAgICAgIGVjU2lnbmF0dXJlLnMgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihwb2ludC5zKTtcclxuICAgICAgICByZXR1cm4gZWNTaWduYXR1cmU7XHJcbiAgICB9XHJcbiAgICB0b1dlYkNyeXB0b1NpZ25hdHVyZShwb2ludFNpemUpIHtcclxuICAgICAgICBwb2ludFNpemUgIT09IG51bGwgJiYgcG9pbnRTaXplICE9PSB2b2lkIDAgPyBwb2ludFNpemUgOiAocG9pbnRTaXplID0gTWF0aC5tYXgodGhpcy5yLmJ5dGVMZW5ndGgsIHRoaXMucy5ieXRlTGVuZ3RoKSAqIDgpO1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IEVjVXRpbHMuZW5jb2RlU2lnbmF0dXJlKHRoaXMsIHBvaW50U2l6ZSk7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25hdHVyZS5idWZmZXI7XHJcbiAgICB9XHJcbn1cclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlcldpdGhvdXRQYWRkaW5nQ29udmVydGVyIH0pXHJcbl0sIEVjRHNhU2lnbmF0dXJlLnByb3RvdHlwZSwgXCJyXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJXaXRob3V0UGFkZGluZ0NvbnZlcnRlciB9KVxyXG5dLCBFY0RzYVNpZ25hdHVyZS5wcm90b3R5cGUsIFwic1wiLCB2b2lkIDApO1xuXG5jbGFzcyBPbmVBc3ltbWV0cmljS2V5IGV4dGVuZHMgUHJpdmF0ZUtleUluZm8ge1xyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IGNvbnRleHQ6IDEsIGltcGxpY2l0OiB0cnVlLCB0eXBlOiBBc25Qcm9wVHlwZXMuQml0U3RyaW5nLCBvcHRpb25hbDogdHJ1ZSB9KVxyXG5dLCBPbmVBc3ltbWV0cmljS2V5LnByb3RvdHlwZSwgXCJwdWJsaWNLZXlcIiwgdm9pZCAwKTtcblxubGV0IEVkUHJpdmF0ZUtleSA9IGNsYXNzIEVkUHJpdmF0ZUtleSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICghanNvbi5kKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImQ6IE1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWUgPSBDb252ZXJ0LkZyb21CYXNlNjRVcmwoanNvbi5kKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBqd2sgPSB7XHJcbiAgICAgICAgICAgIGQ6IENvbnZlcnQuVG9CYXNlNjRVcmwodGhpcy52YWx1ZSksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gandrO1xyXG4gICAgfVxyXG59O1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuT2N0ZXRTdHJpbmcgfSlcclxuXSwgRWRQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB2b2lkIDApO1xyXG5FZFByaXZhdGVLZXkgPSBfX2RlY29yYXRlKFtcclxuICAgIEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuQ2hvaWNlIH0pXHJcbl0sIEVkUHJpdmF0ZUtleSk7XG5cbmxldCBFZFB1YmxpY0tleSA9IGNsYXNzIEVkUHVibGljS2V5IHtcclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBqc29uID0ge1xyXG4gICAgICAgICAgICB4OiBDb252ZXJ0LlRvQmFzZTY0VXJsKHRoaXMudmFsdWUpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICB9XHJcbiAgICBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgaWYgKCEoXCJ4XCIgaW4ganNvbikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwieDogTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IENvbnZlcnQuRnJvbUJhc2U2NFVybChqc29uLngpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59O1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuQml0U3RyaW5nIH0pXHJcbl0sIEVkUHVibGljS2V5LnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB2b2lkIDApO1xyXG5FZFB1YmxpY0tleSA9IF9fZGVjb3JhdGUoW1xyXG4gICAgQXNuVHlwZSh7IHR5cGU6IEFzblR5cGVUeXBlcy5DaG9pY2UgfSlcclxuXSwgRWRQdWJsaWNLZXkpO1xuXG5sZXQgQ3VydmVQcml2YXRlS2V5ID0gY2xhc3MgQ3VydmVQcml2YXRlS2V5IHtcclxufTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLk9jdGV0U3RyaW5nIH0pLFxyXG4gICAgSnNvblByb3AoeyB0eXBlOiBKc29uUHJvcFR5cGVzLlN0cmluZywgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcclxuXSwgQ3VydmVQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJkXCIsIHZvaWQgMCk7XHJcbkN1cnZlUHJpdmF0ZUtleSA9IF9fZGVjb3JhdGUoW1xyXG4gICAgQXNuVHlwZSh7IHR5cGU6IEFzblR5cGVUeXBlcy5DaG9pY2UgfSlcclxuXSwgQ3VydmVQcml2YXRlS2V5KTtcblxuY29uc3QgaWRTZWNwMjU2cjEgPSBcIjEuMi44NDAuMTAwNDUuMy4xLjdcIjtcclxuY29uc3QgaWRFbGxpcHRpY0N1cnZlID0gXCIxLjMuMTMyLjBcIjtcclxuY29uc3QgaWRTZWNwMzg0cjEgPSBgJHtpZEVsbGlwdGljQ3VydmV9LjM0YDtcclxuY29uc3QgaWRTZWNwNTIxcjEgPSBgJHtpZEVsbGlwdGljQ3VydmV9LjM1YDtcclxuY29uc3QgaWRTZWNwMjU2azEgPSBgJHtpZEVsbGlwdGljQ3VydmV9LjEwYDtcclxuY29uc3QgaWRWZXJzaW9uT25lID0gXCIxLjMuMzYuMy4zLjIuOC4xLjFcIjtcclxuY29uc3QgaWRCcmFpbnBvb2xQMTYwcjEgPSBgJHtpZFZlcnNpb25PbmV9LjFgO1xyXG5jb25zdCBpZEJyYWlucG9vbFAxNjB0MSA9IGAke2lkVmVyc2lvbk9uZX0uMmA7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDE5MnIxID0gYCR7aWRWZXJzaW9uT25lfS4zYDtcclxuY29uc3QgaWRCcmFpbnBvb2xQMTkydDEgPSBgJHtpZFZlcnNpb25PbmV9LjRgO1xyXG5jb25zdCBpZEJyYWlucG9vbFAyMjRyMSA9IGAke2lkVmVyc2lvbk9uZX0uNWA7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDIyNHQxID0gYCR7aWRWZXJzaW9uT25lfS42YDtcclxuY29uc3QgaWRCcmFpbnBvb2xQMjU2cjEgPSBgJHtpZFZlcnNpb25PbmV9LjdgO1xyXG5jb25zdCBpZEJyYWlucG9vbFAyNTZ0MSA9IGAke2lkVmVyc2lvbk9uZX0uOGA7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDMyMHIxID0gYCR7aWRWZXJzaW9uT25lfS45YDtcclxuY29uc3QgaWRCcmFpbnBvb2xQMzIwdDEgPSBgJHtpZFZlcnNpb25PbmV9LjEwYDtcclxuY29uc3QgaWRCcmFpbnBvb2xQMzg0cjEgPSBgJHtpZFZlcnNpb25PbmV9LjExYDtcclxuY29uc3QgaWRCcmFpbnBvb2xQMzg0dDEgPSBgJHtpZFZlcnNpb25PbmV9LjEyYDtcclxuY29uc3QgaWRCcmFpbnBvb2xQNTEycjEgPSBgJHtpZFZlcnNpb25PbmV9LjEzYDtcclxuY29uc3QgaWRCcmFpbnBvb2xQNTEydDEgPSBgJHtpZFZlcnNpb25PbmV9LjE0YDtcclxuY29uc3QgaWRYMjU1MTkgPSBcIjEuMy4xMDEuMTEwXCI7XHJcbmNvbnN0IGlkWDQ0OCA9IFwiMS4zLjEwMS4xMTFcIjtcclxuY29uc3QgaWRFZDI1NTE5ID0gXCIxLjMuMTAxLjExMlwiO1xyXG5jb25zdCBpZEVkNDQ4ID0gXCIxLjMuMTAxLjExM1wiO1xuXG52YXIgaW5kZXgkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBjb252ZXJ0ZXJzOiBpbmRleCQyLFxuICBnZXQgT2JqZWN0SWRlbnRpZmllciAoKSB7IHJldHVybiBPYmplY3RJZGVudGlmaWVyOyB9LFxuICBBbGdvcml0aG1JZGVudGlmaWVyOiBBbGdvcml0aG1JZGVudGlmaWVyLFxuICBQcml2YXRlS2V5SW5mbzogUHJpdmF0ZUtleUluZm8sXG4gIFB1YmxpY0tleUluZm86IFB1YmxpY0tleUluZm8sXG4gIFJzYVByaXZhdGVLZXk6IFJzYVByaXZhdGVLZXksXG4gIFJzYVB1YmxpY0tleTogUnNhUHVibGljS2V5LFxuICBFY1ByaXZhdGVLZXk6IEVjUHJpdmF0ZUtleSxcbiAgZ2V0IEVjUHVibGljS2V5ICgpIHsgcmV0dXJuIEVjUHVibGljS2V5OyB9LFxuICBFY0RzYVNpZ25hdHVyZTogRWNEc2FTaWduYXR1cmUsXG4gIE9uZUFzeW1tZXRyaWNLZXk6IE9uZUFzeW1tZXRyaWNLZXksXG4gIGdldCBFZFByaXZhdGVLZXkgKCkgeyByZXR1cm4gRWRQcml2YXRlS2V5OyB9LFxuICBnZXQgRWRQdWJsaWNLZXkgKCkgeyByZXR1cm4gRWRQdWJsaWNLZXk7IH0sXG4gIGdldCBDdXJ2ZVByaXZhdGVLZXkgKCkgeyByZXR1cm4gQ3VydmVQcml2YXRlS2V5OyB9LFxuICBpZFNlY3AyNTZyMTogaWRTZWNwMjU2cjEsXG4gIGlkRWxsaXB0aWNDdXJ2ZTogaWRFbGxpcHRpY0N1cnZlLFxuICBpZFNlY3AzODRyMTogaWRTZWNwMzg0cjEsXG4gIGlkU2VjcDUyMXIxOiBpZFNlY3A1MjFyMSxcbiAgaWRTZWNwMjU2azE6IGlkU2VjcDI1NmsxLFxuICBpZFZlcnNpb25PbmU6IGlkVmVyc2lvbk9uZSxcbiAgaWRCcmFpbnBvb2xQMTYwcjE6IGlkQnJhaW5wb29sUDE2MHIxLFxuICBpZEJyYWlucG9vbFAxNjB0MTogaWRCcmFpbnBvb2xQMTYwdDEsXG4gIGlkQnJhaW5wb29sUDE5MnIxOiBpZEJyYWlucG9vbFAxOTJyMSxcbiAgaWRCcmFpbnBvb2xQMTkydDE6IGlkQnJhaW5wb29sUDE5MnQxLFxuICBpZEJyYWlucG9vbFAyMjRyMTogaWRCcmFpbnBvb2xQMjI0cjEsXG4gIGlkQnJhaW5wb29sUDIyNHQxOiBpZEJyYWlucG9vbFAyMjR0MSxcbiAgaWRCcmFpbnBvb2xQMjU2cjE6IGlkQnJhaW5wb29sUDI1NnIxLFxuICBpZEJyYWlucG9vbFAyNTZ0MTogaWRCcmFpbnBvb2xQMjU2dDEsXG4gIGlkQnJhaW5wb29sUDMyMHIxOiBpZEJyYWlucG9vbFAzMjByMSxcbiAgaWRCcmFpbnBvb2xQMzIwdDE6IGlkQnJhaW5wb29sUDMyMHQxLFxuICBpZEJyYWlucG9vbFAzODRyMTogaWRCcmFpbnBvb2xQMzg0cjEsXG4gIGlkQnJhaW5wb29sUDM4NHQxOiBpZEJyYWlucG9vbFAzODR0MSxcbiAgaWRCcmFpbnBvb2xQNTEycjE6IGlkQnJhaW5wb29sUDUxMnIxLFxuICBpZEJyYWlucG9vbFA1MTJ0MTogaWRCcmFpbnBvb2xQNTEydDEsXG4gIGlkWDI1NTE5OiBpZFgyNTUxOSxcbiAgaWRYNDQ4OiBpZFg0NDgsXG4gIGlkRWQyNTUxOTogaWRFZDI1NTE5LFxuICBpZEVkNDQ4OiBpZEVkNDQ4XG59KTtcblxuY2xhc3MgRWNDdXJ2ZXMge1xyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuICAgIHN0YXRpYyByZWdpc3RlcihpdGVtKSB7XHJcbiAgICAgICAgY29uc3Qgb2lkID0gbmV3IE9iamVjdElkZW50aWZpZXIoKTtcclxuICAgICAgICBvaWQudmFsdWUgPSBpdGVtLmlkO1xyXG4gICAgICAgIGNvbnN0IHJhdyA9IEFzbkNvbnZlcnQuc2VyaWFsaXplKG9pZCk7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgcmF3LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubmFtZXMucHVzaChpdGVtLm5hbWUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZpbmQobmFtZU9ySWQpIHtcclxuICAgICAgICBuYW1lT3JJZCA9IG5hbWVPcklkLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lT3JJZCB8fCBpdGVtLmlkLnRvVXBwZXJDYXNlKCkgPT09IG5hbWVPcklkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHN0YXRpYyBnZXQobmFtZU9ySWQpIHtcclxuICAgICAgICBjb25zdCByZXMgPSB0aGlzLmZpbmQobmFtZU9ySWQpO1xyXG4gICAgICAgIGlmICghcmVzKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgRUMgbmFtZWQgY3VydmUgJyR7bmFtZU9ySWR9J2ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG59XHJcbkVjQ3VydmVzLml0ZW1zID0gW107XHJcbkVjQ3VydmVzLm5hbWVzID0gW107XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJQLTI1NlwiLCBpZDogaWRTZWNwMjU2cjEsIHNpemU6IDI1NiB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcIlAtMzg0XCIsIGlkOiBpZFNlY3AzODRyMSwgc2l6ZTogMzg0IH0pO1xyXG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiUC01MjFcIiwgaWQ6IGlkU2VjcDUyMXIxLCBzaXplOiA1MjEgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJLLTI1NlwiLCBpZDogaWRTZWNwMjU2azEsIHNpemU6IDI1NiB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAxNjByMVwiLCBpZDogaWRCcmFpbnBvb2xQMTYwcjEsIHNpemU6IDE2MCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAxNjB0MVwiLCBpZDogaWRCcmFpbnBvb2xQMTYwdDEsIHNpemU6IDE2MCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAxOTJyMVwiLCBpZDogaWRCcmFpbnBvb2xQMTkycjEsIHNpemU6IDE5MiB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAxOTJ0MVwiLCBpZDogaWRCcmFpbnBvb2xQMTkydDEsIHNpemU6IDE5MiB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAyMjRyMVwiLCBpZDogaWRCcmFpbnBvb2xQMjI0cjEsIHNpemU6IDIyNCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAyMjR0MVwiLCBpZDogaWRCcmFpbnBvb2xQMjI0dDEsIHNpemU6IDIyNCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAyNTZyMVwiLCBpZDogaWRCcmFpbnBvb2xQMjU2cjEsIHNpemU6IDI1NiB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAyNTZ0MVwiLCBpZDogaWRCcmFpbnBvb2xQMjU2dDEsIHNpemU6IDI1NiB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAzMjByMVwiLCBpZDogaWRCcmFpbnBvb2xQMzIwcjEsIHNpemU6IDMyMCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAzMjB0MVwiLCBpZDogaWRCcmFpbnBvb2xQMzIwdDEsIHNpemU6IDMyMCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAzODRyMVwiLCBpZDogaWRCcmFpbnBvb2xQMzg0cjEsIHNpemU6IDM4NCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFAzODR0MVwiLCBpZDogaWRCcmFpbnBvb2xQMzg0dDEsIHNpemU6IDM4NCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFA1MTJyMVwiLCBpZDogaWRCcmFpbnBvb2xQNTEycjEsIHNpemU6IDUxMiB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcImJyYWlucG9vbFA1MTJ0MVwiLCBpZDogaWRCcmFpbnBvb2xQNTEydDEsIHNpemU6IDUxMiB9KTtcblxuY2xhc3MgSG1hY1Byb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkhNQUNcIjtcclxuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1wiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIl07XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXCJzaWduXCIsIFwidmVyaWZ5XCJdO1xyXG4gICAgfVxyXG4gICAgZ2V0RGVmYXVsdExlbmd0aChhbGdOYW1lKSB7XHJcbiAgICAgICAgc3dpdGNoIChhbGdOYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQS0xXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMjU2XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMzg0XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtNTEyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gNTEyO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFsZ29yaXRobSBuYW1lICcke2FsZ05hbWV9J2ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XHJcbiAgICAgICAgdGhpcy5jaGVja0hhc2hBbGdvcml0aG0oYWxnb3JpdGhtLmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobXMpO1xyXG4gICAgICAgIGlmIChcImxlbmd0aFwiIGluIGFsZ29yaXRobSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBhIE51bWJlclwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYWxnb3JpdGhtLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwibGVuZ3RoOiBOdW1iZXIgaXMgb3V0IG9mIHJhbmdlXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2hlY2tJbXBvcnRQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XHJcbiAgICAgICAgdGhpcy5jaGVja0hhc2hBbGdvcml0aG0oYWxnb3JpdGhtLmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobXMpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFBia2RmMlByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIlBCS0RGMlwiO1xyXG4gICAgICAgIHRoaXMuaGFzaEFsZ29yaXRobXMgPSBbXCJTSEEtMVwiLCBcIlNIQS0yNTZcIiwgXCJTSEEtMzg0XCIsIFwiU0hBLTUxMlwiXTtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcImRlcml2ZUJpdHNcIiwgXCJkZXJpdmVLZXlcIl07XHJcbiAgICB9XHJcbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwiaGFzaFwiKTtcclxuICAgICAgICB0aGlzLmNoZWNrSGFzaEFsZ29yaXRobShhbGdvcml0aG0uaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtcyk7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcInNhbHRcIik7XHJcbiAgICAgICAgaWYgKCEoYWxnb3JpdGhtLnNhbHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYWxnb3JpdGhtLnNhbHQpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwic2FsdDogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcIml0ZXJhdGlvbnNcIik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0uaXRlcmF0aW9ucyAhPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXRlcmF0aW9uczogSXMgbm90IGEgTnVtYmVyXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWxnb3JpdGhtLml0ZXJhdGlvbnMgPCAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRpb25zOiBJcyBsZXNzIHRoYW4gMVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0ltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4uYXJncykge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICBpZiAoZXh0cmFjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiZXh0cmFjdGFibGU6IE11c3QgYmUgJ2ZhbHNlJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgSGtkZlByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkhLREZcIjtcclxuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1wiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIl07XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXCJkZXJpdmVLZXlcIiwgXCJkZXJpdmVCaXRzXCJdO1xyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XHJcbiAgICAgICAgdGhpcy5jaGVja0hhc2hBbGdvcml0aG0oYWxnb3JpdGhtLmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobXMpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJzYWx0XCIpO1xyXG4gICAgICAgIGlmICghQnVmZmVyU291cmNlQ29udmVydGVyLmlzQnVmZmVyU291cmNlKGFsZ29yaXRobS5zYWx0KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwic2FsdDogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImluZm9cIik7XHJcbiAgICAgICAgaWYgKCFCdWZmZXJTb3VyY2VDb252ZXJ0ZXIuaXNCdWZmZXJTb3VyY2UoYWxnb3JpdGhtLmluZm8pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJzYWx0OiBJcyBub3Qgb2YgdHlwZSAnKEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyknXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tJbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIGlmIChleHRyYWN0YWJsZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJleHRyYWN0YWJsZTogTXVzdCBiZSAnZmFsc2UnXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGFrZVByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdExlbmd0aCA9IDA7XHJcbiAgICB9XHJcbiAgICBkaWdlc3QoLi4uYXJncykge1xyXG4gICAgICAgIGFyZ3NbMF0gPSB7IGxlbmd0aDogdGhpcy5kZWZhdWx0TGVuZ3RoLCAuLi5hcmdzWzBdIH07XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmRpZ2VzdC5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGNoZWNrRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrRGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gYWxnb3JpdGhtLmxlbmd0aCB8fCAwO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBhIE51bWJlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlbmd0aCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxlbmd0aDogSXMgbmVnYXRpdmVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYWtlMTI4UHJvdmlkZXIgZXh0ZW5kcyBTaGFrZVByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJzaGFrZTEyOFwiO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdExlbmd0aCA9IDE2O1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYWtlMjU2UHJvdmlkZXIgZXh0ZW5kcyBTaGFrZVByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJzaGFrZTI1NlwiO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdExlbmd0aCA9IDMyO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIENyeXB0byB7XHJcbiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiQ3J5cHRvXCI7XHJcbiAgICB9XHJcbiAgICByYW5kb21VVUlEKCkge1xyXG4gICAgICAgIGNvbnN0IGIgPSB0aGlzLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpO1xyXG4gICAgICAgIGJbNl0gPSAoYls2XSAmIDB4MGYpIHwgMHg0MDtcclxuICAgICAgICBiWzhdID0gKGJbOF0gJiAweDNmKSB8IDB4ODA7XHJcbiAgICAgICAgY29uc3QgdXVpZCA9IENvbnZlcnQuVG9IZXgoYikudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICByZXR1cm4gYCR7dXVpZC5zdWJzdHJpbmcoMCwgOCl9LSR7dXVpZC5zdWJzdHJpbmcoOCwgMTIpfS0ke3V1aWQuc3Vic3RyaW5nKDEyLCAxNil9LSR7dXVpZC5zdWJzdHJpbmcoMTYpfWA7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUHJvdmlkZXJTdG9yYWdlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuaXRlbXMgPSB7fTtcclxuICAgIH1cclxuICAgIGdldChhbGdvcml0aG1OYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNbYWxnb3JpdGhtTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBudWxsO1xyXG4gICAgfVxyXG4gICAgc2V0KHByb3ZpZGVyKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtc1twcm92aWRlci5uYW1lLnRvTG93ZXJDYXNlKCldID0gcHJvdmlkZXI7XHJcbiAgICB9XHJcbiAgICByZW1vdmVBdChhbGdvcml0aG1OYW1lKSB7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldChhbGdvcml0aG1OYW1lLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmIChwcm92aWRlcikge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5pdGVtc1thbGdvcml0aG1OYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xyXG4gICAgfVxyXG4gICAgaGFzKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLmdldChuYW1lKTtcclxuICAgIH1cclxuICAgIGdldCBsZW5ndGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaXRlbXMpLmxlbmd0aDtcclxuICAgIH1cclxuICAgIGdldCBhbGdvcml0aG1zKCkge1xyXG4gICAgICAgIGNvbnN0IGFsZ29yaXRobXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5pdGVtc1trZXldO1xyXG4gICAgICAgICAgICBhbGdvcml0aG1zLnB1c2gocHJvdmlkZXIubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhbGdvcml0aG1zLnNvcnQoKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBTdWJ0bGVDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBuZXcgUHJvdmlkZXJTdG9yYWdlKCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNIYXNoZWRBbGdvcml0aG0oZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBkYXRhXHJcbiAgICAgICAgICAgICYmIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiXHJcbiAgICAgICAgICAgICYmIFwibmFtZVwiIGluIGRhdGFcclxuICAgICAgICAgICAgJiYgXCJoYXNoXCIgaW4gZGF0YVxyXG4gICAgICAgICAgICA/IHRydWVcclxuICAgICAgICAgICAgOiBmYWxzZTtcclxuICAgIH1cclxuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcclxuICAgICAgICByZXR1cm4gXCJTdWJ0bGVDcnlwdG9cIjtcclxuICAgIH1cclxuICAgIGFzeW5jIGRpZ2VzdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDIsIFwiZGlnZXN0XCIpO1xyXG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGRhdGEsIC4uLnBhcmFtc10gPSBhcmdzO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWREYXRhID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoZGF0YSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLmRpZ2VzdChwcmVwYXJlZEFsZ29yaXRobSwgcHJlcGFyZWREYXRhLCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZW5lcmF0ZUtleSguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDMsIFwiZ2VuZXJhdGVLZXlcIik7XHJcbiAgICAgICAgY29uc3QgW2FsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4ucGFyYW1zXSA9IGFyZ3M7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWRBbGdvcml0aG0gPSB0aGlzLnByZXBhcmVBbGdvcml0aG0oYWxnb3JpdGhtKTtcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIuZ2VuZXJhdGVLZXkoeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBzaWduKC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMywgXCJzaWduXCIpO1xyXG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGtleSwgZGF0YSwgLi4ucGFyYW1zXSA9IGFyZ3M7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWREYXRhID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoZGF0YSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLnNpZ24oeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBrZXksIHByZXBhcmVkRGF0YSwgLi4ucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdmVyaWZ5KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgNCwgXCJ2ZXJpZnlcIik7XHJcbiAgICAgICAgY29uc3QgW2FsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEsIC4uLnBhcmFtc10gPSBhcmdzO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGRhdGEpO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkU2lnbmF0dXJlID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoc2lnbmF0dXJlKTtcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIudmVyaWZ5KHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwga2V5LCBwcmVwYXJlZFNpZ25hdHVyZSwgcHJlcGFyZWREYXRhLCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBlbmNyeXB0KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMywgXCJlbmNyeXB0XCIpO1xyXG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGtleSwgZGF0YSwgLi4ucGFyYW1zXSA9IGFyZ3M7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWREYXRhID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoZGF0YSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLmVuY3J5cHQoeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBrZXksIHByZXBhcmVkRGF0YSwgeyBrZXlVc2FnZTogdHJ1ZSB9LCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBkZWNyeXB0KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMywgXCJkZWNyeXB0XCIpO1xyXG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGtleSwgZGF0YSwgLi4ucGFyYW1zXSA9IGFyZ3M7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWREYXRhID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoZGF0YSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLmRlY3J5cHQoeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBrZXksIHByZXBhcmVkRGF0YSwgeyBrZXlVc2FnZTogdHJ1ZSB9LCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBkZXJpdmVCaXRzKC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMywgXCJkZXJpdmVCaXRzXCIpO1xyXG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCwgLi4ucGFyYW1zXSA9IGFyZ3M7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShiYXNlS2V5KTtcclxuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5kZXJpdmVCaXRzKHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwgYmFzZUtleSwgbGVuZ3RoLCB7IGtleVVzYWdlOiB0cnVlIH0sIC4uLnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIGFzeW5jIGRlcml2ZUtleSguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDUsIFwiZGVyaXZlS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGJhc2VLZXksIGRlcml2ZWRLZXlUeXBlLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXNdID0gYXJncztcclxuICAgICAgICBjb25zdCBwcmVwYXJlZERlcml2ZWRLZXlUeXBlID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGRlcml2ZWRLZXlUeXBlKTtcclxuICAgICAgICBjb25zdCBpbXBvcnRQcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWREZXJpdmVkS2V5VHlwZS5uYW1lKTtcclxuICAgICAgICBpbXBvcnRQcm92aWRlci5jaGVja0Rlcml2ZWRLZXlQYXJhbXMocHJlcGFyZWREZXJpdmVkS2V5VHlwZSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWRBbGdvcml0aG0gPSB0aGlzLnByZXBhcmVBbGdvcml0aG0oYWxnb3JpdGhtKTtcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XHJcbiAgICAgICAgcHJvdmlkZXIuY2hlY2tDcnlwdG9LZXkoYmFzZUtleSwgXCJkZXJpdmVLZXlcIik7XHJcbiAgICAgICAgY29uc3QgZGVyaXZlZEJpdHMgPSBhd2FpdCBwcm92aWRlci5kZXJpdmVCaXRzKHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwgYmFzZUtleSwgZGVyaXZlZEtleVR5cGUubGVuZ3RoIHx8IDUxMiwgeyBrZXlVc2FnZTogZmFsc2UgfSwgLi4ucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRLZXkoXCJyYXdcIiwgZGVyaXZlZEJpdHMsIGRlcml2ZWRLZXlUeXBlLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXMpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZXhwb3J0S2V5KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgMiwgXCJleHBvcnRLZXlcIik7XHJcbiAgICAgICAgY29uc3QgW2Zvcm1hdCwga2V5LCAuLi5wYXJhbXNdID0gYXJncztcclxuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKGtleS5hbGdvcml0aG0ubmFtZSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIuZXhwb3J0S2V5KGZvcm1hdCwga2V5LCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBpbXBvcnRLZXkoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZEFyZ3VtZW50cyhhcmdzLCA1LCBcImltcG9ydEtleVwiKTtcclxuICAgICAgICBjb25zdCBbZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLnBhcmFtc10gPSBhcmdzO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGlmIChbXCJwa2NzOFwiLCBcInNwa2lcIiwgXCJyYXdcIl0uaW5kZXhPZihmb3JtYXQpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBwcmVwYXJlZERhdGEgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihrZXlEYXRhKTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmltcG9ydEtleShmb3JtYXQsIHByZXBhcmVkRGF0YSwgeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFrZXlEYXRhLmt0eSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleURhdGE6IElzIG5vdCBKU09OXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm92aWRlci5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLnByZXBhcmVkQWxnb3JpdGhtLCBuYW1lOiBwcm92aWRlci5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLnBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBhc3luYyB3cmFwS2V5KGZvcm1hdCwga2V5LCB3cmFwcGluZ0tleSwgd3JhcEFsZ29yaXRobSwgLi4uYXJncykge1xyXG4gICAgICAgIGxldCBrZXlEYXRhID0gYXdhaXQgdGhpcy5leHBvcnRLZXkoZm9ybWF0LCBrZXksIC4uLmFyZ3MpO1xyXG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiandrXCIpIHtcclxuICAgICAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGtleURhdGEpO1xyXG4gICAgICAgICAgICBrZXlEYXRhID0gQ29udmVydC5Gcm9tVXRmOFN0cmluZyhqc29uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWRBbGdvcml0aG0gPSB0aGlzLnByZXBhcmVBbGdvcml0aG0od3JhcEFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWREYXRhID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoa2V5RGF0YSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIHJldHVybiBwcm92aWRlci5lbmNyeXB0KHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwgd3JhcHBpbmdLZXksIHByZXBhcmVkRGF0YSwgeyBrZXlVc2FnZTogZmFsc2UgfSwgLi4uYXJncyk7XHJcbiAgICB9XHJcbiAgICBhc3luYyB1bndyYXBLZXkoZm9ybWF0LCB3cmFwcGVkS2V5LCB1bndyYXBwaW5nS2V5LCB1bndyYXBBbGdvcml0aG0sIHVud3JhcHBlZEtleUFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4uYXJncykge1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKHVud3JhcEFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWREYXRhID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIod3JhcHBlZEtleSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGxldCBrZXlEYXRhID0gYXdhaXQgcHJvdmlkZXIuZGVjcnlwdCh7IC4uLnByZXBhcmVkQWxnb3JpdGhtLCBuYW1lOiBwcm92aWRlci5uYW1lIH0sIHVud3JhcHBpbmdLZXksIHByZXBhcmVkRGF0YSwgeyBrZXlVc2FnZTogZmFsc2UgfSwgLi4uYXJncyk7XHJcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJqd2tcIikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAga2V5RGF0YSA9IEpTT04ucGFyc2UoQ29udmVydC5Ub1V0ZjhTdHJpbmcoa2V5RGF0YSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoXCJ3cmFwcGVkS2V5OiBJcyBub3QgYSBKU09OXCIpO1xyXG4gICAgICAgICAgICAgICAgZXJyb3IuaW50ZXJuYWwgPSBlO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgdW53cmFwcGVkS2V5QWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIGNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgc2l6ZSwgbWV0aG9kTmFtZSkge1xyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IHNpemUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgJyR7bWV0aG9kTmFtZX0nIG9uICdTdWJ0bGVDcnlwdG8nOiAke3NpemV9IGFyZ3VtZW50cyByZXF1aXJlZCwgYnV0IG9ubHkgJHthcmdzLmxlbmd0aH0gcHJlc2VudGApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByZXBhcmVBbGdvcml0aG0oYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0gPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGFsZ29yaXRobSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFN1YnRsZUNyeXB0by5pc0hhc2hlZEFsZ29yaXRobShhbGdvcml0aG0pKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0geyAuLi5hbGdvcml0aG0gfTtcclxuICAgICAgICAgICAgcHJlcGFyZWRBbGdvcml0aG0uaGFzaCA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0uaGFzaCk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmVwYXJlZEFsZ29yaXRobTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uYWxnb3JpdGhtIH07XHJcbiAgICB9XHJcbiAgICBnZXRQcm92aWRlcihuYW1lKSB7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLnByb3ZpZGVycy5nZXQobmFtZSk7XHJcbiAgICAgICAgaWYgKCFwcm92aWRlcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQWxnb3JpdGhtRXJyb3IoXCJVbnJlY29nbml6ZWQgbmFtZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5KSB7XHJcbiAgICAgICAgaWYgKCEoa2V5IGluc3RhbmNlb2YgQ3J5cHRvS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBLZXkgaXMgbm90IG9mIHR5cGUgJ0NyeXB0b0tleSdgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxudmFyIGluZGV4ID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIGNvbnZlcnRlcnM6IGluZGV4JDNcbn0pO1xuXG5jb25zdCBSRVFVSVJFRF9GSUVMRFMgPSBbXCJjcnZcIiwgXCJlXCIsIFwia1wiLCBcImt0eVwiLCBcIm5cIiwgXCJ4XCIsIFwieVwiXTtcclxuY2xhc3MgSndrVXRpbHMge1xyXG4gICAgc3RhdGljIGFzeW5jIHRodW1icHJpbnQoaGFzaCwgandrLCBjcnlwdG8pIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtYXQoandrLCB0cnVlKTtcclxuICAgICAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3QoaGFzaCwgQ29udmVydC5Gcm9tQmluYXJ5KEpTT04uc3RyaW5naWZ5KGRhdGEpKSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZm9ybWF0KGp3aywgcmVtb3ZlID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgcmVzID0gT2JqZWN0LmVudHJpZXMoandrKTtcclxuICAgICAgICBpZiAocmVtb3ZlKSB7XHJcbiAgICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIobyA9PiBSRVFVSVJFRF9GSUVMRFMuaW5jbHVkZXMob1swXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXMgPSByZXMuc29ydCgoW2tleUFdLCBba2V5Ql0pID0+IGtleUEgPiBrZXlCID8gMSA6IGtleUEgPCBrZXlCID8gLTEgOiAwKTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHJlcyk7XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgQWVzQ2JjUHJvdmlkZXIsIEFlc0NtYWNQcm92aWRlciwgQWVzQ3RyUHJvdmlkZXIsIEFlc0VjYlByb3ZpZGVyLCBBZXNHY21Qcm92aWRlciwgQWVzS3dQcm92aWRlciwgQWVzUHJvdmlkZXIsIEFsZ29yaXRobUVycm9yLCBDcnlwdG8sIENyeXB0b0Vycm9yLCBDcnlwdG9LZXksIERlc1Byb3ZpZGVyLCBFY0N1cnZlcywgRWNVdGlscywgRWNkaEVzUHJvdmlkZXIsIEVjZGhQcm92aWRlciwgRWNkc2FQcm92aWRlciwgRWREc2FQcm92aWRlciwgRWxsaXB0aWNQcm92aWRlciwgSGtkZlByb3ZpZGVyLCBIbWFjUHJvdmlkZXIsIEp3a1V0aWxzLCBPcGVyYXRpb25FcnJvciwgUGJrZGYyUHJvdmlkZXIsIFBlbUNvbnZlcnRlciwgUHJvdmlkZXJDcnlwdG8sIFByb3ZpZGVyU3RvcmFnZSwgUmVxdWlyZWRQcm9wZXJ0eUVycm9yLCBSc2FPYWVwUHJvdmlkZXIsIFJzYVByb3ZpZGVyLCBSc2FQc3NQcm92aWRlciwgUnNhU3NhUHJvdmlkZXIsIFNoYWtlMTI4UHJvdmlkZXIsIFNoYWtlMjU2UHJvdmlkZXIsIFNoYWtlUHJvdmlkZXIsIFN1YnRsZUNyeXB0bywgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvciwgaW5kZXgkMSBhcyBhc24xLCBpc0pXSywgaW5kZXggYXMganNvbiB9O1xuIiwgIi8qIVxuIENvcHlyaWdodCAoYykgUGVjdWxpYXIgVmVudHVyZXMsIExMQ1xuKi9cblxuaW1wb3J0ICogYXMgY29yZSBmcm9tICd3ZWJjcnlwdG8tY29yZSc7XG5pbXBvcnQgeyBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIgYXMgQnVmZmVyU291cmNlQ29udmVydGVyJDEgfSBmcm9tICd3ZWJjcnlwdG8tY29yZSc7XG5leHBvcnQgeyBDcnlwdG9LZXkgfSBmcm9tICd3ZWJjcnlwdG8tY29yZSc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBjcnlwdG9fX2RlZmF1bHQgZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQgeyBfX2RlY29yYXRlIH0gZnJvbSAndHNsaWInO1xuaW1wb3J0IHsgSnNvblByb3AsIEpzb25Qcm9wVHlwZXMsIEpzb25TZXJpYWxpemVyLCBKc29uUGFyc2VyIH0gZnJvbSAnQHBlY3VsaWFyL2pzb24tc2NoZW1hJztcbmltcG9ydCB7IENvbnZlcnQsIEJ1ZmZlclNvdXJjZUNvbnZlcnRlciB9IGZyb20gJ3B2dHN1dGlscyc7XG5pbXBvcnQgeyBBc25QYXJzZXIsIEFzblNlcmlhbGl6ZXIgfSBmcm9tICdAcGVjdWxpYXIvYXNuMS1zY2hlbWEnO1xuXG5jb25zdCBKc29uQmFzZTY0VXJsQ29udmVydGVyID0ge1xyXG4gICAgZnJvbUpTT046ICh2YWx1ZSkgPT4gQnVmZmVyLmZyb20oQ29udmVydC5Gcm9tQmFzZTY0VXJsKHZhbHVlKSksXHJcbiAgICB0b0pTT046ICh2YWx1ZSkgPT4gQ29udmVydC5Ub0Jhc2U2NFVybCh2YWx1ZSksXHJcbn07XG5cbmNsYXNzIENyeXB0b0tleSBleHRlbmRzIGNvcmUuQ3J5cHRvS2V5IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gQnVmZmVyLmFsbG9jKDApO1xyXG4gICAgICAgIHRoaXMuYWxnb3JpdGhtID0geyBuYW1lOiBcIlwiIH07XHJcbiAgICAgICAgdGhpcy5leHRyYWN0YWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudHlwZSA9IFwic2VjcmV0XCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmt0eSA9IFwib2N0XCI7XHJcbiAgICAgICAgdGhpcy5hbGcgPSBcIlwiO1xyXG4gICAgfVxyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImV4dFwiLCB0eXBlOiBKc29uUHJvcFR5cGVzLkJvb2xlYW4sIG9wdGlvbmFsOiB0cnVlIH0pXHJcbl0sIENyeXB0b0tleS5wcm90b3R5cGUsIFwiZXh0cmFjdGFibGVcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwia2V5X29wc1wiLCB0eXBlOiBKc29uUHJvcFR5cGVzLlN0cmluZywgcmVwZWF0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlIH0pXHJcbl0sIENyeXB0b0tleS5wcm90b3R5cGUsIFwidXNhZ2VzXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgSnNvblByb3AoeyB0eXBlOiBKc29uUHJvcFR5cGVzLlN0cmluZyB9KVxyXG5dLCBDcnlwdG9LZXkucHJvdG90eXBlLCBcImt0eVwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEpzb25Qcm9wKHsgdHlwZTogSnNvblByb3BUeXBlcy5TdHJpbmcsIG9wdGlvbmFsOiB0cnVlIH0pXHJcbl0sIENyeXB0b0tleS5wcm90b3R5cGUsIFwiYWxnXCIsIHZvaWQgMCk7XG5cbmNsYXNzIFN5bW1ldHJpY0tleSBleHRlbmRzIENyeXB0b0tleSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMua3R5ID0gXCJvY3RcIjtcclxuICAgICAgICB0aGlzLnR5cGUgPSBcInNlY3JldFwiO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEFzeW1tZXRyaWNLZXkgZXh0ZW5kcyBDcnlwdG9LZXkge1xyXG59XG5cbmNsYXNzIEFlc0NyeXB0b0tleSBleHRlbmRzIFN5bW1ldHJpY0tleSB7XHJcbiAgICBnZXQgYWxnKCkge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5hbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtQ0JDXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYEEke3RoaXMuYWxnb3JpdGhtLmxlbmd0aH1DQkNgO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUVTLUNUUlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBJHt0aGlzLmFsZ29yaXRobS5sZW5ndGh9Q1RSYDtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1HQ01cIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBgQSR7dGhpcy5hbGdvcml0aG0ubGVuZ3RofUdDTWA7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtS1dcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBgQSR7dGhpcy5hbGdvcml0aG0ubGVuZ3RofUtXYDtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1DTUFDXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYEEke3RoaXMuYWxnb3JpdGhtLmxlbmd0aH1DTUFDYDtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1FQ0JcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBgQSR7dGhpcy5hbGdvcml0aG0ubGVuZ3RofUVDQmA7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5BbGdvcml0aG1FcnJvcihcIlVuc3VwcG9ydGVkIGFsZ29yaXRobSBuYW1lXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNldCBhbGcodmFsdWUpIHtcclxuICAgIH1cclxufVxyXG5fX2RlY29yYXRlKFtcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJrXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybENvbnZlcnRlciB9KVxyXG5dLCBBZXNDcnlwdG9LZXkucHJvdG90eXBlLCBcImRhdGFcIiwgdm9pZCAwKTtcblxuY29uc3Qga2V5U3RvcmFnZSA9IG5ldyBXZWFrTWFwKCk7XHJcbmZ1bmN0aW9uIGdldENyeXB0b0tleShrZXkpIHtcclxuICAgIGNvbnN0IHJlcyA9IGtleVN0b3JhZ2UuZ2V0KGtleSk7XHJcbiAgICBpZiAoIXJlcykge1xyXG4gICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiQ2Fubm90IGdldCBDcnlwdG9LZXkgZnJvbSBzZWN1cmUgc3RvcmFnZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbn1cclxuZnVuY3Rpb24gc2V0Q3J5cHRvS2V5KHZhbHVlKSB7XHJcbiAgICBjb25zdCBrZXkgPSBjb3JlLkNyeXB0b0tleS5jcmVhdGUodmFsdWUuYWxnb3JpdGhtLCB2YWx1ZS50eXBlLCB2YWx1ZS5leHRyYWN0YWJsZSwgdmFsdWUudXNhZ2VzKTtcclxuICAgIE9iamVjdC5mcmVlemUoa2V5KTtcclxuICAgIGtleVN0b3JhZ2Uuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgcmV0dXJuIGtleTtcclxufVxuXG5jbGFzcyBBZXNDcnlwdG8ge1xyXG4gICAgc3RhdGljIGFzeW5jIGdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBBZXNDcnlwdG9LZXkoKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAga2V5LmRhdGEgPSBjcnlwdG9fX2RlZmF1bHQucmFuZG9tQnl0ZXMoYWxnb3JpdGhtLmxlbmd0aCA+PiAzKTtcclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIGlmICghKGtleSBpbnN0YW5jZW9mIEFlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5OiBJcyBub3QgQWVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBKc29uU2VyaWFsaXplci50b0pTT04oa2V5KTtcclxuICAgICAgICAgICAgY2FzZSBcInJhd1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGtleS5kYXRhKS5idWZmZXI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJyBvciAncmF3J1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgbGV0IGtleTtcclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcclxuICAgICAgICAgICAgICAgIGtleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IEFlc0NyeXB0b0tleSB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBuZXcgQWVzQ3J5cHRvS2V5KCk7XHJcbiAgICAgICAgICAgICAgICBrZXkuZGF0YSA9IEJ1ZmZlci5mcm9tKGtleURhdGEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJyBvciAncmF3J1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtLmxlbmd0aCA9IGtleS5kYXRhLmxlbmd0aCA8PCAzO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAgc3dpdGNoIChrZXkuYWxnb3JpdGhtLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjYXNlIDEyODpcclxuICAgICAgICAgICAgY2FzZSAxOTI6XHJcbiAgICAgICAgICAgIGNhc2UgMjU2OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImtleURhdGE6IElzIHdyb25nIGtleSBsZW5ndGhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHN3aXRjaCAoYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiQUVTLUNCQ1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdEFlc0NCQyhhbGdvcml0aG0sIGtleSwgQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUVTLUNUUlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdEFlc0NUUihhbGdvcml0aG0sIGtleSwgQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUVTLUdDTVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdEFlc0dDTShhbGdvcml0aG0sIGtleSwgQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUVTLUtXXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0QWVzS1coYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1FQ0JcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRBZXNFQ0IoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGlmICghKGtleSBpbnN0YW5jZW9mIEFlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5OiBJcyBub3QgQWVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1DQkNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRBZXNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1DVFJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRBZXNDVFIoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1HQ01cIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRBZXNHQ00oYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1LV1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdEFlc0tXKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtRUNCXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0QWVzRUNCKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHRBZXNDQkMoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlQ2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1jYmNgLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoYWxnb3JpdGhtLml2KSk7XHJcbiAgICAgICAgbGV0IGVuYyA9IGNpcGhlci51cGRhdGUoZGF0YSk7XHJcbiAgICAgICAgZW5jID0gQnVmZmVyLmNvbmNhdChbZW5jLCBjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KGVuYykuYnVmZmVyO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdEFlc0NCQyhhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZURlY2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1jYmNgLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoYWxnb3JpdGhtLml2KSk7XHJcbiAgICAgICAgbGV0IGRlYyA9IGRlY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBkZWMgPSBCdWZmZXIuY29uY2F0KFtkZWMsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdEFlc0NUUihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVDaXBoZXJpdihgYWVzLSR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LWN0cmAsIGtleS5kYXRhLCBCdWZmZXIuZnJvbShhbGdvcml0aG0uY291bnRlcikpO1xyXG4gICAgICAgIGxldCBlbmMgPSBjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGVuYyA9IEJ1ZmZlci5jb25jYXQoW2VuYywgY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHRBZXNDVFIoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBkZWNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVEZWNpcGhlcml2KGBhZXMtJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0tY3RyYCwga2V5LmRhdGEsIG5ldyBVaW50OEFycmF5KGFsZ29yaXRobS5jb3VudGVyKSk7XHJcbiAgICAgICAgbGV0IGRlYyA9IGRlY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBkZWMgPSBCdWZmZXIuY29uY2F0KFtkZWMsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdEFlc0dDTShhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVDaXBoZXJpdihgYWVzLSR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LWdjbWAsIGtleS5kYXRhLCBCdWZmZXIuZnJvbShhbGdvcml0aG0uaXYpLCB7XHJcbiAgICAgICAgICAgIGF1dGhUYWdMZW5ndGg6IChhbGdvcml0aG0udGFnTGVuZ3RoIHx8IDEyOCkgPj4gMyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoYWxnb3JpdGhtLmFkZGl0aW9uYWxEYXRhKSB7XHJcbiAgICAgICAgICAgIGNpcGhlci5zZXRBQUQoQnVmZmVyLmZyb20oYWxnb3JpdGhtLmFkZGl0aW9uYWxEYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBlbmMgPSBjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGVuYyA9IEJ1ZmZlci5jb25jYXQoW2VuYywgY2lwaGVyLmZpbmFsKCksIGNpcGhlci5nZXRBdXRoVGFnKCldKTtcclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHRBZXNHQ00oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBkZWNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVEZWNpcGhlcml2KGBhZXMtJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0tZ2NtYCwga2V5LmRhdGEsIG5ldyBVaW50OEFycmF5KGFsZ29yaXRobS5pdikpO1xyXG4gICAgICAgIGNvbnN0IHRhZ0xlbmd0aCA9IChhbGdvcml0aG0udGFnTGVuZ3RoIHx8IDEyOCkgPj4gMztcclxuICAgICAgICBjb25zdCBlbmMgPSBkYXRhLnNsaWNlKDAsIGRhdGEubGVuZ3RoIC0gdGFnTGVuZ3RoKTtcclxuICAgICAgICBjb25zdCB0YWcgPSBkYXRhLnNsaWNlKGRhdGEubGVuZ3RoIC0gdGFnTGVuZ3RoKTtcclxuICAgICAgICBpZiAoYWxnb3JpdGhtLmFkZGl0aW9uYWxEYXRhKSB7XHJcbiAgICAgICAgICAgIGRlY2lwaGVyLnNldEFBRChCdWZmZXIuZnJvbShhbGdvcml0aG0uYWRkaXRpb25hbERhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVjaXBoZXIuc2V0QXV0aFRhZyh0YWcpO1xyXG4gICAgICAgIGxldCBkZWMgPSBkZWNpcGhlci51cGRhdGUoZW5jKTtcclxuICAgICAgICBkZWMgPSBCdWZmZXIuY29uY2F0KFtkZWMsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdEFlc0tXKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUNpcGhlcml2KGBpZC1hZXMke2tleS5hbGdvcml0aG0ubGVuZ3RofS13cmFwYCwga2V5LmRhdGEsIHRoaXMuQUVTX0tXX0lWKTtcclxuICAgICAgICBsZXQgZW5jID0gY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBlbmMgPSBCdWZmZXIuY29uY2F0KFtlbmMsIGNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGVuYykuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHRBZXNLVyhhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZURlY2lwaGVyaXYoYGlkLWFlcyR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LXdyYXBgLCBrZXkuZGF0YSwgdGhpcy5BRVNfS1dfSVYpO1xyXG4gICAgICAgIGxldCBkZWMgPSBkZWNpcGhlci51cGRhdGUoZGF0YSk7XHJcbiAgICAgICAgZGVjID0gQnVmZmVyLmNvbmNhdChbZGVjLCBkZWNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHRBZXNFQ0IoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlQ2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1lY2JgLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoMCkpO1xyXG4gICAgICAgIGxldCBlbmMgPSBjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGVuYyA9IEJ1ZmZlci5jb25jYXQoW2VuYywgY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHRBZXNFQ0IoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBkZWNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVEZWNpcGhlcml2KGBhZXMtJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0tZWNiYCwga2V5LmRhdGEsIG5ldyBVaW50OEFycmF5KDApKTtcclxuICAgICAgICBsZXQgZGVjID0gZGVjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGRlYyA9IEJ1ZmZlci5jb25jYXQoW2RlYywgZGVjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWMpLmJ1ZmZlcjtcclxuICAgIH1cclxufVxyXG5BZXNDcnlwdG8uQUVTX0tXX0lWID0gQnVmZmVyLmZyb20oXCJBNkE2QTZBNkE2QTZBNkE2XCIsIFwiaGV4XCIpO1xuXG5jbGFzcyBBZXNDYmNQcm92aWRlciBleHRlbmRzIGNvcmUuQWVzQ2JjUHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBBZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGxlbmd0aDogYWxnb3JpdGhtLmxlbmd0aCxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmVuY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5kZWNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIEFlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgQWVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jb25zdCB6ZXJvID0gQnVmZmVyLmZyb20oWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKTtcclxuY29uc3QgcmIgPSBCdWZmZXIuZnJvbShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTM1XSk7XHJcbmNvbnN0IGJsb2NrU2l6ZSA9IDE2O1xyXG5mdW5jdGlvbiBiaXRTaGlmdExlZnQoYnVmZmVyKSB7XHJcbiAgICBjb25zdCBzaGlmdGVkID0gQnVmZmVyLmFsbG9jKGJ1ZmZlci5sZW5ndGgpO1xyXG4gICAgY29uc3QgbGFzdCA9IGJ1ZmZlci5sZW5ndGggLSAxO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxhc3Q7IGluZGV4KyspIHtcclxuICAgICAgICBzaGlmdGVkW2luZGV4XSA9IGJ1ZmZlcltpbmRleF0gPDwgMTtcclxuICAgICAgICBpZiAoYnVmZmVyW2luZGV4ICsgMV0gJiAweDgwKSB7XHJcbiAgICAgICAgICAgIHNoaWZ0ZWRbaW5kZXhdICs9IDB4MDE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2hpZnRlZFtsYXN0XSA9IGJ1ZmZlcltsYXN0XSA8PCAxO1xyXG4gICAgcmV0dXJuIHNoaWZ0ZWQ7XHJcbn1cclxuZnVuY3Rpb24geG9yKGEsIGIpIHtcclxuICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XHJcbiAgICBjb25zdCBvdXRwdXQgPSBCdWZmZXIuYWxsb2MobGVuZ3RoKTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBvdXRwdXRbaW5kZXhdID0gYVtpbmRleF0gXiBiW2luZGV4XTtcclxuICAgIH1cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn1cclxuZnVuY3Rpb24gYWVzKGtleSwgbWVzc2FnZSkge1xyXG4gICAgY29uc3QgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KGBhZXMke2tleS5sZW5ndGggPDwgM31gLCBrZXksIHplcm8pO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gY2lwaGVyLnVwZGF0ZShtZXNzYWdlKTtcclxuICAgIGNpcGhlci5maW5hbCgpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5mdW5jdGlvbiBnZXRNZXNzYWdlQmxvY2sobWVzc2FnZSwgYmxvY2tJbmRleCkge1xyXG4gICAgY29uc3QgYmxvY2sgPSBCdWZmZXIuYWxsb2MoYmxvY2tTaXplKTtcclxuICAgIGNvbnN0IHN0YXJ0ID0gYmxvY2tJbmRleCAqIGJsb2NrU2l6ZTtcclxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgYmxvY2tTaXplO1xyXG4gICAgbWVzc2FnZS5jb3B5KGJsb2NrLCAwLCBzdGFydCwgZW5kKTtcclxuICAgIHJldHVybiBibG9jaztcclxufVxyXG5mdW5jdGlvbiBnZXRQYWRkZWRNZXNzYWdlQmxvY2sobWVzc2FnZSwgYmxvY2tJbmRleCkge1xyXG4gICAgY29uc3QgYmxvY2sgPSBCdWZmZXIuYWxsb2MoYmxvY2tTaXplKTtcclxuICAgIGNvbnN0IHN0YXJ0ID0gYmxvY2tJbmRleCAqIGJsb2NrU2l6ZTtcclxuICAgIGNvbnN0IGVuZCA9IG1lc3NhZ2UubGVuZ3RoO1xyXG4gICAgYmxvY2suZmlsbCgwKTtcclxuICAgIG1lc3NhZ2UuY29weShibG9jaywgMCwgc3RhcnQsIGVuZCk7XHJcbiAgICBibG9ja1tlbmQgLSBzdGFydF0gPSAweDgwO1xyXG4gICAgcmV0dXJuIGJsb2NrO1xyXG59XHJcbmZ1bmN0aW9uIGdlbmVyYXRlU3Via2V5cyhrZXkpIHtcclxuICAgIGNvbnN0IGwgPSBhZXMoa2V5LCB6ZXJvKTtcclxuICAgIGxldCBzdWJrZXkxID0gYml0U2hpZnRMZWZ0KGwpO1xyXG4gICAgaWYgKGxbMF0gJiAweDgwKSB7XHJcbiAgICAgICAgc3Via2V5MSA9IHhvcihzdWJrZXkxLCByYik7XHJcbiAgICB9XHJcbiAgICBsZXQgc3Via2V5MiA9IGJpdFNoaWZ0TGVmdChzdWJrZXkxKTtcclxuICAgIGlmIChzdWJrZXkxWzBdICYgMHg4MCkge1xyXG4gICAgICAgIHN1YmtleTIgPSB4b3Ioc3Via2V5MiwgcmIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgc3Via2V5MSwgc3Via2V5MiB9O1xyXG59XHJcbmZ1bmN0aW9uIGFlc0NtYWMoa2V5LCBtZXNzYWdlKSB7XHJcbiAgICBjb25zdCBzdWJrZXlzID0gZ2VuZXJhdGVTdWJrZXlzKGtleSk7XHJcbiAgICBsZXQgYmxvY2tDb3VudCA9IE1hdGguY2VpbChtZXNzYWdlLmxlbmd0aCAvIGJsb2NrU2l6ZSk7XHJcbiAgICBsZXQgbGFzdEJsb2NrQ29tcGxldGVGbGFnO1xyXG4gICAgbGV0IGxhc3RCbG9jaztcclxuICAgIGlmIChibG9ja0NvdW50ID09PSAwKSB7XHJcbiAgICAgICAgYmxvY2tDb3VudCA9IDE7XHJcbiAgICAgICAgbGFzdEJsb2NrQ29tcGxldGVGbGFnID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsYXN0QmxvY2tDb21wbGV0ZUZsYWcgPSAobWVzc2FnZS5sZW5ndGggJSBibG9ja1NpemUgPT09IDApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGFzdEJsb2NrSW5kZXggPSBibG9ja0NvdW50IC0gMTtcclxuICAgIGlmIChsYXN0QmxvY2tDb21wbGV0ZUZsYWcpIHtcclxuICAgICAgICBsYXN0QmxvY2sgPSB4b3IoZ2V0TWVzc2FnZUJsb2NrKG1lc3NhZ2UsIGxhc3RCbG9ja0luZGV4KSwgc3Via2V5cy5zdWJrZXkxKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGxhc3RCbG9jayA9IHhvcihnZXRQYWRkZWRNZXNzYWdlQmxvY2sobWVzc2FnZSwgbGFzdEJsb2NrSW5kZXgpLCBzdWJrZXlzLnN1YmtleTIpO1xyXG4gICAgfVxyXG4gICAgbGV0IHggPSB6ZXJvO1xyXG4gICAgbGV0IHk7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGFzdEJsb2NrSW5kZXg7IGluZGV4KyspIHtcclxuICAgICAgICB5ID0geG9yKHgsIGdldE1lc3NhZ2VCbG9jayhtZXNzYWdlLCBpbmRleCkpO1xyXG4gICAgICAgIHggPSBhZXMoa2V5LCB5KTtcclxuICAgIH1cclxuICAgIHkgPSB4b3IobGFzdEJsb2NrLCB4KTtcclxuICAgIHJldHVybiBhZXMoa2V5LCB5KTtcclxufVxyXG5jbGFzcyBBZXNDbWFjUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkFlc0NtYWNQcm92aWRlciB7XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEFlc0NyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgbGVuZ3RoOiBhbGdvcml0aG0ubGVuZ3RoLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uU2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFlc0NtYWMoZ2V0Q3J5cHRvS2V5KGtleSkuZGF0YSwgQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXN1bHQpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uVmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmUyID0gYXdhaXQgdGhpcy5zaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKTtcclxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oc2lnbmF0dXJlKS5jb21wYXJlKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZTIpKSA9PT0gMDtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkocmVzKTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIEFlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgQWVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBBZXNDdHJQcm92aWRlciBleHRlbmRzIGNvcmUuQWVzQ3RyUHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBBZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGxlbmd0aDogYWxnb3JpdGhtLmxlbmd0aCxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmVuY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5kZWNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkocmVzKTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIEFlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgQWVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBBZXNHY21Qcm92aWRlciBleHRlbmRzIGNvcmUuQWVzR2NtUHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBBZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGxlbmd0aDogYWxnb3JpdGhtLmxlbmd0aCxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmVuY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5kZWNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkocmVzKTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIEFlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgQWVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBBZXNLd1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5BZXNLd1Byb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgQWVzQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShyZXMpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgQWVzQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgbmFtZTogYWxnb3JpdGhtLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShyZXMpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5lbmNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZGVjcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIEFlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzRWNiUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkFlc0VjYlByb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgQWVzQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5lbmNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZGVjcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBZXNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyBuYW1lOiBhbGdvcml0aG0ubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KHJlcyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIEFlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgRGVzQ3J5cHRvS2V5IGV4dGVuZHMgU3ltbWV0cmljS2V5IHtcclxuICAgIGdldCBhbGcoKSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLmFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIkRFUy1DQkNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBgREVTLUNCQ2A7XHJcbiAgICAgICAgICAgIGNhc2UgXCJERVMtRURFMy1DQkNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBgM0RFUy1DQkNgO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuQWxnb3JpdGhtRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGdvcml0aG0gbmFtZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzZXQgYWxnKHZhbHVlKSB7XHJcbiAgICB9XHJcbn1cclxuX19kZWNvcmF0ZShbXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwia1wiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxDb252ZXJ0ZXIgfSlcclxuXSwgRGVzQ3J5cHRvS2V5LnByb3RvdHlwZSwgXCJkYXRhXCIsIHZvaWQgMCk7XG5cbmNsYXNzIERlc0NyeXB0byB7XHJcbiAgICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IERlc0NyeXB0b0tleSgpO1xyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICBrZXkuZGF0YSA9IGNyeXB0b19fZGVmYXVsdC5yYW5kb21CeXRlcyhhbGdvcml0aG0ubGVuZ3RoID4+IDMpO1xyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShrZXkuZGF0YSkuYnVmZmVyO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycgb3IgJ3JhdydcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGxldCBrZXk7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGtleURhdGEsIHsgdGFyZ2V0U2NoZW1hOiBEZXNDcnlwdG9LZXkgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInJhd1wiOlxyXG4gICAgICAgICAgICAgICAga2V5ID0gbmV3IERlc0NyeXB0b0tleSgpO1xyXG4gICAgICAgICAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIuZnJvbShrZXlEYXRhKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycgb3IgJ3JhdydcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIkRFUy1DQkNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHREZXNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkRFUy1FREUzLUNCQ1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdERlc0VERTNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGlmICghKGtleSBpbnN0YW5jZW9mIERlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5OiBJcyBub3QgRGVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIkRFUy1DQkNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHREZXNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkRFUy1FREUzLUNCQ1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdERlc0VERTNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdERlc0NCQyhhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVDaXBoZXJpdihgZGVzLWNiY2AsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uaXYpKTtcclxuICAgICAgICBsZXQgZW5jID0gY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBlbmMgPSBCdWZmZXIuY29uY2F0KFtlbmMsIGNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoZW5jKS5idWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0RGVzQ0JDKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlRGVjaXBoZXJpdihgZGVzLWNiY2AsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uaXYpKTtcclxuICAgICAgICBsZXQgZGVjID0gZGVjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGRlYyA9IEJ1ZmZlci5jb25jYXQoW2RlYywgZGVjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWMpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0RGVzRURFM0NCQyhhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVDaXBoZXJpdihgZGVzLWVkZTMtY2JjYCwga2V5LmRhdGEsIEJ1ZmZlci5mcm9tKGFsZ29yaXRobS5pdikpO1xyXG4gICAgICAgIGxldCBlbmMgPSBjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGVuYyA9IEJ1ZmZlci5jb25jYXQoW2VuYywgY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHREZXNFREUzQ0JDKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlRGVjaXBoZXJpdihgZGVzLWVkZTMtY2JjYCwga2V5LmRhdGEsIG5ldyBVaW50OEFycmF5KGFsZ29yaXRobS5pdikpO1xyXG4gICAgICAgIGxldCBkZWMgPSBkZWNpcGhlci51cGRhdGUoZGF0YSk7XHJcbiAgICAgICAgZGVjID0gQnVmZmVyLmNvbmNhdChbZGVjLCBkZWNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIERlc0NiY1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5EZXNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMua2V5U2l6ZUJpdHMgPSA2NDtcclxuICAgICAgICB0aGlzLml2U2l6ZSA9IDg7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJERVMtQ0JDXCI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IERlc0NyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmtleVNpemVCaXRzLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRW5jcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBEZXNDcnlwdG8uZW5jcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gRGVzQ3J5cHRvLmRlY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gRGVzQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgRGVzQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgbmFtZTogdGhpcy5uYW1lLCBsZW5ndGg6IHRoaXMua2V5U2l6ZUJpdHMgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgaWYgKGtleS5kYXRhLmxlbmd0aCAhPT0gKHRoaXMua2V5U2l6ZUJpdHMgPj4gMykpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJrZXlEYXRhOiBXcm9uZyBrZXkgc2l6ZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgRGVzQ3J5cHRvS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgYSBEZXNDcnlwdG9LZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIERlc0VkZTNDYmNQcm92aWRlciBleHRlbmRzIGNvcmUuRGVzUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLmtleVNpemVCaXRzID0gMTkyO1xyXG4gICAgICAgIHRoaXMuaXZTaXplID0gODtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkRFUy1FREUzLUNCQ1wiO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBEZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5rZXlTaXplQml0cyxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gRGVzQ3J5cHRvLmVuY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIERlc0NyeXB0by5kZWNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIERlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IERlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IHRoaXMubmFtZSwgbGVuZ3RoOiB0aGlzLmtleVNpemVCaXRzIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIGlmIChrZXkuZGF0YS5sZW5ndGggIT09ICh0aGlzLmtleVNpemVCaXRzID4+IDMpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwia2V5RGF0YTogV3Jvbmcga2V5IHNpemVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIERlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgRGVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5mdW5jdGlvbiBnZXRKd2tBbGdvcml0aG0oYWxnb3JpdGhtKSB7XHJcbiAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICBjYXNlIFwiUlNBLU9BRVBcIjoge1xyXG4gICAgICAgICAgICBjb25zdCBtZFNpemUgPSAvKFxcZCspJC8uZXhlYyhhbGdvcml0aG0uaGFzaC5uYW1lKVsxXTtcclxuICAgICAgICAgICAgcmV0dXJuIGBSU0EtT0FFUCR7bWRTaXplICE9PSBcIjFcIiA/IGAtJHttZFNpemV9YCA6IFwiXCJ9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcIlJTQVNTQS1QS0NTMS1WMV81XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBgUlMkey8oXFxkKykkLy5leGVjKGFsZ29yaXRobS5oYXNoLm5hbWUpWzFdfWA7XHJcbiAgICAgICAgY2FzZSBcIlJTQS1QU1NcIjpcclxuICAgICAgICAgICAgcmV0dXJuIGBQUyR7LyhcXGQrKSQvLmV4ZWMoYWxnb3JpdGhtLmhhc2gubmFtZSlbMV19YDtcclxuICAgICAgICBjYXNlIFwiUlNBLVBLQ1MxXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBgUlMxYDtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhUHJpdmF0ZUtleSBleHRlbmRzIEFzeW1tZXRyaWNLZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnR5cGUgPSBcInByaXZhdGVcIjtcclxuICAgIH1cclxuICAgIGdldEtleSgpIHtcclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKHRoaXMuZGF0YSwgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKTtcclxuICAgICAgICByZXR1cm4gQXNuUGFyc2VyLnBhcnNlKGtleUluZm8ucHJpdmF0ZUtleSwgY29yZS5hc24xLlJzYVByaXZhdGVLZXkpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHtcclxuICAgICAgICAgICAga3R5OiBcIlJTQVwiLFxyXG4gICAgICAgICAgICBhbGc6IGdldEp3a0FsZ29yaXRobSh0aGlzLmFsZ29yaXRobSksXHJcbiAgICAgICAgICAgIGtleV9vcHM6IHRoaXMudXNhZ2VzLFxyXG4gICAgICAgICAgICBleHQ6IHRoaXMuZXh0cmFjdGFibGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihqc29uLCBKc29uU2VyaWFsaXplci50b0pTT04oa2V5KSk7XHJcbiAgICB9XHJcbiAgICBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihqc29uLCB7IHRhcmdldFNjaGVtYTogY29yZS5hc24xLlJzYVByaXZhdGVLZXkgfSk7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHJpdmF0ZUtleUluZm8oKTtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiO1xyXG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5wYXJhbWV0ZXJzID0gbnVsbDtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXkpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBSc2FQdWJsaWNLZXkgZXh0ZW5kcyBBc3ltbWV0cmljS2V5IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJwdWJsaWNcIjtcclxuICAgIH1cclxuICAgIGdldEtleSgpIHtcclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKHRoaXMuZGF0YSwgY29yZS5hc24xLlB1YmxpY0tleUluZm8pO1xyXG4gICAgICAgIHJldHVybiBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wdWJsaWNLZXksIGNvcmUuYXNuMS5Sc2FQdWJsaWNLZXkpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHtcclxuICAgICAgICAgICAga3R5OiBcIlJTQVwiLFxyXG4gICAgICAgICAgICBhbGc6IGdldEp3a0FsZ29yaXRobSh0aGlzLmFsZ29yaXRobSksXHJcbiAgICAgICAgICAgIGtleV9vcHM6IHRoaXMudXNhZ2VzLFxyXG4gICAgICAgICAgICBleHQ6IHRoaXMuZXh0cmFjdGFibGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihqc29uLCBKc29uU2VyaWFsaXplci50b0pTT04oa2V5KSk7XHJcbiAgICB9XHJcbiAgICBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihqc29uLCB7IHRhcmdldFNjaGVtYTogY29yZS5hc24xLlJzYVB1YmxpY0tleSB9KTtcclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKCk7XHJcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBudWxsO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5ID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5KTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBCdWZmZXIuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhQ3J5cHRvIHtcclxuICAgIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBwcml2YXRlS2V5ID0gbmV3IFJzYVByaXZhdGVLZXkoKTtcclxuICAgICAgICBwcml2YXRlS2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcclxuICAgICAgICBwcml2YXRlS2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAgcHJpdmF0ZUtleS51c2FnZXMgPSBrZXlVc2FnZXMuZmlsdGVyKCh1c2FnZSkgPT4gdGhpcy5wcml2YXRlS2V5VXNhZ2VzLmluZGV4T2YodXNhZ2UpICE9PSAtMSk7XHJcbiAgICAgICAgY29uc3QgcHVibGljS2V5ID0gbmV3IFJzYVB1YmxpY0tleSgpO1xyXG4gICAgICAgIHB1YmxpY0tleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAgcHVibGljS2V5LmV4dHJhY3RhYmxlID0gdHJ1ZTtcclxuICAgICAgICBwdWJsaWNLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHVibGljS2V5VXNhZ2VzLmluZGV4T2YodXNhZ2UpICE9PSAtMSk7XHJcbiAgICAgICAgY29uc3QgcHVibGljRXhwb25lbnQgPSBCdWZmZXIuY29uY2F0KFtcclxuICAgICAgICAgICAgQnVmZmVyLmFsbG9jKDQgLSBhbGdvcml0aG0ucHVibGljRXhwb25lbnQuYnl0ZUxlbmd0aCwgMCksXHJcbiAgICAgICAgICAgIEJ1ZmZlci5mcm9tKGFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCksXHJcbiAgICAgICAgXSkucmVhZEludDMyQkUoMCk7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGNyeXB0b19fZGVmYXVsdC5nZW5lcmF0ZUtleVBhaXJTeW5jKFwicnNhXCIsIHtcclxuICAgICAgICAgICAgbW9kdWx1c0xlbmd0aDogYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGgsXHJcbiAgICAgICAgICAgIHB1YmxpY0V4cG9uZW50LFxyXG4gICAgICAgICAgICBwdWJsaWNLZXlFbmNvZGluZzoge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzcGtpXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByaXZhdGVLZXlFbmNvZGluZzoge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJwa2NzOFwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByaXZhdGVLZXkuZGF0YSA9IGtleXMucHJpdmF0ZUtleTtcclxuICAgICAgICBwdWJsaWNLZXkuZGF0YSA9IGtleXMucHVibGljS2V5O1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleSxcclxuICAgICAgICAgICAgcHVibGljS2V5LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBleHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBKc29uU2VyaWFsaXplci50b0pTT04oa2V5KTtcclxuICAgICAgICAgICAgY2FzZSBcInBrY3M4XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJzcGtpXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoa2V5LmRhdGEpLmJ1ZmZlcjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snLCAncGtjczgnIG9yICdzcGtpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGp3ayA9IGtleURhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoandrLmQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGtleURhdGEsIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuUnNhUHJpdmF0ZUtleSB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5Sc2FQdWJsaWNLZXkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFwic3BraVwiOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKG5ldyBVaW50OEFycmF5KGtleURhdGEpLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wdWJsaWNLZXksIGNvcmUuYXNuMS5Sc2FQdWJsaWNLZXkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZShuZXcgVWludDhBcnJheShrZXlEYXRhKSwgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEFzblBhcnNlci5wYXJzZShrZXlJbmZvLnByaXZhdGVLZXksIGNvcmUuYXNuMS5Sc2FQcml2YXRlS2V5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFByaXZhdGVLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJywgJ3BrY3M4JyBvciAnc3BraSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIHNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlJTQS1QU1NcIjpcclxuICAgICAgICAgICAgY2FzZSBcIlJTQVNTQS1QS0NTMS1WMV81XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaWduUnNhKGFsZ29yaXRobSwga2V5LCBkYXRhKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiYWxnb3JpdGhtOiBJcyBub3QgcmVjb2duaXplZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgdmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlJTQS1QU1NcIjpcclxuICAgICAgICAgICAgY2FzZSBcIlJTQVNTQS1QS0NTMS1WMV81XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJpZnlTU0EoYWxnb3JpdGhtLCBrZXksIGRhdGEsIHNpZ25hdHVyZSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlJTQS1PQUVQXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0T0FFUChhbGdvcml0aG0sIGtleSwgZGF0YSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlJTQS1PQUVQXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0T0FFUChhbGdvcml0aG0sIGtleSwgZGF0YSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGltcG9ydFByaXZhdGVLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbygpO1xyXG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTEzNTQ5LjEuMS4xXCI7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBudWxsO1xyXG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleSA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGFzbktleSk7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IFJzYVByaXZhdGVLZXkoKTtcclxuICAgICAgICBrZXkuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gT2JqZWN0LmFzc2lnbih7fSwgYWxnb3JpdGhtKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50ID0gbmV3IFVpbnQ4QXJyYXkoYXNuS2V5LnB1YmxpY0V4cG9uZW50KTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGggPSBhc25LZXkubW9kdWx1cy5ieXRlTGVuZ3RoIDw8IDM7XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlB1YmxpY0tleUluZm8oKTtcclxuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTEzNTQ5LjEuMS4xXCI7XHJcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXlBbGdvcml0aG0ucGFyYW1ldGVycyA9IG51bGw7XHJcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShhc25LZXkpO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBSc2FQdWJsaWNLZXkoKTtcclxuICAgICAgICBrZXkuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gT2JqZWN0LmFzc2lnbih7fSwgYWxnb3JpdGhtKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50ID0gbmV3IFVpbnQ4QXJyYXkoYXNuS2V5LnB1YmxpY0V4cG9uZW50KTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGggPSBhc25LZXkubW9kdWx1cy5ieXRlTGVuZ3RoIDw8IDM7XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGdldENyeXB0b0FsZ29yaXRobShhbGcpIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZy5oYXNoLm5hbWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTFcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJTQS1TSEExXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMjU2XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJSU0EtU0hBMjU2XCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMzg0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJSU0EtU0hBMzg0XCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtNTEyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJSU0EtU0hBNTEyXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTI1NlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUlNBLVNIQTMtMjU2XCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTM4NFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUlNBLVNIQTMtMzg0XCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTUxMlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUlNBLVNIQTMtNTEyXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobS5oYXNoOiBJcyBub3QgcmVjb2duaXplZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgc2lnblJzYShhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNyeXB0b0FsZyA9IHRoaXMuZ2V0Q3J5cHRvQWxnb3JpdGhtKGtleS5hbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHNpZ25lciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVTaWduKGNyeXB0b0FsZyk7XHJcbiAgICAgICAgc2lnbmVyLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgaWYgKCFrZXkucGVtKSB7XHJcbiAgICAgICAgICAgIGtleS5wZW0gPSBgLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXFxuJHtrZXkuZGF0YS50b1N0cmluZyhcImJhc2U2NFwiKX1cXG4tLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5OiBrZXkucGVtLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiUlNBLVBTU1wiKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucGFkZGluZyA9IGNyeXB0b19fZGVmYXVsdC5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HO1xyXG4gICAgICAgICAgICBvcHRpb25zLnNhbHRMZW5ndGggPSBhbGdvcml0aG0uc2FsdExlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gc2lnbmVyLnNpZ24ob3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHZlcmlmeVNTQShhbGdvcml0aG0sIGtleSwgZGF0YSwgc2lnbmF0dXJlKSB7XHJcbiAgICAgICAgY29uc3QgY3J5cHRvQWxnID0gdGhpcy5nZXRDcnlwdG9BbGdvcml0aG0oa2V5LmFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3Qgc2lnbmVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZVZlcmlmeShjcnlwdG9BbGcpO1xyXG4gICAgICAgIHNpZ25lci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgIGlmICgha2V5LnBlbSkge1xyXG4gICAgICAgICAgICBrZXkucGVtID0gYC0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXFxuJHtrZXkuZGF0YS50b1N0cmluZyhcImJhc2U2NFwiKX1cXG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBrZXk6IGtleS5wZW0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJSU0EtUFNTXCIpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5wYWRkaW5nID0gY3J5cHRvX19kZWZhdWx0LmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkc7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuc2FsdExlbmd0aCA9IGFsZ29yaXRobS5zYWx0TGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvayA9IHNpZ25lci52ZXJpZnkob3B0aW9ucywgc2lnbmF0dXJlKTtcclxuICAgICAgICByZXR1cm4gb2s7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZW5jcnlwdE9BRVAoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBrZXk6IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYCxcclxuICAgICAgICAgICAgcGFkZGluZzogY3J5cHRvX19kZWZhdWx0LmNvbnN0YW50cy5SU0FfUEtDUzFfT0FFUF9QQURESU5HLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5sYWJlbCkgO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShjcnlwdG9fX2RlZmF1bHQucHVibGljRW5jcnlwdChvcHRpb25zLCBkYXRhKSkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGRlY3J5cHRPQUVQKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5OiBgLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXFxuJHtrZXkuZGF0YS50b1N0cmluZyhcImJhc2U2NFwiKX1cXG4tLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tYCxcclxuICAgICAgICAgICAgcGFkZGluZzogY3J5cHRvX19kZWZhdWx0LmNvbnN0YW50cy5SU0FfUEtDUzFfT0FFUF9QQURESU5HLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5sYWJlbCkgO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShjcnlwdG9fX2RlZmF1bHQucHJpdmF0ZURlY3J5cHQob3B0aW9ucywgZGF0YSkpLmJ1ZmZlcjtcclxuICAgIH1cclxufVxyXG5Sc2FDcnlwdG8ucHVibGljS2V5VXNhZ2VzID0gW1widmVyaWZ5XCIsIFwiZW5jcnlwdFwiLCBcIndyYXBLZXlcIl07XHJcblJzYUNyeXB0by5wcml2YXRlS2V5VXNhZ2VzID0gW1wic2lnblwiLCBcImRlY3J5cHRcIiwgXCJ1bndyYXBLZXlcIl07XG5cbmNsYXNzIFJzYVNzYVByb3ZpZGVyIGV4dGVuZHMgY29yZS5Sc2FTc2FQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMuaGFzaEFsZ29yaXRobXMgPSBbXHJcbiAgICAgICAgICAgIFwiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIixcclxuICAgICAgICAgICAgXCJzaGFrZTEyOFwiLCBcInNoYWtlMjU2XCIsXHJcbiAgICAgICAgICAgIFwiU0hBMy0yNTZcIiwgXCJTSEEzLTM4NFwiLCBcIlNIQTMtNTEyXCJcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgUnNhQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgLi4uYWxnb3JpdGhtLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogc2V0Q3J5cHRvS2V5KGtleXMucHJpdmF0ZUtleSksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFJzYUNyeXB0by5zaWduKGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uVmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLnZlcmlmeShhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShzaWduYXR1cmUpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBSc2FDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBSc2FDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5hbGdvcml0aG0sIG5hbWU6IHRoaXMubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBpZiAoIShpbnRlcm5hbEtleSBpbnN0YW5jZW9mIFJzYVByaXZhdGVLZXkgfHwgaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQdWJsaWNLZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBSU0EgQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBSc2FQc3NQcm92aWRlciBleHRlbmRzIGNvcmUuUnNhUHNzUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1xyXG4gICAgICAgICAgICBcIlNIQS0xXCIsIFwiU0hBLTI1NlwiLCBcIlNIQS0zODRcIiwgXCJTSEEtNTEyXCIsXHJcbiAgICAgICAgICAgIFwic2hha2UxMjhcIiwgXCJzaGFrZTI1NlwiLFxyXG4gICAgICAgICAgICBcIlNIQTMtMjU2XCIsIFwiU0hBMy0zODRcIiwgXCJTSEEzLTUxMlwiXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IFJzYUNyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHNldENyeXB0b0tleShrZXlzLnByaXZhdGVLZXkpLFxyXG4gICAgICAgICAgICBwdWJsaWNLZXk6IHNldENyeXB0b0tleShrZXlzLnB1YmxpY0tleSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uU2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBSc2FDcnlwdG8uc2lnbihhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFJzYUNyeXB0by52ZXJpZnkoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgUnNhQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgLi4uYWxnb3JpdGhtLCBuYW1lOiB0aGlzLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgaWYgKCEoaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgUnNhUHVibGljS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgUlNBIENyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2hhQ3J5cHRvIHtcclxuICAgIHN0YXRpYyBzaXplKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHN3aXRjaCAoYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTFcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiAxNjA7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMjU2XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTI1NlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI1NjtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQS0zODRcIjpcclxuICAgICAgICAgICAgY2FzZSBcIlNIQTMtMzg0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMzg0O1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTUxMlwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiU0hBMy01MTJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiA1MTI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgbmFtZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0QWxnb3JpdGhtTmFtZShhbGdvcml0aG0pIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQS0xXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzaGExXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMjU2XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzaGEyNTZcIjtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQS0zODRcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInNoYTM4NFwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTUxMlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2hhNTEyXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTI1NlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2hhMy0yNTZcIjtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQTMtMzg0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzaGEzLTM4NFwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBMy01MTJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInNoYTMtNTEyXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgbmFtZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGhhc2hBbGcgPSB0aGlzLmdldEFsZ29yaXRobU5hbWUoYWxnb3JpdGhtKTtcclxuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUhhc2goaGFzaEFsZylcclxuICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhKSkuZGlnZXN0KCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGhhc2gpLmJ1ZmZlcjtcclxuICAgIH1cclxufVxuXG5jbGFzcyBSc2FPYWVwUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlJzYU9hZXBQcm92aWRlciB7XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBSc2FDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICAuLi5hbGdvcml0aG0sXHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wdWJsaWNLZXkpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBpbnRlcm5hbEtleSA9IGdldENyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XHJcbiAgICAgICAgY29uc3Qga2V5U2l6ZSA9IE1hdGguY2VpbChpbnRlcm5hbEtleS5hbGdvcml0aG0ubW9kdWx1c0xlbmd0aCA+PiAzKTtcclxuICAgICAgICBjb25zdCBoYXNoU2l6ZSA9IFNoYUNyeXB0by5zaXplKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoKSA+PiAzO1xyXG4gICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhVmlldy5ieXRlTGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHBzTGVuZ3RoID0ga2V5U2l6ZSAtIGRhdGFMZW5ndGggLSAyICogaGFzaFNpemUgLSAyO1xyXG4gICAgICAgIGlmIChkYXRhTGVuZ3RoID4ga2V5U2l6ZSAtIDIgKiBoYXNoU2l6ZSAtIDIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YSB0b28gbGFyZ2VcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgVWludDhBcnJheShrZXlTaXplKTtcclxuICAgICAgICBjb25zdCBzZWVkID0gbWVzc2FnZS5zdWJhcnJheSgxLCBoYXNoU2l6ZSArIDEpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFCbG9jayA9IG1lc3NhZ2Uuc3ViYXJyYXkoaGFzaFNpemUgKyAxKTtcclxuICAgICAgICBkYXRhQmxvY2suc2V0KGRhdGFWaWV3LCBoYXNoU2l6ZSArIHBzTGVuZ3RoICsgMSk7XHJcbiAgICAgICAgY29uc3QgbGFiZWxIYXNoID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUhhc2goaW50ZXJuYWxLZXkuYWxnb3JpdGhtLmhhc2gubmFtZS5yZXBsYWNlKFwiLVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgLnVwZGF0ZShjb3JlLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYWxnb3JpdGhtLmxhYmVsIHx8IG5ldyBVaW50OEFycmF5KDApKSlcclxuICAgICAgICAgICAgLmRpZ2VzdCgpO1xyXG4gICAgICAgIGRhdGFCbG9jay5zZXQobGFiZWxIYXNoLCAwKTtcclxuICAgICAgICBkYXRhQmxvY2tbaGFzaFNpemUgKyBwc0xlbmd0aF0gPSAxO1xyXG4gICAgICAgIGNyeXB0b19fZGVmYXVsdC5yYW5kb21GaWxsU3luYyhzZWVkKTtcclxuICAgICAgICBjb25zdCBkYXRhQmxvY2tNYXNrID0gdGhpcy5tZ2YxKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoLCBzZWVkLCBkYXRhQmxvY2subGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFCbG9jay5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkYXRhQmxvY2tbaV0gXj0gZGF0YUJsb2NrTWFza1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VlZE1hc2sgPSB0aGlzLm1nZjEoaW50ZXJuYWxLZXkuYWxnb3JpdGhtLmhhc2gsIGRhdGFCbG9jaywgc2VlZC5sZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBzZWVkW2ldIF49IHNlZWRNYXNrW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWludGVybmFsS2V5LnBlbSkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEtleS5wZW0gPSBgLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cXG4ke2ludGVybmFsS2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGtjczAgPSBjcnlwdG9fX2RlZmF1bHQucHVibGljRW5jcnlwdCh7XHJcbiAgICAgICAgICAgIGtleTogaW50ZXJuYWxLZXkucGVtLFxyXG4gICAgICAgICAgICBwYWRkaW5nOiBjcnlwdG9fX2RlZmF1bHQuY29uc3RhbnRzLlJTQV9OT19QQURESU5HLFxyXG4gICAgICAgIH0sIEJ1ZmZlci5mcm9tKG1lc3NhZ2UpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocGtjczApLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgY29uc3Qga2V5U2l6ZSA9IE1hdGguY2VpbChpbnRlcm5hbEtleS5hbGdvcml0aG0ubW9kdWx1c0xlbmd0aCA+PiAzKTtcclxuICAgICAgICBjb25zdCBoYXNoU2l6ZSA9IFNoYUNyeXB0by5zaXplKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoKSA+PiAzO1xyXG4gICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhLmJ5dGVMZW5ndGg7XHJcbiAgICAgICAgaWYgKGRhdGFMZW5ndGggIT09IGtleVNpemUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIGRhdGFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaW50ZXJuYWxLZXkucGVtKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsS2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cXG4ke2ludGVybmFsS2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwa2NzMCA9IGNyeXB0b19fZGVmYXVsdC5wcml2YXRlRGVjcnlwdCh7XHJcbiAgICAgICAgICAgIGtleTogaW50ZXJuYWxLZXkucGVtLFxyXG4gICAgICAgICAgICBwYWRkaW5nOiBjcnlwdG9fX2RlZmF1bHQuY29uc3RhbnRzLlJTQV9OT19QQURESU5HLFxyXG4gICAgICAgIH0sIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICBjb25zdCB6ID0gcGtjczBbMF07XHJcbiAgICAgICAgY29uc3Qgc2VlZCA9IHBrY3MwLnN1YmFycmF5KDEsIGhhc2hTaXplICsgMSk7XHJcbiAgICAgICAgY29uc3QgZGF0YUJsb2NrID0gcGtjczAuc3ViYXJyYXkoaGFzaFNpemUgKyAxKTtcclxuICAgICAgICBpZiAoeiAhPT0gMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyeXB0aW9uIGZhaWxlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VlZE1hc2sgPSB0aGlzLm1nZjEoaW50ZXJuYWxLZXkuYWxnb3JpdGhtLmhhc2gsIGRhdGFCbG9jaywgc2VlZC5sZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBzZWVkW2ldIF49IHNlZWRNYXNrW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhQmxvY2tNYXNrID0gdGhpcy5tZ2YxKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoLCBzZWVkLCBkYXRhQmxvY2subGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFCbG9jay5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBkYXRhQmxvY2tbaV0gXj0gZGF0YUJsb2NrTWFza1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGFiZWxIYXNoID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUhhc2goaW50ZXJuYWxLZXkuYWxnb3JpdGhtLmhhc2gubmFtZS5yZXBsYWNlKFwiLVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgLnVwZGF0ZShjb3JlLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYWxnb3JpdGhtLmxhYmVsIHx8IG5ldyBVaW50OEFycmF5KDApKSlcclxuICAgICAgICAgICAgLmRpZ2VzdCgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGFzaFNpemU7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGFiZWxIYXNoW2ldICE9PSBkYXRhQmxvY2tbaV0pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlY3J5cHRpb24gZmFpbGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwc0VuZCA9IGhhc2hTaXplO1xyXG4gICAgICAgIGZvciAoOyBwc0VuZCA8IGRhdGFCbG9jay5sZW5ndGg7IHBzRW5kKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcHN6ID0gZGF0YUJsb2NrW3BzRW5kXTtcclxuICAgICAgICAgICAgaWYgKHBzeiA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBzeiAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVjcnlwdGlvbiBmYWlsZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBzRW5kID09PSBkYXRhQmxvY2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlY3J5cHRpb24gZmFpbGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwa2NzMCA9IGRhdGFCbG9jay5zdWJhcnJheShwc0VuZCArIDEpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShwa2NzMCkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgUnNhQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgLi4uYWxnb3JpdGhtLCBuYW1lOiB0aGlzLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgaWYgKCEoaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgUnNhUHVibGljS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgUlNBIENyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBtZ2YxKGFsZ29yaXRobSwgc2VlZCwgbGVuZ3RoID0gMCkge1xyXG4gICAgICAgIGNvbnN0IGhhc2hTaXplID0gU2hhQ3J5cHRvLnNpemUoYWxnb3JpdGhtKSA+PiAzO1xyXG4gICAgICAgIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xyXG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDhBcnJheSg0KTtcclxuICAgICAgICBjb25zdCBjaHVua3MgPSBNYXRoLmNlaWwobGVuZ3RoIC8gaGFzaFNpemUpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzOyBpKyspIHtcclxuICAgICAgICAgICAgY291bnRlclswXSA9IGkgPj4+IDI0O1xyXG4gICAgICAgICAgICBjb3VudGVyWzFdID0gKGkgPj4+IDE2KSAmIDI1NTtcclxuICAgICAgICAgICAgY291bnRlclsyXSA9IChpID4+PiA4KSAmIDI1NTtcclxuICAgICAgICAgICAgY291bnRlclszXSA9IGkgJiAyNTU7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1hc2sgPSBtYXNrLnN1YmFycmF5KGkgKiBoYXNoU2l6ZSk7XHJcbiAgICAgICAgICAgIGxldCBjaHVuayA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVIYXNoKGFsZ29yaXRobS5uYW1lLnJlcGxhY2UoXCItXCIsIFwiXCIpKVxyXG4gICAgICAgICAgICAgICAgLnVwZGF0ZShzZWVkKVxyXG4gICAgICAgICAgICAgICAgLnVwZGF0ZShjb3VudGVyKVxyXG4gICAgICAgICAgICAgICAgLmRpZ2VzdCgpO1xyXG4gICAgICAgICAgICBpZiAoY2h1bmsubGVuZ3RoID4gc3VibWFzay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsuc3ViYXJyYXkoMCwgc3VibWFzay5sZW5ndGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN1Ym1hc2suc2V0KGNodW5rKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hc2s7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhRXNQcm92aWRlciBleHRlbmRzIGNvcmUuUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIlJTQUVTLVBLQ1MxLXYxXzVcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcclxuICAgICAgICAgICAgcHVibGljS2V5OiBbXCJlbmNyeXB0XCIsIFwid3JhcEtleVwiXSxcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wiZGVjcnlwdFwiLCBcInVud3JhcEtleVwiXSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgUnNhQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgLi4uYWxnb3JpdGhtLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogc2V0Q3J5cHRvS2V5KGtleXMucHJpdmF0ZUtleSksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY2hlY2tHZW5lcmF0ZUtleVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwicHVibGljRXhwb25lbnRcIik7XHJcbiAgICAgICAgaWYgKCEoYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50ICYmIGFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJwdWJsaWNFeHBvbmVudDogTWlzc2luZyBvciBub3QgYSBVaW50OEFycmF5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwdWJsaWNFeHBvbmVudCA9IENvbnZlcnQuVG9CYXNlNjQoYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50KTtcclxuICAgICAgICBpZiAoIShwdWJsaWNFeHBvbmVudCA9PT0gXCJBdz09XCIgfHwgcHVibGljRXhwb25lbnQgPT09IFwiQVFBQlwiKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwicHVibGljRXhwb25lbnQ6IE11c3QgYmUgWzNdIG9yIFsxLDAsMV1cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJtb2R1bHVzTGVuZ3RoXCIpO1xyXG4gICAgICAgIHN3aXRjaCAoYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGgpIHtcclxuICAgICAgICAgICAgY2FzZSAxMDI0OlxyXG4gICAgICAgICAgICBjYXNlIDIwNDg6XHJcbiAgICAgICAgICAgIGNhc2UgNDA5NjpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm1vZHVsdXNMZW5ndGg6IE11c3QgYmUgMTAyNCwgMjA0OCwgb3IgNDA5NlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy50b0NyeXB0b09wdGlvbnMoa2V5KTtcclxuICAgICAgICBjb25zdCBlbmMgPSBjcnlwdG8ucHVibGljRW5jcnlwdChvcHRpb25zLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGVuYykuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMudG9DcnlwdG9PcHRpb25zKGtleSk7XHJcbiAgICAgICAgY29uc3QgZGVjID0gY3J5cHRvLnByaXZhdGVEZWNyeXB0KG9wdGlvbnMsIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBSc2FDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBSc2FDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5hbGdvcml0aG0sIG5hbWU6IHRoaXMubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBpZiAoIShpbnRlcm5hbEtleSBpbnN0YW5jZW9mIFJzYVByaXZhdGVLZXkgfHwgaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQdWJsaWNLZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBSU0EgQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRvQ3J5cHRvT3B0aW9ucyhrZXkpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0ga2V5LnR5cGUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBrZXk6IGAtLS0tLUJFR0lOICR7dHlwZX0gS0VZLS0tLS1cXG4ke2dldENyeXB0b0tleShrZXkpLmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgJHt0eXBlfSBLRVktLS0tLWAsXHJcbiAgICAgICAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BBRERJTkcsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxuXG5jb25zdCBuYW1lZE9JRHMgPSB7XHJcbiAgICBcIjEuMi44NDAuMTAwNDUuMy4xLjdcIjogXCJQLTI1NlwiLFxyXG4gICAgXCJQLTI1NlwiOiBcIjEuMi44NDAuMTAwNDUuMy4xLjdcIixcclxuICAgIFwiMS4zLjEzMi4wLjM0XCI6IFwiUC0zODRcIixcclxuICAgIFwiUC0zODRcIjogXCIxLjMuMTMyLjAuMzRcIixcclxuICAgIFwiMS4zLjEzMi4wLjM1XCI6IFwiUC01MjFcIixcclxuICAgIFwiUC01MjFcIjogXCIxLjMuMTMyLjAuMzVcIixcclxuICAgIFwiMS4zLjEzMi4wLjEwXCI6IFwiSy0yNTZcIixcclxuICAgIFwiSy0yNTZcIjogXCIxLjMuMTMyLjAuMTBcIixcclxuICAgIFwiYnJhaW5wb29sUDE2MHIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjFcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjFcIjogXCJicmFpbnBvb2xQMTYwcjFcIixcclxuICAgIFwiYnJhaW5wb29sUDE2MHQxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjJcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjJcIjogXCJicmFpbnBvb2xQMTYwdDFcIixcclxuICAgIFwiYnJhaW5wb29sUDE5MnIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjNcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjNcIjogXCJicmFpbnBvb2xQMTkycjFcIixcclxuICAgIFwiYnJhaW5wb29sUDE5MnQxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjRcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjRcIjogXCJicmFpbnBvb2xQMTkydDFcIixcclxuICAgIFwiYnJhaW5wb29sUDIyNHIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjVcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjVcIjogXCJicmFpbnBvb2xQMjI0cjFcIixcclxuICAgIFwiYnJhaW5wb29sUDIyNHQxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjZcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjZcIjogXCJicmFpbnBvb2xQMjI0dDFcIixcclxuICAgIFwiYnJhaW5wb29sUDI1NnIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjdcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjdcIjogXCJicmFpbnBvb2xQMjU2cjFcIixcclxuICAgIFwiYnJhaW5wb29sUDI1NnQxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjhcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjhcIjogXCJicmFpbnBvb2xQMjU2dDFcIixcclxuICAgIFwiYnJhaW5wb29sUDMyMHIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjlcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjlcIjogXCJicmFpbnBvb2xQMzIwcjFcIixcclxuICAgIFwiYnJhaW5wb29sUDMyMHQxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjEwXCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4xMFwiOiBcImJyYWlucG9vbFAzMjB0MVwiLFxyXG4gICAgXCJicmFpbnBvb2xQMzg0cjFcIjogXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTFcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjExXCI6IFwiYnJhaW5wb29sUDM4NHIxXCIsXHJcbiAgICBcImJyYWlucG9vbFAzODR0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS4xMlwiLFxyXG4gICAgXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTJcIjogXCJicmFpbnBvb2xQMzg0dDFcIixcclxuICAgIFwiYnJhaW5wb29sUDUxMnIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjEzXCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4xM1wiOiBcImJyYWlucG9vbFA1MTJyMVwiLFxyXG4gICAgXCJicmFpbnBvb2xQNTEydDFcIjogXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTRcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjE0XCI6IFwiYnJhaW5wb29sUDUxMnQxXCIsXHJcbn07XHJcbmZ1bmN0aW9uIGdldE9pZEJ5TmFtZWRDdXJ2ZSQxKG5hbWVkQ3VydmUpIHtcclxuICAgIGNvbnN0IG9pZCA9IG5hbWVkT0lEc1tuYW1lZEN1cnZlXTtcclxuICAgIGlmICghb2lkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoYENhbm5vdCBjb252ZXJ0IFdlYkNyeXB0byBuYW1lZCBjdXJ2ZSAnJHtuYW1lZEN1cnZlfScgdG8gT0lEYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2lkO1xyXG59XG5cbmNsYXNzIEVjUHJpdmF0ZUtleSBleHRlbmRzIEFzeW1tZXRyaWNLZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnR5cGUgPSBcInByaXZhdGVcIjtcclxuICAgIH1cclxuICAgIGdldEtleSgpIHtcclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKHRoaXMuZGF0YSwgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKTtcclxuICAgICAgICByZXR1cm4gQXNuUGFyc2VyLnBhcnNlKGtleUluZm8ucHJpdmF0ZUtleSwgY29yZS5hc24xLkVjUHJpdmF0ZUtleSk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoKTtcclxuICAgICAgICBjb25zdCBqc29uID0ge1xyXG4gICAgICAgICAgICBrdHk6IFwiRUNcIixcclxuICAgICAgICAgICAgY3J2OiB0aGlzLmFsZ29yaXRobS5uYW1lZEN1cnZlLFxyXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcclxuICAgICAgICAgICAgZXh0OiB0aGlzLmV4dHJhY3RhYmxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICghanNvbi5jcnYpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoYENhbm5vdCBnZXQgbmFtZWQgY3VydmUgZnJvbSBKV0suIFByb3BlcnR5ICdjcnYnIGlzIHJlcXVpcmVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKCk7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtLmFsZ29yaXRobSA9IFwiMS4yLjg0MC4xMDA0NS4yLjFcIjtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0ucGFyYW1ldGVycyA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKG5ldyBjb3JlLmFzbjEuT2JqZWN0SWRlbnRpZmllcihnZXRPaWRCeU5hbWVkQ3VydmUkMShqc29uLmNydikpKTtcclxuICAgICAgICBjb25zdCBrZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGpzb24sIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuRWNQcml2YXRlS2V5IH0pO1xyXG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleSA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleSk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gQnVmZmVyLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5SW5mbykpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVjUHVibGljS2V5IGV4dGVuZHMgQXN5bW1ldHJpY0tleSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMudHlwZSA9IFwicHVibGljXCI7XHJcbiAgICB9XHJcbiAgICBnZXRLZXkoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZSh0aGlzLmRhdGEsIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcclxuICAgICAgICByZXR1cm4gbmV3IGNvcmUuYXNuMS5FY1B1YmxpY0tleShrZXlJbmZvLnB1YmxpY0tleSk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoKTtcclxuICAgICAgICBjb25zdCBqc29uID0ge1xyXG4gICAgICAgICAgICBrdHk6IFwiRUNcIixcclxuICAgICAgICAgICAgY3J2OiB0aGlzLmFsZ29yaXRobS5uYW1lZEN1cnZlLFxyXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcclxuICAgICAgICAgICAgZXh0OiB0aGlzLmV4dHJhY3RhYmxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICghanNvbi5jcnYpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoYENhbm5vdCBnZXQgbmFtZWQgY3VydmUgZnJvbSBKV0suIFByb3BlcnR5ICdjcnYnIGlzIHJlcXVpcmVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGtleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oanNvbiwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5FY1B1YmxpY0tleSB9KTtcclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKCk7XHJcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gXCIxLjIuODQwLjEwMDQ1LjIuMVwiO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgY29yZS5hc24xLk9iamVjdElkZW50aWZpZXIoZ2V0T2lkQnlOYW1lZEN1cnZlJDEoanNvbi5jcnYpKSk7XHJcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXkgPSBBc25TZXJpYWxpemVyLnRvQVNOKGtleSkudmFsdWVIZXg7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gQnVmZmVyLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5SW5mbykpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYTFQcm92aWRlciBleHRlbmRzIGNvcmUuUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIlNIQS0xXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBTaGFDcnlwdG8uZGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2hhMjU2UHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTSEEtMjU2XCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBTaGFDcnlwdG8uZGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2hhMzg0UHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTSEEtMzg0XCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBTaGFDcnlwdG8uZGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2hhNTEyUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTSEEtNTEyXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBTaGFDcnlwdG8uZGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2hhMzI1NlByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBMy0yNTZcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EaWdlc3QoYWxnb3JpdGhtLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFNoYUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGEzMzg0UHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTSEEzLTM4NFwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gU2hhQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYTM1MTJQcm92aWRlciBleHRlbmRzIGNvcmUuUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIlNIQTMtNTEyXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBTaGFDcnlwdG8uZGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgRWNDcnlwdG8ge1xyXG4gICAgc3RhdGljIGFzeW5jIGdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBuZXcgRWNQcml2YXRlS2V5KCk7XHJcbiAgICAgICAgcHJpdmF0ZUtleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAgcHJpdmF0ZUtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIHByaXZhdGVLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHJpdmF0ZUtleVVzYWdlcy5pbmRleE9mKHVzYWdlKSAhPT0gLTEpO1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBFY1B1YmxpY0tleSgpO1xyXG4gICAgICAgIHB1YmxpY0tleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAgcHVibGljS2V5LmV4dHJhY3RhYmxlID0gdHJ1ZTtcclxuICAgICAgICBwdWJsaWNLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHVibGljS2V5VXNhZ2VzLmluZGV4T2YodXNhZ2UpICE9PSAtMSk7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGNyeXB0b19fZGVmYXVsdC5nZW5lcmF0ZUtleVBhaXJTeW5jKFwiZWNcIiwge1xyXG4gICAgICAgICAgICBuYW1lZEN1cnZlOiB0aGlzLmdldE9wZW5TU0xOYW1lZEN1cnZlKGFsZ29yaXRobS5uYW1lZEN1cnZlKSxcclxuICAgICAgICAgICAgcHVibGljS2V5RW5jb2Rpbmc6IHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3BraVwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcml2YXRlS2V5RW5jb2Rpbmc6IHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwicGtjczhcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcml2YXRlS2V5LmRhdGEgPSBrZXlzLnByaXZhdGVLZXk7XHJcbiAgICAgICAgcHVibGljS2V5LmRhdGEgPSBrZXlzLnB1YmxpY0tleTtcclxuICAgICAgICBjb25zdCByZXMgPSB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgc2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNyeXB0b0FsZyA9IFNoYUNyeXB0by5nZXRBbGdvcml0aG1OYW1lKGFsZ29yaXRobS5oYXNoKTtcclxuICAgICAgICBjb25zdCBzaWduZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlU2lnbihjcnlwdG9BbGcpO1xyXG4gICAgICAgIHNpZ25lci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgIGlmICgha2V5LnBlbSkge1xyXG4gICAgICAgICAgICBrZXkucGVtID0gYC0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGtleToga2V5LnBlbSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25lci5zaWduKG9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGVjU2lnbmF0dXJlID0gQXNuUGFyc2VyLnBhcnNlKHNpZ25hdHVyZSwgY29yZS5hc24xLkVjRHNhU2lnbmF0dXJlKTtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmVSYXcgPSBjb3JlLkVjVXRpbHMuZW5jb2RlU2lnbmF0dXJlKGVjU2lnbmF0dXJlLCBjb3JlLkVjQ3VydmVzLmdldChrZXkuYWxnb3JpdGhtLm5hbWVkQ3VydmUpLnNpemUpO1xyXG4gICAgICAgIHJldHVybiBzaWduYXR1cmVSYXcuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIHZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgY3J5cHRvQWxnID0gU2hhQ3J5cHRvLmdldEFsZ29yaXRobU5hbWUoYWxnb3JpdGhtLmhhc2gpO1xyXG4gICAgICAgIGNvbnN0IHNpZ25lciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVWZXJpZnkoY3J5cHRvQWxnKTtcclxuICAgICAgICBzaWduZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICBpZiAoIWtleS5wZW0pIHtcclxuICAgICAgICAgICAga2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5OiBrZXkucGVtLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZWNTaWduYXR1cmUgPSBuZXcgY29yZS5hc24xLkVjRHNhU2lnbmF0dXJlKCk7XHJcbiAgICAgICAgY29uc3QgbmFtZWRDdXJ2ZSA9IGNvcmUuRWNDdXJ2ZXMuZ2V0KGtleS5hbGdvcml0aG0ubmFtZWRDdXJ2ZSk7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlUG9pbnQgPSBjb3JlLkVjVXRpbHMuZGVjb2RlU2lnbmF0dXJlKHNpZ25hdHVyZSwgbmFtZWRDdXJ2ZS5zaXplKTtcclxuICAgICAgICBlY1NpZ25hdHVyZS5yID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoc2lnbmF0dXJlUG9pbnQucik7XHJcbiAgICAgICAgZWNTaWduYXR1cmUucyA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHNpZ25hdHVyZVBvaW50LnMpO1xyXG4gICAgICAgIGNvbnN0IGVjU2lnbmF0dXJlUmF3ID0gQnVmZmVyLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoZWNTaWduYXR1cmUpKTtcclxuICAgICAgICBjb25zdCBvayA9IHNpZ25lci52ZXJpZnkob3B0aW9ucywgZWNTaWduYXR1cmVSYXcpO1xyXG4gICAgICAgIHJldHVybiBvaztcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBkZXJpdmVCaXRzKGFsZ29yaXRobSwgYmFzZUtleSwgbGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgY3J5cHRvQWxnID0gdGhpcy5nZXRPcGVuU1NMTmFtZWRDdXJ2ZShiYXNlS2V5LmFsZ29yaXRobS5uYW1lZEN1cnZlKTtcclxuICAgICAgICBjb25zdCBlY2RoID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUVDREgoY3J5cHRvQWxnKTtcclxuICAgICAgICBjb25zdCBhc25Qcml2YXRlS2V5ID0gQXNuUGFyc2VyLnBhcnNlKGJhc2VLZXkuZGF0YSwgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKTtcclxuICAgICAgICBjb25zdCBhc25FY1ByaXZhdGVLZXkgPSBBc25QYXJzZXIucGFyc2UoYXNuUHJpdmF0ZUtleS5wcml2YXRlS2V5LCBjb3JlLmFzbjEuRWNQcml2YXRlS2V5KTtcclxuICAgICAgICBlY2RoLnNldFByaXZhdGVLZXkoQnVmZmVyLmZyb20oYXNuRWNQcml2YXRlS2V5LnByaXZhdGVLZXkpKTtcclxuICAgICAgICBjb25zdCBhc25QdWJsaWNLZXkgPSBBc25QYXJzZXIucGFyc2UoYWxnb3JpdGhtLnB1YmxpYy5kYXRhLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XHJcbiAgICAgICAgY29uc3QgYml0cyA9IGVjZGguY29tcHV0ZVNlY3JldChCdWZmZXIuZnJvbShhc25QdWJsaWNLZXkucHVibGljS2V5KSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJpdHMpLmJ1ZmZlci5zbGljZSgwLCBsZW5ndGggPj4gMyk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwa2NzOFwiOlxyXG4gICAgICAgICAgICBjYXNlIFwic3BraVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGtleS5kYXRhKS5idWZmZXI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHVibGljS2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZShrZXkuZGF0YSwgY29yZS5hc24xLlB1YmxpY0tleUluZm8pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHB1YmxpY0tleUluZm8ucHVibGljS2V5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJywgJ3JhdycsIHBrY3M4JyBvciAnc3BraSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBqd2sgPSBrZXlEYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKGp3ay5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXNuS2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihrZXlEYXRhLCB7IHRhcmdldFNjaGVtYTogY29yZS5hc24xLkVjUHJpdmF0ZUtleSB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5FY1B1YmxpY0tleSB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQdWJsaWNLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXNuS2V5ID0gbmV3IGNvcmUuYXNuMS5FY1B1YmxpY0tleShrZXlEYXRhKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZShuZXcgVWludDhBcnJheShrZXlEYXRhKSwgY29yZS5hc24xLlB1YmxpY0tleUluZm8pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXNuS2V5ID0gbmV3IGNvcmUuYXNuMS5FY1B1YmxpY0tleShrZXlJbmZvLnB1YmxpY0tleSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEtleVBhcmFtZXRlcnMoa2V5SW5mby5wdWJsaWNLZXlBbGdvcml0aG0ucGFyYW1ldGVycywgYWxnb3JpdGhtLm5hbWVkQ3VydmUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZShuZXcgVWludDhBcnJheShrZXlEYXRhKSwgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEFzblBhcnNlci5wYXJzZShrZXlJbmZvLnByaXZhdGVLZXksIGNvcmUuYXNuMS5FY1ByaXZhdGVLZXkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRLZXlQYXJhbWV0ZXJzKGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5wYXJhbWV0ZXJzLCBhbGdvcml0aG0ubmFtZWRDdXJ2ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycsICdyYXcnLCAncGtjczgnIG9yICdzcGtpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXNzZXJ0S2V5UGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBuYW1lZEN1cnZlKSB7XHJcbiAgICAgICAgaWYgKCFwYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLkNyeXB0b0Vycm9yKFwiS2V5IGluZm8gZG9lc24ndCBoYXZlIHJlcXVpcmVkIHBhcmFtZXRlcnNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBuYW1lZEN1cnZlSWRlbnRpZmllciA9IFwiXCI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbmFtZWRDdXJ2ZUlkZW50aWZpZXIgPSBBc25QYXJzZXIucGFyc2UocGFyYW1ldGVycywgY29yZS5hc24xLk9iamVjdElkZW50aWZpZXIpLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5DcnlwdG9FcnJvcihcIkNhbm5vdCByZWFkIGtleSBpbmZvIHBhcmFtZXRlcnNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChnZXRPaWRCeU5hbWVkQ3VydmUkMShuYW1lZEN1cnZlKSAhPT0gbmFtZWRDdXJ2ZUlkZW50aWZpZXIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuQ3J5cHRvRXJyb3IoXCJLZXkgaW5mbyBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byBuYW1lZCBjdXJ2ZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0UHJpdmF0ZUtleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKCk7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtLmFsZ29yaXRobSA9IFwiMS4yLjg0MC4xMDA0NS4yLjFcIjtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0ucGFyYW1ldGVycyA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKG5ldyBjb3JlLmFzbjEuT2JqZWN0SWRlbnRpZmllcihnZXRPaWRCeU5hbWVkQ3VydmUkMShhbGdvcml0aG0ubmFtZWRDdXJ2ZSkpKTtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShhc25LZXkpO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBFY1ByaXZhdGVLZXkoKTtcclxuICAgICAgICBrZXkuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gT2JqZWN0LmFzc2lnbih7fSwgYWxnb3JpdGhtKTtcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHVibGljS2V5SW5mbygpO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLmFsZ29yaXRobSA9IFwiMS4yLjg0MC4xMDA0NS4yLjFcIjtcclxuICAgICAgICBjb25zdCBuYW1lZEN1cnZlID0gZ2V0T2lkQnlOYW1lZEN1cnZlJDEoYWxnb3JpdGhtLm5hbWVkQ3VydmUpO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgY29yZS5hc24xLk9iamVjdElkZW50aWZpZXIobmFtZWRDdXJ2ZSkpO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5ID0gYXNuS2V5LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBFY1B1YmxpY0tleSgpO1xyXG4gICAgICAgIGtleS5kYXRhID0gQnVmZmVyLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5SW5mbykpO1xyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBPYmplY3QuYXNzaWduKHt9LCBhbGdvcml0aG0pO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBnZXRPcGVuU1NMTmFtZWRDdXJ2ZShjdXJ2ZSkge1xyXG4gICAgICAgIHN3aXRjaCAoY3VydmUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiUC0yNTZcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInByaW1lMjU2djFcIjtcclxuICAgICAgICAgICAgY2FzZSBcIkstMjU2XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzZWNwMjU2azFcIjtcclxuICAgICAgICAgICAgY2FzZSBcIlAtMzg0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzZWNwMzg0cjFcIjtcclxuICAgICAgICAgICAgY2FzZSBcIlAtNTIxXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzZWNwNTIxcjFcIjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJ2ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuRWNDcnlwdG8ucHVibGljS2V5VXNhZ2VzID0gW1widmVyaWZ5XCJdO1xyXG5FY0NyeXB0by5wcml2YXRlS2V5VXNhZ2VzID0gW1wic2lnblwiLCBcImRlcml2ZUtleVwiLCBcImRlcml2ZUJpdHNcIl07XG5cbmNsYXNzIEVjZHNhUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkVjZHNhUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWVkQ3VydmVzID0gY29yZS5FY0N1cnZlcy5uYW1lcztcclxuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1xyXG4gICAgICAgICAgICBcIlNIQS0xXCIsIFwiU0hBLTI1NlwiLCBcIlNIQS0zODRcIiwgXCJTSEEtNTEyXCIsXHJcbiAgICAgICAgICAgIFwic2hha2UxMjhcIiwgXCJzaGFrZTI1NlwiLFxyXG4gICAgICAgICAgICBcIlNIQTMtMjU2XCIsIFwiU0hBMy0zODRcIiwgXCJTSEEzLTUxMlwiXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IEVjQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgLi4uYWxnb3JpdGhtLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogc2V0Q3J5cHRvS2V5KGtleXMucHJpdmF0ZUtleSksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEVjQ3J5cHRvLnNpZ24oYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25WZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBFY0NyeXB0by52ZXJpZnkoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gRWNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBFY0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLmFsZ29yaXRobSwgbmFtZTogdGhpcy5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBjb25zdCBpbnRlcm5hbEtleSA9IGdldENyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGlmICghKGludGVybmFsS2V5IGluc3RhbmNlb2YgRWNQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgRWNQdWJsaWNLZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBFQyBDcnlwdG9LZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVjZGhQcm92aWRlciBleHRlbmRzIGNvcmUuRWNkaFByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lZEN1cnZlcyA9IGNvcmUuRWNDdXJ2ZXMubmFtZXM7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBFY0NyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHNldENyeXB0b0tleShrZXlzLnByaXZhdGVLZXkpLFxyXG4gICAgICAgICAgICBwdWJsaWNLZXk6IHNldENyeXB0b0tleShrZXlzLnB1YmxpY0tleSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIEVjQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgRWNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5hbGdvcml0aG0sIG5hbWU6IHRoaXMubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBpZiAoIShpbnRlcm5hbEtleSBpbnN0YW5jZW9mIEVjUHJpdmF0ZUtleSB8fCBpbnRlcm5hbEtleSBpbnN0YW5jZW9mIEVjUHVibGljS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgRUMgQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGJpdHMgPSBhd2FpdCBFY0NyeXB0by5kZXJpdmVCaXRzKHsgLi4uYWxnb3JpdGhtLCBwdWJsaWM6IGdldENyeXB0b0tleShhbGdvcml0aG0ucHVibGljKSB9LCBnZXRDcnlwdG9LZXkoYmFzZUtleSksIGxlbmd0aCk7XHJcbiAgICAgICAgcmV0dXJuIGJpdHM7XHJcbiAgICB9XHJcbn1cblxuY29uc3QgZWRPSURzID0ge1xyXG4gICAgW2NvcmUuYXNuMS5pZEVkNDQ4XTogXCJFZDQ0OFwiLFxyXG4gICAgXCJlZDQ0OFwiOiBjb3JlLmFzbjEuaWRFZDQ0OCxcclxuICAgIFtjb3JlLmFzbjEuaWRYNDQ4XTogXCJYNDQ4XCIsXHJcbiAgICBcIng0NDhcIjogY29yZS5hc24xLmlkWDQ0OCxcclxuICAgIFtjb3JlLmFzbjEuaWRFZDI1NTE5XTogXCJFZDI1NTE5XCIsXHJcbiAgICBcImVkMjU1MTlcIjogY29yZS5hc24xLmlkRWQyNTUxOSxcclxuICAgIFtjb3JlLmFzbjEuaWRYMjU1MTldOiBcIlgyNTUxOVwiLFxyXG4gICAgXCJ4MjU1MTlcIjogY29yZS5hc24xLmlkWDI1NTE5LFxyXG59O1xyXG5mdW5jdGlvbiBnZXRPaWRCeU5hbWVkQ3VydmUobmFtZWRDdXJ2ZSkge1xyXG4gICAgY29uc3Qgb2lkID0gZWRPSURzW25hbWVkQ3VydmUudG9Mb3dlckNhc2UoKV07XHJcbiAgICBpZiAoIW9pZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgY29udmVydCBXZWJDcnlwdG8gbmFtZWQgY3VydmUgJyR7bmFtZWRDdXJ2ZX0nIHRvIE9JRGApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9pZDtcclxufVxuXG5jbGFzcyBFZFByaXZhdGVLZXkgZXh0ZW5kcyBBc3ltbWV0cmljS2V5IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJwcml2YXRlXCI7XHJcbiAgICB9XHJcbiAgICBnZXRLZXkoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZSh0aGlzLmRhdGEsIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XHJcbiAgICAgICAgcmV0dXJuIEFzblBhcnNlci5wYXJzZShrZXlJbmZvLnByaXZhdGVLZXksIGNvcmUuYXNuMS5DdXJ2ZVByaXZhdGVLZXkpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHtcclxuICAgICAgICAgICAga3R5OiBcIk9LUFwiLFxyXG4gICAgICAgICAgICBjcnY6IHRoaXMuYWxnb3JpdGhtLm5hbWVkQ3VydmUsXHJcbiAgICAgICAgICAgIGtleV9vcHM6IHRoaXMudXNhZ2VzLFxyXG4gICAgICAgICAgICBleHQ6IHRoaXMuZXh0cmFjdGFibGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihqc29uLCBKc29uU2VyaWFsaXplci50b0pTT04oa2V5KSk7XHJcbiAgICB9XHJcbiAgICBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgaWYgKCFqc29uLmNydikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihgQ2Fubm90IGdldCBuYW1lZCBjdXJ2ZSBmcm9tIEpXSy4gUHJvcGVydHkgJ2NydicgaXMgcmVxdWlyZWRgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHJpdmF0ZUtleUluZm8oKTtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gZ2V0T2lkQnlOYW1lZEN1cnZlKGpzb24uY3J2KTtcclxuICAgICAgICBjb25zdCBrZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGpzb24sIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuQ3VydmVQcml2YXRlS2V5IH0pO1xyXG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleSA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleSk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gQnVmZmVyLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5SW5mbykpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVkUHVibGljS2V5IGV4dGVuZHMgQXN5bW1ldHJpY0tleSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMudHlwZSA9IFwicHVibGljXCI7XHJcbiAgICB9XHJcbiAgICBnZXRLZXkoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZSh0aGlzLmRhdGEsIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcclxuICAgICAgICByZXR1cm4ga2V5SW5mby5wdWJsaWNLZXk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoKTtcclxuICAgICAgICBjb25zdCBqc29uID0ge1xyXG4gICAgICAgICAgICBrdHk6IFwiT0tQXCIsXHJcbiAgICAgICAgICAgIGNydjogdGhpcy5hbGdvcml0aG0ubmFtZWRDdXJ2ZSxcclxuICAgICAgICAgICAga2V5X29wczogdGhpcy51c2FnZXMsXHJcbiAgICAgICAgICAgIGV4dDogdGhpcy5leHRyYWN0YWJsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGpzb24sIHtcclxuICAgICAgICAgICAgeDogQ29udmVydC5Ub0Jhc2U2NFVybChrZXkpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgaWYgKCFqc29uLmNydikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihgQ2Fubm90IGdldCBuYW1lZCBjdXJ2ZSBmcm9tIEpXSy4gUHJvcGVydHkgJ2NydicgaXMgcmVxdWlyZWRgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFqc29uLngpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoYENhbm5vdCBnZXQgcHJvcGVydHkgZnJvbSBKV0suIFByb3BlcnR5ICd4JyBpcyByZXF1aXJlZGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKCk7XHJcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gZ2V0T2lkQnlOYW1lZEN1cnZlKGpzb24uY3J2KTtcclxuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleSA9IENvbnZlcnQuRnJvbUJhc2U2NFVybChqc29uLngpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxuXG5jbGFzcyBFZENyeXB0byB7XHJcbiAgICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IG5ldyBFZFByaXZhdGVLZXkoKTtcclxuICAgICAgICBwcml2YXRlS2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcclxuICAgICAgICBwcml2YXRlS2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAgcHJpdmF0ZUtleS51c2FnZXMgPSBrZXlVc2FnZXMuZmlsdGVyKCh1c2FnZSkgPT4gdGhpcy5wcml2YXRlS2V5VXNhZ2VzLmluZGV4T2YodXNhZ2UpICE9PSAtMSk7XHJcbiAgICAgICAgY29uc3QgcHVibGljS2V5ID0gbmV3IEVkUHVibGljS2V5KCk7XHJcbiAgICAgICAgcHVibGljS2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcclxuICAgICAgICBwdWJsaWNLZXkuZXh0cmFjdGFibGUgPSB0cnVlO1xyXG4gICAgICAgIHB1YmxpY0tleS51c2FnZXMgPSBrZXlVc2FnZXMuZmlsdGVyKCh1c2FnZSkgPT4gdGhpcy5wdWJsaWNLZXlVc2FnZXMuaW5kZXhPZih1c2FnZSkgIT09IC0xKTtcclxuICAgICAgICBjb25zdCB0eXBlID0gYWxnb3JpdGhtLm5hbWVkQ3VydmUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBrZXlzID0gY3J5cHRvX19kZWZhdWx0LmdlbmVyYXRlS2V5UGFpclN5bmModHlwZSwge1xyXG4gICAgICAgICAgICBwdWJsaWNLZXlFbmNvZGluZzoge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzcGtpXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByaXZhdGVLZXlFbmNvZGluZzoge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJwa2NzOFwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHByaXZhdGVLZXkuZGF0YSA9IGtleXMucHJpdmF0ZUtleTtcclxuICAgICAgICBwdWJsaWNLZXkuZGF0YSA9IGtleXMucHVibGljS2V5O1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleSxcclxuICAgICAgICAgICAgcHVibGljS2V5LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBzaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgaWYgKCFrZXkucGVtKSB7XHJcbiAgICAgICAgICAgIGtleS5wZW0gPSBgLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXFxuJHtrZXkuZGF0YS50b1N0cmluZyhcImJhc2U2NFwiKX1cXG4tLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5OiBrZXkucGVtLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gY3J5cHRvX19kZWZhdWx0LnNpZ24obnVsbCwgQnVmZmVyLmZyb20oZGF0YSksIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBjb3JlLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHNpZ25hdHVyZSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgdmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcclxuICAgICAgICBpZiAoIWtleS5wZW0pIHtcclxuICAgICAgICAgICAga2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5OiBrZXkucGVtLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgb2sgPSBjcnlwdG9fX2RlZmF1bHQudmVyaWZ5KG51bGwsIEJ1ZmZlci5mcm9tKGRhdGEpLCBvcHRpb25zLCBCdWZmZXIuZnJvbShzaWduYXR1cmUpKTtcclxuICAgICAgICByZXR1cm4gb2s7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVQdWJsaWNLZXkoe1xyXG4gICAgICAgICAgICBrZXk6IGFsZ29yaXRobS5wdWJsaWMuZGF0YSxcclxuICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxyXG4gICAgICAgICAgICB0eXBlOiBcInNwa2lcIixcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBwcml2YXRlS2V5ID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZVByaXZhdGVLZXkoe1xyXG4gICAgICAgICAgICBrZXk6IGJhc2VLZXkuZGF0YSxcclxuICAgICAgICAgICAgZm9ybWF0OiBcImRlclwiLFxyXG4gICAgICAgICAgICB0eXBlOiBcInBrY3M4XCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgYml0cyA9IGNyeXB0b19fZGVmYXVsdC5kaWZmaWVIZWxsbWFuKHtcclxuICAgICAgICAgICAgcHVibGljS2V5LFxyXG4gICAgICAgICAgICBwcml2YXRlS2V5LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShiaXRzKS5idWZmZXIuc2xpY2UoMCwgbGVuZ3RoID4+IDMpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpzb25TZXJpYWxpemVyLnRvSlNPTihrZXkpO1xyXG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjpcclxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShrZXkuZGF0YSkuYnVmZmVyO1xyXG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHB1YmxpY0tleUluZm8gPSBBc25QYXJzZXIucGFyc2Uoa2V5LmRhdGEsIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwdWJsaWNLZXlJbmZvLnB1YmxpY0tleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycsICdyYXcnLCBwa2NzOCcgb3IgJ3Nwa2knXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBpbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgandrID0ga2V5RGF0YTtcclxuICAgICAgICAgICAgICAgIGlmIChqd2suZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5DdXJ2ZVByaXZhdGVLZXkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHJpdmF0ZUtleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWp3ay54KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXlEYXRhOiBDYW5ub3QgZ2V0IHJlcXVpcmVkICd4JyBmaWxlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KENvbnZlcnQuRnJvbUJhc2U2NFVybChqd2sueCksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInJhd1wiOiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQdWJsaWNLZXkoa2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFwic3BraVwiOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKG5ldyBVaW50OEFycmF5KGtleURhdGEpLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQdWJsaWNLZXkoa2V5SW5mby5wdWJsaWNLZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInBrY3M4XCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UobmV3IFVpbnQ4QXJyYXkoa2V5RGF0YSksIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wcml2YXRlS2V5LCBjb3JlLmFzbjEuQ3VydmVQcml2YXRlS2V5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFByaXZhdGVLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJywgJ3JhdycsICdwa2NzOCcgb3IgJ3Nwa2knXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBpbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IEVkUHJpdmF0ZUtleSgpO1xyXG4gICAgICAgIGtleS5mcm9tSlNPTih7XHJcbiAgICAgICAgICAgIGNydjogYWxnb3JpdGhtLm5hbWVkQ3VydmUsXHJcbiAgICAgICAgICAgIGQ6IENvbnZlcnQuVG9CYXNlNjRVcmwoYXNuS2V5LmQpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBPYmplY3QuYXNzaWduKHt9LCBhbGdvcml0aG0pO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBpbXBvcnRQdWJsaWNLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBuZXcgRWRQdWJsaWNLZXkoKTtcclxuICAgICAgICBrZXkuZnJvbUpTT04oe1xyXG4gICAgICAgICAgICBjcnY6IGFsZ29yaXRobS5uYW1lZEN1cnZlLFxyXG4gICAgICAgICAgICB4OiBDb252ZXJ0LlRvQmFzZTY0VXJsKGFzbktleSksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IE9iamVjdC5hc3NpZ24oe30sIGFsZ29yaXRobSk7XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG59XHJcbkVkQ3J5cHRvLnB1YmxpY0tleVVzYWdlcyA9IFtcInZlcmlmeVwiXTtcclxuRWRDcnlwdG8ucHJpdmF0ZUtleVVzYWdlcyA9IFtcInNpZ25cIiwgXCJkZXJpdmVLZXlcIiwgXCJkZXJpdmVCaXRzXCJdO1xuXG5jbGFzcyBFZERzYVByb3ZpZGVyIGV4dGVuZHMgY29yZS5FZERzYVByb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IEVkQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBuYW1lZEN1cnZlOiBhbGdvcml0aG0ubmFtZWRDdXJ2ZS5yZXBsYWNlKC9eZWQvaSwgXCJFZFwiKSxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wdWJsaWNLZXkpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gRWRDcnlwdG8uc2lnbihhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEVkQ3J5cHRvLnZlcmlmeShhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShzaWduYXR1cmUpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBFZENyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEVkQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgLi4uYWxnb3JpdGhtLCBuYW1lOiB0aGlzLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVjZGhFc1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5FY2RoRXNQcm92aWRlciB7XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBFZENyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgbmFtZWRDdXJ2ZTogYWxnb3JpdGhtLm5hbWVkQ3VydmUudG9VcHBlckNhc2UoKSxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wdWJsaWNLZXkpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRlcml2ZUJpdHMoYWxnb3JpdGhtLCBiYXNlS2V5LCBsZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBiaXRzID0gYXdhaXQgRWRDcnlwdG8uZGVyaXZlQml0cyh7IC4uLmFsZ29yaXRobSwgcHVibGljOiBnZXRDcnlwdG9LZXkoYWxnb3JpdGhtLnB1YmxpYykgfSwgZ2V0Q3J5cHRvS2V5KGJhc2VLZXkpLCBsZW5ndGgpO1xyXG4gICAgICAgIHJldHVybiBiaXRzO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gRWRDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBFZENyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLmFsZ29yaXRobSwgbmFtZTogdGhpcy5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBQYmtkZkNyeXB0b0tleSBleHRlbmRzIENyeXB0b0tleSB7XHJcbn1cblxuY2xhc3MgUGJrZGYyUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlBia2RmMlByb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uRGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNhbHQgPSBjb3JlLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGFsZ29yaXRobS5zYWx0KTtcclxuICAgICAgICAgICAgY29uc3QgaGFzaCA9IGFsZ29yaXRobS5oYXNoLm5hbWUucmVwbGFjZShcIi1cIiwgXCJcIik7XHJcbiAgICAgICAgICAgIGNyeXB0b19fZGVmYXVsdC5wYmtkZjIoZ2V0Q3J5cHRvS2V5KGJhc2VLZXkpLmRhdGEsIEJ1ZmZlci5mcm9tKHNhbHQpLCBhbGdvcml0aG0uaXRlcmF0aW9ucywgbGVuZ3RoID4+IDMsIGhhc2gsIChlcnIsIGRlcml2ZWRCaXRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGRlcml2ZWRCaXRzKS5idWZmZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJyYXdcIikge1xyXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBuZXcgUGJrZGZDcnlwdG9LZXkoKTtcclxuICAgICAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIuZnJvbShrZXlEYXRhKTtcclxuICAgICAgICAgICAga2V5LmFsZ29yaXRobSA9IHsgbmFtZTogdGhpcy5uYW1lIH07XHJcbiAgICAgICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdyYXcnXCIpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgUGJrZGZDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBQQktERiBDcnlwdG9LZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEhtYWNDcnlwdG9LZXkgZXh0ZW5kcyBDcnlwdG9LZXkge1xyXG4gICAgZ2V0IGFsZygpIHtcclxuICAgICAgICBjb25zdCBoYXNoID0gdGhpcy5hbGdvcml0aG0uaGFzaC5uYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIGBIUyR7aGFzaC5yZXBsYWNlKFwiU0hBLVwiLCBcIlwiKX1gO1xyXG4gICAgfVxyXG4gICAgc2V0IGFsZyh2YWx1ZSkge1xyXG4gICAgfVxyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImtcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQ29udmVydGVyIH0pXHJcbl0sIEhtYWNDcnlwdG9LZXkucHJvdG90eXBlLCBcImRhdGFcIiwgdm9pZCAwKTtcblxuY2xhc3MgSG1hY1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5IbWFjUHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSAoYWxnb3JpdGhtLmxlbmd0aCB8fCB0aGlzLmdldERlZmF1bHRMZW5ndGgoYWxnb3JpdGhtLmhhc2gubmFtZSkpID4+IDMgPDwgMztcclxuICAgICAgICBjb25zdCBrZXkgPSBuZXcgSG1hY0NyeXB0b0tleSgpO1xyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSB7XHJcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcclxuICAgICAgICAgICAgbGVuZ3RoLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgIGtleS5kYXRhID0gY3J5cHRvX19kZWZhdWx0LnJhbmRvbUJ5dGVzKGxlbmd0aCA+PiAzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjcnlwdG9BbGcgPSBTaGFDcnlwdG8uZ2V0QWxnb3JpdGhtTmFtZShrZXkuYWxnb3JpdGhtLmhhc2gpO1xyXG4gICAgICAgIGNvbnN0IGhtYWMgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlSG1hYyhjcnlwdG9BbGcsIGdldENyeXB0b0tleShrZXkpLmRhdGEpXHJcbiAgICAgICAgICAgIC51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSkpLmRpZ2VzdCgpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShobWFjKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgY3J5cHRvQWxnID0gU2hhQ3J5cHRvLmdldEFsZ29yaXRobU5hbWUoa2V5LmFsZ29yaXRobS5oYXNoKTtcclxuICAgICAgICBjb25zdCBobWFjID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUhtYWMoY3J5cHRvQWxnLCBnZXRDcnlwdG9LZXkoa2V5KS5kYXRhKVxyXG4gICAgICAgICAgICAudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEpKS5kaWdlc3QoKTtcclxuICAgICAgICByZXR1cm4gaG1hYy5jb21wYXJlKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkpID09PSAwO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBsZXQga2V5O1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxyXG4gICAgICAgICAgICAgICAga2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihrZXlEYXRhLCB7IHRhcmdldFNjaGVtYTogSG1hY0NyeXB0b0tleSB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBuZXcgSG1hY0NyeXB0b0tleSgpO1xyXG4gICAgICAgICAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIuZnJvbShrZXlEYXRhKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycgb3IgJ3JhdydcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSB7XHJcbiAgICAgICAgICAgIGhhc2g6IHsgbmFtZTogYWxnb3JpdGhtLmhhc2gubmFtZSB9LFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGxlbmd0aDoga2V5LmRhdGEubGVuZ3RoIDw8IDMsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSnNvblNlcmlhbGl6ZXIudG9KU09OKGdldENyeXB0b0tleShrZXkpKTtcclxuICAgICAgICAgICAgY2FzZSBcInJhd1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGdldENyeXB0b0tleShrZXkpLmRhdGEpLmJ1ZmZlcjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snIG9yICdyYXcnXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIEhtYWNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBITUFDIENyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgSGtkZkNyeXB0b0tleSBleHRlbmRzIENyeXB0b0tleSB7XHJcbn1cblxuY2xhc3MgSGtkZlByb3ZpZGVyIGV4dGVuZHMgY29yZS5Ia2RmUHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgIT09IFwicmF3XCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJPcGVyYXRpb24gbm90IHN1cHBvcnRlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IEhrZGZDcnlwdG9LZXkoKTtcclxuICAgICAgICBrZXkuZGF0YSA9IEJ1ZmZlci5mcm9tKGtleURhdGEpO1xyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSB7IG5hbWU6IHRoaXMubmFtZSB9O1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZXJpdmVCaXRzKHBhcmFtcywgYmFzZUtleSwgbGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgaGFzaCA9IHBhcmFtcy5oYXNoLm5hbWUucmVwbGFjZShcIi1cIiwgXCJcIik7XHJcbiAgICAgICAgY29uc3QgaGFzaExlbmd0aCA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVIYXNoKGhhc2gpLmRpZ2VzdCgpLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gbGVuZ3RoIC8gODtcclxuICAgICAgICBjb25zdCBpbmZvID0gQnVmZmVyU291cmNlQ29udmVydGVyJDEudG9VaW50OEFycmF5KHBhcmFtcy5pbmZvKTtcclxuICAgICAgICBjb25zdCBQUksgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlSG1hYyhoYXNoLCBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIkMS50b1VpbnQ4QXJyYXkocGFyYW1zLnNhbHQpKVxyXG4gICAgICAgICAgICAudXBkYXRlKEJ1ZmZlclNvdXJjZUNvbnZlcnRlciQxLnRvVWludDhBcnJheShnZXRDcnlwdG9LZXkoYmFzZUtleSkuZGF0YSkpXHJcbiAgICAgICAgICAgIC5kaWdlc3QoKTtcclxuICAgICAgICBjb25zdCBibG9ja3MgPSBbQnVmZmVyLmFsbG9jKDApXTtcclxuICAgICAgICBjb25zdCBibG9ja0NvdW50ID0gTWF0aC5jZWlsKGJ5dGVMZW5ndGggLyBoYXNoTGVuZ3RoKSArIDE7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBibG9ja0NvdW50OyArK2kpIHtcclxuICAgICAgICAgICAgYmxvY2tzLnB1c2goY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUhtYWMoaGFzaCwgUFJLKVxyXG4gICAgICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtibG9ja3NbaSAtIDFdLCBpbmZvLCBCdWZmZXIuZnJvbShbaV0pXSkpXHJcbiAgICAgICAgICAgICAgICAuZGlnZXN0KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChibG9ja3MpLnNsaWNlKDAsIGJ5dGVMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgSGtkZkNyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IEhLREYgQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGFrZUNyeXB0byB7XHJcbiAgICBzdGF0aWMgZGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlSGFzaChhbGdvcml0aG0ubmFtZS50b0xvd2VyQ2FzZSgpLCB7IG91dHB1dExlbmd0aDogYWxnb3JpdGhtLmxlbmd0aCB9KVxyXG4gICAgICAgICAgICAudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEpKS5kaWdlc3QoKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaGFzaCkuYnVmZmVyO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYWtlMTI4UHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlNoYWtlMTI4UHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25EaWdlc3QoYWxnb3JpdGhtLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFNoYWtlQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYWtlMjU2UHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlNoYWtlMjU2UHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25EaWdlc3QoYWxnb3JpdGhtLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFNoYWtlQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFN1YnRsZUNyeXB0byBleHRlbmRzIGNvcmUuU3VidGxlQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzQ2JjUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBBZXNDdHJQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEFlc0djbVByb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzQ21hY1Byb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzS3dQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEFlc0VjYlByb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgRGVzQ2JjUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBEZXNFZGUzQ2JjUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBSc2FTc2FQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFJzYVBzc1Byb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgUnNhT2FlcFByb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgUnNhRXNQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEVjZHNhUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBFY2RoUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBTaGExUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBTaGEyNTZQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYTM4NFByb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hhNTEyUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBQYmtkZjJQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEhtYWNQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEhrZGZQcm92aWRlcigpKTtcclxuICAgICAgICBjb25zdCBub2RlTWFqb3JWZXJzaW9uID0gKF9hID0gL152KFxcZCspLy5leGVjKHByb2Nlc3MudmVyc2lvbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVsxXTtcclxuICAgICAgICBpZiAobm9kZU1ham9yVmVyc2lvbiAmJiBwYXJzZUludChub2RlTWFqb3JWZXJzaW9uLCAxMCkgPj0gMTIpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBTaGFrZTEyOFByb3ZpZGVyKCkpO1xyXG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYWtlMjU2UHJvdmlkZXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhhc2hlcyA9IGNyeXB0by5nZXRIYXNoZXMoKTtcclxuICAgICAgICBpZiAoaGFzaGVzLmluY2x1ZGVzKFwic2hhMy0yNTZcIikpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBTaGEzMjU2UHJvdmlkZXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoYXNoZXMuaW5jbHVkZXMoXCJzaGEzLTM4NFwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYTMzODRQcm92aWRlcigpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGhhc2hlcy5pbmNsdWRlcyhcInNoYTMtNTEyXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hhMzUxMlByb3ZpZGVyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZU1ham9yVmVyc2lvbiAmJiBwYXJzZUludChub2RlTWFqb3JWZXJzaW9uLCAxMCkgPj0gMTQpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBFZERzYVByb3ZpZGVyKCkpO1xyXG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEVjZGhFc1Byb3ZpZGVyKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBDcnlwdG8gZXh0ZW5kcyBjb3JlLkNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMuc3VidGxlID0gbmV3IFN1YnRsZUNyeXB0bygpO1xyXG4gICAgfVxyXG4gICAgZ2V0UmFuZG9tVmFsdWVzKGFycmF5KSB7XHJcbiAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcoYXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAnZ2V0UmFuZG9tVmFsdWVzJyBvbiAnQ3J5cHRvJzogcGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ0FycmF5QnVmZmVyVmlldydcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5LmJ1ZmZlciwgYXJyYXkuYnl0ZU9mZnNldCwgYXJyYXkuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgY3J5cHRvX19kZWZhdWx0LnJhbmRvbUZpbGxTeW5jKGJ1ZmZlcik7XHJcbiAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IENyeXB0byB9O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cblxuaW1wb3J0IHtnZXRHbG9iYWx9IGZyb20gJy4uL3R5cGVzL2dsb2JhbC5tanMnO1xuXG5leHBvcnQge3JhbmRvbX1cblxuLyoqXG4gKiB0aGlzIGZ1bmN0aW9uIHVzZXMgY3J5cHQgYW5kIHJldHVybnMgYSByYW5kb20gbnVtYmVyLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3JhbmRvbX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvbWF0aC9yYW5kb20ubWpzJztcbiAqIHJhbmRvbSgxLDEwKVxuICogLy8gXHUyMUE2IDVcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiBzdGFydGluZyB2YWx1ZSBvZiB0aGUgZGVmaW5pdGlvbiBzZXQgKGRlZmF1bHQgaXMgMClcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggZW5kIHZhbHVlIG9mIHRoZSBkZWZpbml0aW9uIHNldCAoZGVmYXVsdCBpcyAxMDAwMDAwMDAwKVxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLk1hdGhcbiAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIGNyeXB0XG4gKiBAdGhyb3dzIHtFcnJvcn0gd2UgY2Fubm90IGdlbmVyYXRlIG51bWJlcnMgbGFyZ2VyIHRoYW4gNTMgYml0cy5cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgZGlzdGFuY2UgaXMgdG9vIHNtYWxsIHRvIGNyZWF0ZSBhIHJhbmRvbSBudW1iZXIuXG5cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqL1xuIGZ1bmN0aW9uIHJhbmRvbShtaW4sIG1heCkge1xuXG4gICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1pbiA9IDA7XG4gICAgfVxuICAgIGlmIChtYXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtYXggPSBNQVg7XG4gICAgfVxuXG4gICAgaWYgKG1heCA8IG1pbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtYXggbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLnJvdW5kKGNyZWF0ZShtaW4sIG1heCkpO1xuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbnZhciBNQVggPSAxMDAwMDAwMDAwO1xuXG5cbk1hdGgubG9nMiA9IE1hdGgubG9nMiB8fCBmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDIpO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG1pblxuICogQHBhcmFtIHtudW1iZXJ9IG1heFxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBwcml2YXRlXG4gKiBAdGhyb3dzIHtFcnJvcn0gbWlzc2luZyBjcnlwdFxuICogQHRocm93cyB7RXJyb3J9IHdlIGNhbm5vdCBnZW5lcmF0ZSBudW1iZXJzIGxhcmdlciB0aGFuIDUzIGJpdHMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGRpc3RhbmNlIGlzIHRvbyBzbWFsbCB0byBjcmVhdGUgYSByYW5kb20gbnVtYmVyLlxuICovXG5mdW5jdGlvbiBjcmVhdGUobWluLCBtYXgpIHtcbiAgICBsZXQgY3J5cHQ7XG4gICAgbGV0IGdsb2JhbFJlZmVyZW5jZSA9IGdldEdsb2JhbCgpO1xuXG4gICAgY3J5cHQgPSBnbG9iYWxSZWZlcmVuY2U/LlsnY3J5cHRvJ10gfHwgZ2xvYmFsUmVmZXJlbmNlPy5bJ21zQ3J5cHRvJ10gfHwgZ2xvYmFsUmVmZXJlbmNlPy5bJ2NyeXB0byddIHx8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgY3J5cHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBjcnlwdFwiKVxuICAgIH1cblxuICAgIGxldCBydmFsID0gMDtcbiAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbjtcbiAgICBpZiAocmFuZ2UgPCAyKSB7XG4gICAgICAgIHRocm93ICBuZXcgRXJyb3IoJ3RoZSBkaXN0YW5jZSBpcyB0b28gc21hbGwgdG8gY3JlYXRlIGEgcmFuZG9tIG51bWJlci4nKVxuICAgIH1cblxuICAgIGNvbnN0IGJpdHNOZWVkZWQgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKHJhbmdlKSk7XG4gICAgaWYgKGJpdHNOZWVkZWQgPiA1Mykge1xuICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwid2UgY2Fubm90IGdlbmVyYXRlIG51bWJlcnMgbGFyZ2VyIHRoYW4gNTMgYml0cy5cIik7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVzTmVlZGVkID0gTWF0aC5jZWlsKGJpdHNOZWVkZWQgLyA4KTtcbiAgICBjb25zdCBtYXNrID0gTWF0aC5wb3coMiwgYml0c05lZWRlZCkgLSAxO1xuXG4gICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXNOZWVkZWQpO1xuICAgIGNyeXB0LmdldFJhbmRvbVZhbHVlcyhieXRlQXJyYXkpO1xuXG4gICAgbGV0IHAgPSAoYnl0ZXNOZWVkZWQgLSAxKSAqIDg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlc05lZWRlZDsgaSsrKSB7XG4gICAgICAgIHJ2YWwgKz0gYnl0ZUFycmF5W2ldICogTWF0aC5wb3coMiwgcCk7XG4gICAgICAgIHAgLT0gODtcbiAgICB9XG5cbiAgICBydmFsID0gcnZhbCAmIG1hc2s7XG5cbiAgICBpZiAocnZhbCA+PSByYW5nZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlKG1pbiwgbWF4KTtcbiAgICB9XG5cbiAgICBpZiAocnZhbCA8IG1pbikge1xuICAgICAgICBydmFsICs9IG1pbjtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHJ2YWw7XG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7cmFuZG9tfSBmcm9tIFwiLi4vbWF0aC9yYW5kb20ubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4vZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtJRH0gZnJvbSBcIi4vaWQubWpzXCI7XG5cbmV4cG9ydCB7UmFuZG9tSUR9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmxldCBpbnRlcm5hbENvdW50ZXIgPSAwO1xuXG4vKipcbiAqIFRoZSBgUmFuZG9tSURgIGNsYXNzIHByb3ZpZGVzIGEgdW5pcXVlIElEIGZvciBhbiBpdGVtLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1JhbmRvbUlEfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9yYW5kb21pZC5tanMnO1xuICogY29uc29sZS5sb2cobmV3IFJhbmRvbUlEKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAc3VtbWFyeSBjbGFzcyB0byBnZW5lcmF0ZSByYW5kb20gbnVtYmVyc1xuICovXG5jbGFzcyBSYW5kb21JRCBleHRlbmRzIElEIHtcblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSBuZXcgb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgaW50ZXJuYWxDb3VudGVyICs9IDE7XG5cbiAgICAgICAgdGhpcy5pZCA9IGdldEdsb2JhbCgpLmJ0b2EocmFuZG9tKDEsIDEwMDAwKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC89L2csICcnKVxuICAgICAgICAgICAgLyoqIE5vIG51bWJlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgSUQsIGJlY2F1c2Ugb2YgcG9zc2libGUgcHJvYmxlbXMgd2l0aCBET00gKi9cbiAgICAgICAgICAgIC5yZXBsYWNlKC9eWzAtOV0rLywgJ1gnKSArIGludGVybmFsQ291bnRlcjtcbiAgICB9XG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtyYW5kb219IGZyb20gXCIuLi9tYXRoL3JhbmRvbS5tanNcIjtcbmltcG9ydCB7aXNPYmplY3R9IGZyb20gJy4uL3R5cGVzL2lzLm1qcyc7XG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSBcIi4vZ2xvYmFsLm1qc1wiO1xuXG5leHBvcnQge1VVSUR9XG5cbi8qKlxuICogVGhlIFVVSUQgY2xhc3MgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2V0IGEgdW5pcXVlIFVVSUQgZm9yIGFuIG9iamVjdC5cbiAqIFxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7QmFzZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdXVpZC5tanMnO1xuICogbmV3IFVVSUQoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZFxuICovXG4gY2xhc3MgVVVJRCBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBsZXQgdXVpZCA9IGNyZWF0ZVdpdGhDcnlwdG8oKTtcblxuICAgICAgICBpZiAodXVpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1dWlkID0gY3JlYXRlV2l0aFJhbmRvbSgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAodXVpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdID0ge1xuICAgICAgICAgICAgdmFsdWU6IHV1aWRcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXVsndmFsdWUnXTtcbiAgICB9XG5cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBjcmVhdGVXaXRoUmFuZG9tKCkge1xuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHZhciByID0gcmFuZG9tKDAsIDY1MDAwKSAqIDE2IHwgMCxcbiAgICAgICAgICAgIHYgPSAoKGMgPT09ICd4JykgPyByIDogKHIgJiAweDMgfCAweDgpKTtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpWzBdO1xuICAgIH0pXG59XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV2l0aENyeXB0bygpIHtcbiAgICBjb25zdCBjcnlwdCA9IGdldEdsb2JhbE9iamVjdCgnY3J5cHRvJyk7XG4gICAgaWYgKCFpc09iamVjdChjcnlwdCkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGNyeXB0Py5bJ3JhbmRvbVVVSUQnXSkgcmV0dXJuO1xuICAgIHJldHVybiBjcnlwdC5yYW5kb21VVUlEKCk7XG59XG5cbiIsICIvLyBTaGFyZWRBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyO1xuLy9cbi8vIGNvbnN0IG1hdGNoQWxsID0gcmVxdWlyZSgnc3RyaW5nLnByb3RvdHlwZS5tYXRjaGFsbCcpO1xuLy8gbWF0Y2hBbGwuc2hpbSgpOyAvLyB3aWxsIGJlIGEgbm8tb3AgaWYgbm90IG5lZWRlZFxuLy9cbi8vIHJlcXVpcmUoJ3JlcGxhY2VhbGwtc2hpbScpO1xuXG5cbmlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuXG4gICAgKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgc2F5c3dobyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LCB0ZW0sXG4gICAgICAgICAgICAgICAgTSA9IHVhLm1hdGNoKC8ob3BlcmF8Y2hyb21lfHNhZmFyaXxmaXJlZm94fG1zaWV8dHJpZGVudCg/PVxcLykpXFwvP1xccyooXFxkKykvaSkgfHwgW107XG4gICAgICAgICAgICBpZiAoL3RyaWRlbnQvaS50ZXN0KE1bMV0pKSB7XG4gICAgICAgICAgICAgICAgdGVtID0gL1xcYnJ2WyA6XSsoXFxkKykvZy5leGVjKHVhKSB8fCBbXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0lFICcgKyAodGVtWzFdIHx8ICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNWzFdID09PSAnQ2hyb21lJykge1xuICAgICAgICAgICAgICAgIHRlbSA9IHVhLm1hdGNoKC9cXGIoT1BSfEVkZ2UpXFwvKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgaWYgKHRlbSAhPSBudWxsKSByZXR1cm4gdGVtLnNsaWNlKDEpLmpvaW4oJyAnKS5yZXBsYWNlKCdPUFInLCAnT3BlcmEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE0gPSBNWzJdID8gW01bMV0sIE1bMl1dIDogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XG4gICAgICAgICAgICBpZiAoKHRlbSA9IHVhLm1hdGNoKC92ZXJzaW9uXFwvKFxcZCspL2kpKSAhPSBudWxsKSBNLnNwbGljZSgxLCAxLCB0ZW1bMV0pO1xuICAgICAgICAgICAgcmV0dXJuIE0uam9pbignICcpO1xuICAgICAgICB9KSgpO1xuXG5cbiAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMScpXG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MICs9IFwiIFwiICsgc2F5c3dobztcblxuICAgIH0pKCk7XG5cblxufVxuIiwgImltcG9ydCBjaGFpIGZyb20gJy4vaW5kZXguanMnO1xuXG5leHBvcnQgY29uc3QgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5leHBvcnQgY29uc3QgdmVyc2lvbiA9IGNoYWkudmVyc2lvbjtcbmV4cG9ydCBjb25zdCBBc3NlcnRpb24gPSBjaGFpLkFzc2VydGlvbjtcbmV4cG9ydCBjb25zdCBBc3NlcnRpb25FcnJvciA9IGNoYWkuQXNzZXJ0aW9uRXJyb3I7XG5leHBvcnQgY29uc3QgdXRpbCA9IGNoYWkudXRpbDtcbmV4cG9ydCBjb25zdCBjb25maWcgPSBjaGFpLmNvbmZpZztcbmV4cG9ydCBjb25zdCB1c2UgPSBjaGFpLnVzZTtcbmV4cG9ydCBjb25zdCBzaG91bGQgPSBjaGFpLnNob3VsZDtcbmV4cG9ydCBjb25zdCBhc3NlcnQgPSBjaGFpLmFzc2VydDtcbmV4cG9ydCBjb25zdCBjb3JlID0gY2hhaS5jb3JlO1xuXG5leHBvcnQgZGVmYXVsdCBjaGFpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi9iYXNlLm1qcyc7XG5cbmV4cG9ydCB7VmVyc2lvbiwgZ2V0TW9uc3RlclZlcnNpb259XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2JqZWN0IGNvbnRhaW5zIGEgc2VtYXRpYyB2ZXJzaW9uIG51bWJlclxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1ZlcnNpb259IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3ZlcnNpb24ubWpzJztcbiAqIGNvbnNvbGUubG9nKG5ldyBWZXJzaW9uKCcxLjIuMycpKSAvLyBcdTIxQTYgMS4yLjNcbiAqIGNvbnNvbGUubG9nKG5ldyBWZXJzaW9uKCcxJykpIC8vIFx1MjFBNiAxLjAuMFxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7VmVyc2lvbn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdmVyc2lvbi5tanMnO1xuICpcbiAqIG5ldyBWZXJzaW9uKCcxLjAuMCcpIC8vIFx1MjFBNiAxLjAuMFxuICogbmV3IFZlcnNpb24oMSkgIC8vIFx1MjFBNiAxLjAuMFxuICogbmV3IFZlcnNpb24oMSwgMCwgMCkgLy8gXHUyMUE2IDEuMC4wXG4gKiBuZXcgVmVyc2lvbignMS4yLjMnLCA0LCA1KSAvLyBcdTIxQTYgMS40LjVcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzdW1tYXJ5IFRoZSB2ZXJzaW9uIG9iamVjdCBjb250YWlucyBhIHNlbWF0aWMgdmVyc2lvbiBudW1iZXJcbiAqL1xuY2xhc3MgVmVyc2lvbiBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFqb3JcbiAgICAgKiBAcGFyYW0gbWlub3JcbiAgICAgKiBAcGFyYW0gcGF0Y2hcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gbWFqb3IgaXMgbm90IGEgbnVtYmVyXG4gICAgICogQHRocm93cyB7RXJyb3J9IG1pbm9yIGlzIG5vdCBhIG51bWJlclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBwYXRjaCBpcyBub3QgYSBudW1iZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYWpvciwgbWlub3IsIHBhdGNoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtYWpvciA9PT0gJ3N0cmluZycgJiYgbWlub3IgPT09IHVuZGVmaW5lZCAmJiBwYXRjaCA9PT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IG1ham9yLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIG1ham9yID0gcGFyc2VJbnQocGFydHNbMF0gfHwgMCk7XG4gICAgICAgICAgICBtaW5vciA9IHBhcnNlSW50KHBhcnRzWzFdIHx8IDApO1xuICAgICAgICAgICAgcGF0Y2ggPSBwYXJzZUludChwYXJ0c1syXSB8fCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYWpvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwibWFqb3IgdmVyc2lvbiBpcyB1bmRlZmluZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWlub3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWlub3IgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhdGNoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFqb3IgPSBwYXJzZUludChtYWpvcik7XG4gICAgICAgIHRoaXMubWlub3IgPSBwYXJzZUludChtaW5vcik7XG4gICAgICAgIHRoaXMucGF0Y2ggPSBwYXJzZUludChwYXRjaCk7XG5cbiAgICAgICAgaWYgKGlzTmFOKHRoaXMubWFqb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwibWFqb3IgaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmFOKHRoaXMubWlub3IpKSB7XG4gICAgICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwibWlub3IgaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmFOKHRoaXMucGF0Y2gpKSB7XG4gICAgICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwicGF0Y2ggaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ham9yICsgJy4nICsgdGhpcy5taW5vciArICcuJyArIHRoaXMucGF0Y2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyAwIGlmIGVxdWFsLCAtMSBpZiB0aGUgb2JqZWN0IHZlcnNpb24gaXMgbGVzcyBhbmQgMSBpZiBncmVhdGVyXG4gICAgICogdGhlbiB0aGUgY29tcGFyZWQgdmVyc2lvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VmVyc2lvbn0gdmVyc2lvbiBWZXJzaW9uIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGNvbXBhcmVUbyh2ZXJzaW9uKSB7XG5cbiAgICAgICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBWZXJzaW9uKSB7XG4gICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgIG5ldyBFcnJvcihcInR5cGUgZXhjZXB0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcnNpb24gPT09IHRoaXMudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYSA9IFt0aGlzLm1ham9yLCB0aGlzLm1pbm9yLCB0aGlzLnBhdGNoXTtcbiAgICAgICAgbGV0IGIgPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGxldCBsZW4gPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmICgoYVtpXSAmJiAhYltpXSAmJiBwYXJzZUludChhW2ldKSA+IDApIHx8IChwYXJzZUludChhW2ldKSA+IHBhcnNlSW50KGJbaV0pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoYltpXSAmJiAhYVtpXSAmJiBwYXJzZUludChiW2ldKSA+IDApIHx8IChwYXJzZUludChhW2ldKSA8IHBhcnNlSW50KGJbaV0pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbn1cblxubGV0IG1vbnN0ZXJWZXJzaW9uO1xuXG4vKipcbiAqIFZlcnNpb24gb2YgbW9uc3RlclxuICpcbiAqIFlvdSBjYW4gY2FsbCB0aGUgbWV0aG9kIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYE1vbnN0ZXIuZ2V0VmVyc2lvbigpYC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtNb25zdGVyfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS8vbW9uc3Rlci5tanMnO1xuICogY29uc29sZS5sb2coTW9uc3Rlci5nZXRWZXJzaW9uKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyBpbnRlZ3JhdGUgdGhpcyBmdW5jdGlvbiBpbmRpdmlkdWFsbHkuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Z2V0TW9uc3RlclZlcnNpb259IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL3ZlcnNpb24ubWpzJztcbiAqIGNvbnNvbGUubG9nKGdldE1vbnN0ZXJWZXJzaW9uKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHtNb25zdGVyLlR5cGVzLlZlcnNpb259XG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0TW9uc3RlclZlcnNpb24oKSB7XG4gICAgaWYgKG1vbnN0ZXJWZXJzaW9uIGluc3RhbmNlb2YgVmVyc2lvbikge1xuICAgICAgICByZXR1cm4gbW9uc3RlclZlcnNpb247XG4gICAgfVxuICAgIC8qKiNAKyBkb250IHRvdWNoLCByZXBsYWNlZCBieSBtYWtlIHdpdGggcGFja2FnZS5qc29uIHZlcnNpb24gKi9cbiAgICBtb25zdGVyVmVyc2lvbiA9IG5ldyBWZXJzaW9uKCcxLjMxLjAnKVxuICAgIC8qKiNALSovXG5cbiAgICByZXR1cm4gbW9uc3RlclZlcnNpb247XG5cbn1cbiIsICJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7VmVyc2lvbixnZXRNb25zdGVyVmVyc2lvbn0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy92ZXJzaW9uLm1qc1wiO1xuXG5kZXNjcmliZSgnTW9uc3RlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCcuZ2V0TW9uc3RlclZlcnNpb24oKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG1vbnN0ZXJWZXJzaW9uXG5cbiAgICAvKiojQCsgZG9udCB0b3VjaCwgcmVwbGFjZWQgYnkgbWFrZSB3aXRoIHBhY2thZ2UuanNvbiB2ZXJzaW9uICovXG4gICAgbW9uc3RlclZlcnNpb24gPSBuZXcgVmVyc2lvbignMS4zMS4wJylcbiAgICAvKiojQC0qL1xuXG4gICAgICAgIGxldCBtID0gZ2V0TW9uc3RlclZlcnNpb24oKTtcblxuICAgICAgICBpdCgnc2hvdWxkICcgKyBtb25zdGVyVmVyc2lvbiArICcgaXMgJyArIG0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChtLmNvbXBhcmVUbyhtb25zdGVyVmVyc2lvbikpLmlzLmVxdWFsKDApO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVJbnRlZ2VyfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge0xvZ0VudHJ5fSBmcm9tIFwiLi9sb2dlbnRyeS5tanNcIjtcbmltcG9ydCB7QUxMLCBERUJVRywgRVJST1IsIEZBVEFMLCBJTkZPLCBPRkYsIFRSQUNFLCBXQVJOfSBmcm9tIFwiLi9sb2dnZXIubWpzXCI7XG5cbmV4cG9ydCB7SGFuZGxlcn1cblxuLyoqXG4gKiBUaGUgbG9nIGhhbmRsZXIgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBsb2cgZW50cmllcyBhbmQgdGhlIGxvZyBsaXN0ZW5lcnMuXG4gKiBcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0lEfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9sb2dnaW5nL2hhbmRsZXIubWpzJztcbiAqIGNvbnNvbGUubG9nKG5ldyBIYW5kbGVyKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuIGNsYXNzIEhhbmRsZXIgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9nbGV2ZWxcbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxvZ2xldmVsID0gT0ZGO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgbG9nIGZ1bmN0aW9uLiB0aGlzIG1ldGhvZCBtdXN0IGJlXG4gICAgICogb3ZlcndyaXR0ZW4gYnkgZGVyaXZlZCBoYW5kbGVycyB3aXRoIHRoZWlyIG93biBsb2dpYy5cbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xvZ0VudHJ5fSBlbnRyeVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGxvZyhlbnRyeSkge1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKGVudHJ5LCBMb2dFbnRyeSk7XG5cbiAgICAgICAgaWYgKHRoaXMubG9nbGV2ZWwgPCBlbnRyeS5nZXRMb2dMZXZlbCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXQgbG9nbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbG9nbGV2ZWxcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBzZXRMb2dMZXZlbChsb2dsZXZlbCkge1xuICAgICAgICB2YWxpZGF0ZUludGVnZXIobG9nbGV2ZWwpXG4gICAgICAgIHRoaXMubG9nbGV2ZWwgPSBsb2dsZXZlbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IGxvZ2xldmVsXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7aW50ZWdlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBnZXRMb2dMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nbGV2ZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFNldCBsb2cgbGV2ZWwgdG8gQWxsXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBzZXRBbGwoKSB7XG4gICAgICAgIHRoaXMuc2V0TG9nTGV2ZWwoQUxMKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBsb2cgbGV2ZWwgdG8gVHJhY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIYW5kbGVyfVxuICAgICAqIEBzaW5jZSAxLjUuMFxuICAgICAqL1xuICAgIHNldFRyYWNlKCkge1xuICAgICAgICB0aGlzLnNldExvZ0xldmVsKFRSQUNFKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBsb2cgbGV2ZWwgdG8gRGVidWdcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIYW5kbGVyfVxuICAgICAqIEBzaW5jZSAxLjUuMFxuICAgICAqL1xuICAgIHNldERlYnVnKCkge1xuICAgICAgICB0aGlzLnNldExvZ0xldmVsKERFQlVHKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBsb2cgbGV2ZWwgdG8gSW5mb1xuICAgICAqXG4gICAgICogQHJldHVybnMge0hhbmRsZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgc2V0SW5mbygpIHtcbiAgICAgICAgdGhpcy5zZXRMb2dMZXZlbChJTkZPKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBsb2cgbGV2ZWwgdG8gV2FyblxuICAgICAqXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBzZXRXYXJuKCkge1xuICAgICAgICB0aGlzLnNldExvZ0xldmVsKFdBUk4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IGxvZyBsZXZlbCB0byBFcnJvclxuICAgICAqXG4gICAgICogQHJldHVybnMge0hhbmRsZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgc2V0RXJyb3IoKSB7XG4gICAgICAgIHRoaXMuc2V0TG9nTGV2ZWwoRVJST1IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IGxvZyBsZXZlbCB0byBGYXRhbFxuICAgICAqXG4gICAgICogQHJldHVybnMge0hhbmRsZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgc2V0RmF0YWwoKSB7XG4gICAgICAgIHRoaXMuc2V0TG9nTGV2ZWwoRkFUQUwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5cbiAgICAvKipcbiAgICAgKiBTZXQgbG9nIGxldmVsIHRvIE9mZlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hhbmRsZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgc2V0T2ZmKCkge1xuICAgICAgICB0aGlzLnNldExvZ0xldmVsKE9GRik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge3ZhbGlkYXRlSW50ZWdlcn0gZnJvbSAnLi4vdHlwZXMvdmFsaWRhdGUubWpzJztcblxuZXhwb3J0IHtMb2dFbnRyeX1cblxuLyoqXG4gKiBBIGxvZyBlbnRyeSBmb3IgdGhlIGxvZ2dlclxuICogXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtJRH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvbG9nZ2luZy9sb2dlbnRyeS5tanMnO1xuICogY29uc29sZS5sb2cobmV3IExvZ0VudHJ5KCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuIGNsYXNzIExvZ0VudHJ5IGV4dGVuZHMgQmFzZSB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGxvZ2xldmVsXG4gICAgICogQHBhcmFtIHsuLi4qfSBhcmdzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobG9nbGV2ZWwsIC4uLmFyZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdmFsaWRhdGVJbnRlZ2VyKGxvZ2xldmVsKTtcblxuICAgICAgICB0aGlzLmxvZ2xldmVsID0gbG9nbGV2ZWxcbiAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmdzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7aW50ZWdlcnJ9XG4gICAgICovXG4gICAgZ2V0TG9nTGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvZ2xldmVsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7YXJyYXl9XG4gICAgICovXG4gICAgZ2V0QXJndW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmd1bWVudHNcbiAgICB9XG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0hhbmRsZXJ9IGZyb20gJy4uL2xvZ2dpbmcvaGFuZGxlci5tanMnO1xuaW1wb3J0IHtMb2dFbnRyeX0gZnJvbSAnLi4vbG9nZ2luZy9sb2dlbnRyeS5tanMnO1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcbmltcG9ydCB7dmFsaWRhdGVJbnRlZ2VyLCB2YWxpZGF0ZU9iamVjdCwgdmFsaWRhdGVTdHJpbmd9IGZyb20gJy4uL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG5cbmV4cG9ydCB7TG9nZ2VyLCBBTEwsIFRSQUNFLCBERUJVRywgSU5GTywgV0FSTiwgRVJST1IsIEZBVEFMLCBPRkZ9O1xuXG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Mb2dnaW5nXG4gKi9cbmNvbnN0IEFMTCA9IDI1NTtcbi8qKlxuICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRlxuICogQHR5cGUge251bWJlcn1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuY29uc3QgVFJBQ0UgPSA2NDtcbi8qKlxuICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRlxuICogQHR5cGUge251bWJlcn1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuY29uc3QgREVCVUcgPSAzMjtcbi8qKlxuICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRlxuICogQHR5cGUge251bWJlcn1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuY29uc3QgSU5GTyA9IDE2O1xuLyoqXG4gKiBBTEwgPiBUUkFDRSA+IERFQlVHID4gSU5GTyA+IFdBUk4gPiBFUlJPUiA+IEZBVEFMID4gT0ZGXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuTG9nZ2luZ1xuICovXG5jb25zdCBXQVJOID0gODtcbi8qKlxuICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRlxuICogQHR5cGUge251bWJlcn1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuY29uc3QgRVJST1IgPSA0O1xuLyoqXG4gKiBBTEwgPiBUUkFDRSA+IERFQlVHID4gSU5GTyA+IFdBUk4gPiBFUlJPUiA+IEZBVEFMID4gT0ZGXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuTG9nZ2luZ1xuICovXG5jb25zdCBGQVRBTCA9IDI7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Mb2dnaW5nXG4gKi9cbmNvbnN0IE9GRiA9IDA7XG5cbi8qKlxuICogVGhlIGxvZ2dlciBpcyBhIGNsYXNzIHRoYXQgdGFrZXMgY2FyZSBvZiBsb2dnaW5nLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0lEfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9sb2dnaW5nL2xvZ2dlci5tanMnO1xuICogbmV3IExvZ2dlcigpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuY2xhc3MgTG9nZ2VyIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhhbmRsZXIgPSBuZXcgU2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIYW5kbGVyfSBoYW5kbGVyXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXG4gICAgICovXG4gICAgYWRkSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KGhhbmRsZXIpXG4gICAgICAgIGlmICghKGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXCIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZXIuYWRkKGhhbmRsZXIpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIYW5kbGVyfSBoYW5kbGVyXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXG4gICAgICovXG4gICAgcmVtb3ZlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KGhhbmRsZXIpXG4gICAgICAgIGlmICghKGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXCIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZXIuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBsb2cgVHJhY2UgbWVzc2FnZVxuICAgICAqXG4gICAgICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBsb2dUcmFjZSgpIHtcbiAgICAgICAgdHJpZ2dlckxvZy5hcHBseSh0aGlzLCBbVFJBQ0UsIC4uLmFyZ3VtZW50c10pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogbG9nIERlYnVnIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFyZ3VtZW50c1xuICAgICAqIEByZXR1cm5zIHtMb2dnZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgbG9nRGVidWcoKSB7XG4gICAgICAgIHRyaWdnZXJMb2cuYXBwbHkodGhpcywgW0RFQlVHLCAuLi5hcmd1bWVudHNdKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGxvZyBJbmZvIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBsb2dJbmZvKCkge1xuICAgICAgICB0cmlnZ2VyTG9nLmFwcGx5KHRoaXMsIFtJTkZPLCAuLi5hcmd1bWVudHNdKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGxvZyBXYXJuIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFyZ3VtZW50c1xuICAgICAqIEByZXR1cm5zIHtMb2dnZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgbG9nV2FybigpIHtcbiAgICAgICAgdHJpZ2dlckxvZy5hcHBseSh0aGlzLCBbV0FSTiwgLi4uYXJndW1lbnRzXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBsb2cgRXJyb3IgbWVzc2FnZVxuICAgICAqXG4gICAgICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBsb2dFcnJvcigpIHtcbiAgICAgICAgdHJpZ2dlckxvZy5hcHBseSh0aGlzLCBbRVJST1IsIC4uLmFyZ3VtZW50c10pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogbG9nIEZhdGFsIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFyZ3VtZW50c1xuICAgICAqIEByZXR1cm5zIHtMb2dnZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgbG9nRmF0YWwoKSB7XG4gICAgICAgIHRyaWdnZXJMb2cuYXBwbHkodGhpcywgW0ZBVEFMLCAuLi5hcmd1bWVudHNdKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuXG4gICAgLyoqXG4gICAgICogTGFiZWxzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGxldmVsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRMYWJlbChsZXZlbCkge1xuICAgICAgICB2YWxpZGF0ZUludGVnZXIobGV2ZWwpO1xuXG4gICAgICAgIGlmIChsZXZlbCA9PT0gQUxMKSByZXR1cm4gJ0FMTCc7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gVFJBQ0UpIHJldHVybiAnVFJBQ0UnO1xuICAgICAgICBpZiAobGV2ZWwgPT09IERFQlVHKSByZXR1cm4gJ0RFQlVHJztcbiAgICAgICAgaWYgKGxldmVsID09PSBJTkZPKSByZXR1cm4gJ0lORk8nO1xuICAgICAgICBpZiAobGV2ZWwgPT09IFdBUk4pIHJldHVybiAnV0FSTic7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gRVJST1IpIHJldHVybiAnRVJST1InO1xuICAgICAgICBpZiAobGV2ZWwgPT09IEZBVEFMKSByZXR1cm4gJ0ZBVEFMJztcbiAgICAgICAgaWYgKGxldmVsID09PSBPRkYpIHJldHVybiAnT0ZGJztcblxuICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMZXZlbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gICAgICogQHJldHVybnMge2ludGVnZXJ9XG4gICAgICovXG4gICAgZ2V0TGV2ZWwobGFiZWwpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcobGFiZWwpO1xuXG4gICAgICAgIGlmIChsYWJlbCA9PT0gJ0FMTCcpIHJldHVybiBBTEw7XG4gICAgICAgIGlmIChsYWJlbCA9PT0gJ1RSQUNFJykgcmV0dXJuIFRSQUNFO1xuICAgICAgICBpZiAobGFiZWwgPT09ICdERUJVRycpIHJldHVybiBERUJVRztcbiAgICAgICAgaWYgKGxhYmVsID09PSAnSU5GTycpIHJldHVybiBJTkZPO1xuICAgICAgICBpZiAobGFiZWwgPT09ICdXQVJOJykgcmV0dXJuIFdBUk47XG4gICAgICAgIGlmIChsYWJlbCA9PT0gJ0VSUk9SJykgcmV0dXJuIEVSUk9SO1xuICAgICAgICBpZiAobGFiZWwgPT09ICdGQVRBTCcpIHJldHVybiBGQVRBTDtcbiAgICAgICAgaWYgKGxhYmVsID09PSAnT0ZGJykgcmV0dXJuIE9GRjtcblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuXG5cbn1cblxuXG4vKipcbiAqIExvZyB0cmlnZ2VyblxuICpcbiAqIEBwYXJhbSB7aW50ZWdlcn0gbG9nbGV2ZWxcbiAqIEBwYXJhbSB7Kn0gYXJnc1xuICogQHJldHVybnMge0xvZ2dlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRyaWdnZXJMb2cobG9nbGV2ZWwsIC4uLmFyZ3MpIHtcbiAgICB2YXIgbG9nZ2VyID0gdGhpcztcblxuICAgIGZvciAobGV0IGhhbmRsZXIgb2YgbG9nZ2VyLmhhbmRsZXIpIHtcbiAgICAgICAgaGFuZGxlci5sb2cobmV3IExvZ0VudHJ5KGxvZ2xldmVsLCBhcmdzKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nZ2VyO1xuXG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7TG9nZ2VyLCBPRkYsIEFMTCwgVFJBQ0UsIERFQlVHLCBJTkZPLCBXQVJOLCBFUlJPUiwgRkFUQUx9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvbG9nZ2luZy9sb2dnZXIubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0xvZ2dpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IExvZ2dlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0xvZ2dlci5sb2dUcmFjZSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZ2dlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nZ2VyKCkubG9nVHJhY2UoXCJ0ZXN0XCIpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGRlc2NyaWJlKCdMb2dnZXIubG9nRGVidWcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ0RlYnVnKFwidGVzdFwiKSkudG8uaW5zdGFuY2VPZihMb2dnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBkZXNjcmliZSgnTG9nZ2VyLmxvZ0luZm8oKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ0luZm8oXCJ0ZXN0XCIpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGRlc2NyaWJlKCdMb2dnZXIubG9nV2FybigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZ2dlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nZ2VyKCkubG9nV2FybihcInRlc3RcIikpLnRvLmluc3RhbmNlT2YoTG9nZ2VyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgXG4gICAgZGVzY3JpYmUoJ0xvZ2dlci5sb2dFcnJvcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZ2dlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nZ2VyKCkubG9nRXJyb3IoXCJ0ZXN0XCIpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGRlc2NyaWJlKCdMb2dnZXIubG9nRmF0YWwoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ0ZhdGFsKFwidGVzdFwiKSkudG8uaW5zdGFuY2VPZihMb2dnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBkZXNjcmliZSgnTG9nZ2VyLmdldExldmVsKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnQUxMJywgQUxMXSxcbiAgICAgICAgICAgIFsnVFJBQ0UnLCBUUkFDRV0sXG4gICAgICAgICAgICBbJ0RFQlVHJywgREVCVUddLFxuICAgICAgICAgICAgWydJTkZPJywgSU5GT10sXG4gICAgICAgICAgICBbJ1dBUk4nLCBXQVJOXSxcbiAgICAgICAgICAgIFsnRVJST1InLCBFUlJPUl0sXG4gICAgICAgICAgICBbJ0ZBVEFMJywgRkFUQUxdLFxuICAgICAgICAgICAgWydPRkYnLCBPRkZdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KGEgKyAnIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmdldExldmVsKGEpKS50by5iZS5lcXVhbHMoYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0xvZ2dlci5nZXRMYWJlbCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBbXG4gICAgICAgICAgICBbJ0FMTCcsIEFMTF0sXG4gICAgICAgICAgICBbJ1RSQUNFJywgVFJBQ0VdLFxuICAgICAgICAgICAgWydERUJVRycsIERFQlVHXSxcbiAgICAgICAgICAgIFsnSU5GTycsIElORk9dLFxuICAgICAgICAgICAgWydXQVJOJywgV0FSTl0sXG4gICAgICAgICAgICBbJ0VSUk9SJywgRVJST1JdLFxuICAgICAgICAgICAgWydGQVRBTCcsIEZBVEFMXSxcbiAgICAgICAgICAgIFsnT0ZGJywgT0ZGXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdChhICsgJyBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2dnZXIoKS5nZXRMYWJlbChiKSkudG8uYmUuZXF1YWxzKGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0xvZ0VudHJ5fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvbG9nZW50cnkubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0xvZycsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCduZXcgTG9nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nRW50cnkoMSwgJ2EnLCAnYicsICdjJykpLnRvLmluc3RhbmNlT2YoTG9nRW50cnkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdMb2cubG9nbGV2ZWwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGxvZztcblxuICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxvZyA9IG5ldyBMb2dFbnRyeSgxLCBmYWxzZSwgJ3Rlc3QnLCA5OSwge2E6IHRydWV9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBsb2dsZXZlbCAxJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGxvZy5nZXRMb2dMZXZlbCgpKS50by5iZS5lcXVhbCgxKVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhcmd1bWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobG9nLmdldEFyZ3VtZW50cygpKS50by5oYXZlLmRlZXAubWVtYmVycyhbZmFsc2UsICd0ZXN0JywgOTksIHthOiB0cnVlfV0pXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi8uLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSBcIi4uLy4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7SGFuZGxlcn0gZnJvbSAnLi4vaGFuZGxlci5tanMnO1xuaW1wb3J0IHtMb2dFbnRyeX0gZnJvbSBcIi4uL2xvZ2VudHJ5Lm1qc1wiO1xuXG5leHBvcnQge0NvbnNvbGVIYW5kbGVyfVxuXG4vKipcbiAqIFlvdSBjYW4gY3JlYXRlIGFuIG9iamVjdCBvZiB0aGUgY2xhc3Mgc2ltcGx5IGJ5IHVzaW5nIHRoZSBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLkxvZ2dpbmcuSGFuZGxlci5Db25zb2xlSGFuZGxlcigpYC5cbiAqIFxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Q29uc29sZUhhbmRsZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2xvZ2dpbmcvaGFuZGxlci9jb25zb2xlLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhuZXcgQ29uc29sZUhhbmRsZXIoKSlcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuTG9nZ2luZy5IYW5kbGVyXG4gKi9cbiBjbGFzcyBDb25zb2xlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgY2VudHJhbCBsb2cgZnVuY3Rpb24uIHRoaXMgbWV0aG9kIG11c3QgYmVcbiAgICAgKiBvdmVyd3JpdHRlbiBieSBkZXJpdmVkIGhhbmRsZXJzIHdpdGggdGhlaXIgb3duIGxvZ2ljLlxuICAgICAqXG4gICAgICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG9nRW50cnl9IGVudHJ5XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgbG9nKGVudHJ5KSB7XG4gICAgICAgIGlmIChzdXBlci5sb2coZW50cnkpKSB7XG4gICAgICAgICAgICBsZXQgY29uc29sZSA9IGdldEdsb2JhbE9iamVjdCgnY29uc29sZScpO1xuICAgICAgICAgICAgaWYgKCFjb25zb2xlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlbnRyeS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuXG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIjtcbmltcG9ydCB7Q29uc29sZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvbG9nZ2luZy9oYW5kbGVyL2NvbnNvbGUubWpzXCI7XG5pbXBvcnQge0xvZ0VudHJ5fSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvbG9nZW50cnkubWpzXCI7XG5pbXBvcnQge0ZBVEFMfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvbG9nZ2VyLm1qc1wiO1xuXG5kZXNjcmliZSgnTG9nZ2luZycsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCdDb25zb2xlSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBDb25zb2xlSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29uc29sZUhhbmRsZXIoKSkudG8uYmUuaW5zdGFuY2VvZihDb25zb2xlSGFuZGxlcilcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBsb2cgdG8gY29uc29sZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29uc29sZUhhbmRsZXIoKS5zZXRBbGwoKS5sb2cobmV3IExvZ0VudHJ5KEZBVEFMLCBbMSwgdHJ1ZSwgJ21lc3NhZ2UnXSkpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCI7XG5pbXBvcnQge0FMTCwgVFJBQ0UsIERFQlVHLCBJTkZPLCBXQVJOLCBFUlJPUiwgRkFUQUwsIE9GRn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9sb2dnaW5nL2xvZ2dlci5tanNcIjtcbmltcG9ydCB7SGFuZGxlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9sb2dnaW5nL2hhbmRsZXIubWpzXCI7XG5pbXBvcnQge0xvZ0VudHJ5fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvbG9nZW50cnkubWpzXCI7XG5cbmRlc2NyaWJlKCdMb2dnaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0TG9nTGV2ZWwoKS5nZXRMb2dMZXZlbCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtBTExdLCBbVFJBQ0VdLCBbREVCVUddLCBbSU5GT10sIFtXQVJOXSwgW0VSUk9SXSwgW0ZBVEFMXSwgW09GRl0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgndGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHNldCB2YWx1ZSAnICsgYSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLnNldExvZ0xldmVsKGEpLmdldExvZ0xldmVsKCkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnSGFuZGxlci5sb2coKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkubG9nKG5ldyBMb2dFbnRyeSgwLCBcInRlc3RcIikpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdIYW5kbGVyLmxvZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBoYW5kbGVyO1xuXG4gICAgICAgIGNsYXNzIFRlc3RIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7XG4gICAgICAgICAgICBsb2coZW50cnkpIHtcbiAgICAgICAgICAgICAgICBzdXBlci5sb2coZW50cnkpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkubG9nKG5ldyBMb2dFbnRyeSgwLCBcInRlc3RcIikpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmxvZygpIHdpdGggbG9nbGV2ZWwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IFRlc3RIYW5kbGVyO1xuXG4gICAgICAgIGJlZm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBUZXN0SGFuZGxlciA9IGNsYXNzIGV4dGVuZHMgSGFuZGxlciB7XG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbHMgPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxvZyhsb2dsZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VwZXIubG9nKGxvZ2xldmVsKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxscysrXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBbIC8vIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICAgICAgICBbQUxMLCA2XSxcbiAgICAgICAgICAgIFtUUkFDRSwgNl0sXG4gICAgICAgICAgICBbREVCVUcsIDVdLFxuICAgICAgICAgICAgW0lORk8sIDRdLFxuICAgICAgICAgICAgW1dBUk4sIDNdLFxuICAgICAgICAgICAgW0VSUk9SLCAyXSxcbiAgICAgICAgICAgIFtGQVRBTCwgMV0sXG4gICAgICAgICAgICBbT0ZGLCAwXVxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdpcy5sb2coJyArIGEgKyAnKSBzaG91bGQgbG9nICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKS5zZXRMb2dMZXZlbChhKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmxvZyhuZXcgTG9nRW50cnkoVFJBQ0UpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmxvZyhuZXcgTG9nRW50cnkoREVCVUcpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmxvZyhuZXcgTG9nRW50cnkoSU5GTykpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIubG9nKG5ldyBMb2dFbnRyeShXQVJOKSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5sb2cobmV3IExvZ0VudHJ5KEVSUk9SKSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5sb2cobmV3IExvZ0VudHJ5KEZBVEFMKSk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoaGFuZGxlci5jYWxscykuaXMuZXF1YWwoYilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdIYW5kbGVyLnNldExvZ0xldmVsKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLnNldExvZ0xldmVsKEFMTCkpLnRvLmluc3RhbmNlT2YoSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuZ2V0TG9nTGV2ZWwoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ25ldyBsb2dnZXIgc2hvdWxkIGJlIDAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5nZXRMb2dMZXZlbCgpKS50by5iZS5lcXVhbChPRkYpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdIYW5kbGVyLnNldEFsbCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnIHNob3VsZCBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5zZXRBbGwoKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0VHJhY2UoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ25ldyBsb2dnZXIgc2hvdWxkIGluc3RhbmNlb2YgSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLnNldFRyYWNlKCkpLnRvLmluc3RhbmNlT2YoSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdIYW5kbGVyLnNldERlYnVnKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCcgc2hvdWxkIGluc3RhbmNlb2YgSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLnNldERlYnVnKCkpLnRvLmluc3RhbmNlT2YoSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdIYW5kbGVyLnNldEluZm8oKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0SW5mbygpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRXYXJuKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCcgc2hvdWxkIGluc3RhbmNlb2YgSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLnNldFdhcm4oKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0RXJyb3IoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0RXJyb3IoKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0RmF0YWwoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0RmF0YWwoKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0T2ZmKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLnNldE9mZigpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn0pOyIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7UGlwZX0gZnJvbSBcIi4uL2RhdGEvcGlwZS5tanNcIjtcblxuaW1wb3J0IHtCYXNlV2l0aE9wdGlvbnN9IGZyb20gXCIuLi90eXBlcy9iYXNld2l0aG9wdGlvbnMubWpzXCI7XG5pbXBvcnQge2lzT2JqZWN0LCBpc1N0cmluZ30gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUFycmF5LCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtnZXRNb25zdGVyVmVyc2lvbn0gZnJvbSBcIi4uL3R5cGVzL3ZlcnNpb24ubWpzXCI7XG5cbmV4cG9ydCB7Rm9ybWF0dGVyfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbE9iamVjdFN5bWJvbCA9IFN5bWJvbCgnaW50ZXJuYWxPYmplY3QnKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgd2F0Y2hkb2dTeW1ib2wgPSBTeW1ib2woJ3dhdGNoZG9nJyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IG1hcmtlck9wZW5JbmRleFN5bWJvbCA9IFN5bWJvbCgnbWFya2VyT3BlbkluZGV4Jyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IG1hcmtlckNsb3NlSW5kZXhTeW1ib2wgPSBTeW1ib2woJ21hcmtlcmNsb3NlSW5kZXgnKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3Qgd29ya2luZ0RhdGFTeW1ib2wgPSBTeW1ib2woJ3dvcmtpbmdEYXRhJyk7XG5cblxuLyoqXG4gKiBNZXNzYWdlcyBjYW4gYmUgZm9ybWF0dGVkIHdpdGggdGhlIGZvcm1hdHRlci4gVG8gZG8gdGhpcywgYW4gb2JqZWN0IHdpdGggdGhlIHZhbHVlcyBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZm9ybWF0dGVyLiBUaGUgbWVzc2FnZSBjYW4gdGhlbiBjb250YWluIHBsYWNlaG9sZGVycy5cbiAqXG4gKiBMb29rIGF0IHRoZSBleGFtcGxlIGJlbG93LiBUaGUgcGxhY2Vob2xkZXJzIHVzZSB0aGUgbG9naWMgb2YgUGlwZS5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3RleHQvZm9ybWF0dGVyLm1qcyc7XG4gKiBuZXcgRm9ybWF0dGVyKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogIyMgTWFya2VyIGluIG1hcmtlclxuICpcbiAqIE1hcmtlcnMgY2FuIGJlIG5lc3RlZC4gSGVyZSwgdGhlIGlubmVyIG1hcmtlciBpcyByZXNvbHZlZCBmaXJzdCBgJHtzdWJrZXl9IFx1MjFBNiAxID0gJHtteWtleTJ9YCBhbmQgdGhlbiB0aGUgb3V0ZXIgbWFya2VyIGAke215a2V5Mn1gLlxuICpcbiAqIGBgYFxuICogY29uc3QgdGV4dCA9ICcke215a2V5JHtzdWJrZXl9fSc7XG4gKiBsZXQgb2JqID0ge1xuICogIG15a2V5MjogXCIxXCIsXG4gKiAgc3Via2V5OiBcIjJcIlxuICogfTtcbiAqXG4gKiBuZXcgRm9ybWF0dGVyKG9iaikuZm9ybWF0KHRleHQpO1xuICogLy8gXHUyMUE2IDFcbiAqIGBgYFxuICpcbiAqICMjIENhbGxiYWNrc1xuICpcbiAqIFRoZSB2YWx1ZXMgaW4gYSBmb3JtYXR0ZXIgY2FuIGJlIGFkanVzdGVkIHZpYSB0aGUgY29tbWFuZHMgb2YgdGhlIGBUcmFuc2Zvcm1lcmAgb3IgdGhlYFBpcGVgLlxuICogVGhlcmUgaXMgYWxzbyB0aGUgcG9zc2liaWxpdHkgdG8gdXNlIGNhbGxiYWNrcy5cbiAqXG4gKiBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKHt4OiAnMSd9LCB7XG4gKiAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHtcbiAqICAgICAgICAgICAgICAgICAgICBxdW90ZTogKHZhbHVlKSA9PiB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCInXG4gKiAgICAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICB9KTtcbiAqXG4gKiBmb3JtYXR0ZXIuZm9ybWF0KCcke3ggfCBjYWxsOnF1b3RlfScpKVxuICogLy8gXHUyMUE2IFwiMVwiXG4gKlxuICogIyMgTWFya2VyIHdpdGggcGFyYW1ldGVyXG4gKlxuICogQSBzdHJpbmcgY2FuIGFsc28gYnJpbmcgaXRzIG93biB2YWx1ZXMuIFRoZXNlIG11c3QgdGhlbiBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUga2V5IGJ5IGEgc2VwYXJhdG9yIGA6OmAuXG4gKiBUaGUgdmFsdWVzIHRoZW1zZWx2ZXMgbXVzdCBiZSBzcGVjaWZpZWQgaW4ga2V5L3ZhbHVlIHBhaXJzLiBUaGUga2V5IG11c3QgYmUgc2VwYXJhdGVkIGZyb20gdGhlIHZhbHVlIGJ5IGEgc2VwYXJhdG9yIGA9YC5cbiAqXG4gKiBXaGVuIHVzaW5nIGEgcGlwZSwgeW91IG11c3QgcGF5IGF0dGVudGlvbiB0byB0aGUgc2VwYXJhdG9ycy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7Rm9ybWF0dGVyfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90ZXh0L2Zvcm1hdHRlci5tanMnO1xuICpcbiAqIG5ldyBGb3JtYXR0ZXIoe1xuICogICAgICAgYToge1xuICogICAgICAgICAgIGI6IHtcbiAqICAgICAgICAgICAgICAgYzogXCJIZWxsb1wiXG4gKiAgICAgICAgICAgfSxcbiAqICAgICAgICAgICBkOiBcIndvcmxkXCIsXG4gKiAgICAgICB9XG4gKiAgIH0pLmZvcm1hdChcIiR7YS5iLmN9ICR7YS5kIHwgdWNmaXJzdH0hXCIpOyAvLyB3aXRoIHBpcGVcbiAqXG4gKiAvLyBcdTIxQTYgSGVsbG8gV29ybGQhXG4gKlxuICogQHNpbmNlIDEuMTIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlRleHRcbiAqL1xuIGNsYXNzIEZvcm1hdHRlciBleHRlbmRzIEJhc2VXaXRoT3B0aW9ucyB7XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG1hcmtlcnMgYXJlIGAke2AgYW5kIGB9YFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob2JqZWN0LCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzW2ludGVybmFsT2JqZWN0U3ltYm9sXSA9IG9iamVjdCB8fCB7fVxuICAgICAgICB0aGlzW21hcmtlck9wZW5JbmRleFN5bWJvbF0gPSAwO1xuICAgICAgICB0aGlzW21hcmtlckNsb3NlSW5kZXhTeW1ib2xdID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gbWFya2VyXG4gICAgICogQHByb3BlcnR5IHthcnJheX0gbWFya2VyLm9wZW49W1wiJHtcIl1cbiAgICAgKiBAcHJvcGVydHkge2FycmF5fSBtYXJrZXIuY2xvc2U9W1wiJHtcIl1cbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gcGFyYW1ldGVyXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlci5kZWxpbWl0ZXI9XCI6OlwiXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlci5hc3NpZ25tZW50PVwiPVwiXG4gICAgICogQHByb3BlcnR5IHtvYmplY3R9IGNhbGxiYWNrcz17fVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgICAgICAgIG1hcmtlcjoge1xuICAgICAgICAgICAgICAgIG9wZW46IFsnJHsnXSxcbiAgICAgICAgICAgICAgICBjbG9zZTogWyd9J11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6ICc6OicsXG4gICAgICAgICAgICAgICAgYXNzaWdubWVudDogJz0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FsbGJhY2tzOiB7fSxcbiAgICAgICAgfSlcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFNldCBuZXcgUGFyYW1ldGVyIENoYXJhY3RlclxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBjaGFycyBhcmUgYDo6YCBhbmQgYD1gXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBmb3JtYXR0ZXIuc2V0UGFyYW1ldGVyQ2hhcnMoJyMnKTtcbiAgICAgKiBmb3JtYXR0ZXIuc2V0UGFyYW1ldGVyQ2hhcnMoJ1snLCddJyk7XG4gICAgICogZm9ybWF0dGVyLnNldFBhcmFtZXRlckNoYXJzKCdpMThueycsJ30nKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZWxpbWl0ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXNzaWdubWVudFxuICAgICAqIEByZXR1cm4ge0Zvcm1hdHRlcn1cbiAgICAgKiBAc2luY2UgMS4yNC4wXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBzZXRQYXJhbWV0ZXJDaGFycyhkZWxpbWl0ZXIsIGFzc2lnbm1lbnQpIHtcblxuICAgICAgICBpZiAoZGVsaW1pdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdWydwYXJhbWV0ZXInXVsnZGVsaW1pdGVyJ10gPSB2YWxpZGF0ZVN0cmluZyhkZWxpbWl0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2lnbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF1bJ3BhcmFtZXRlciddWydhc3NpZ25tZW50J10gPSB2YWxpZGF0ZVN0cmluZyhhc3NpZ25tZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBuZXcgTWFya2VyXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG1hcmtlcnMgYXJlIGAke2AgYW5kIGB9YFxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZm9ybWF0dGVyLnNldE1hcmtlcignIycpOyAvLyBvcGVuIGFuZCBjbG9zZSBhcmUgYm90aCAjXG4gICAgICogZm9ybWF0dGVyLnNldE1hcmtlcignWycsJ10nKTtcbiAgICAgKiBmb3JtYXR0ZXIuc2V0TWFya2VyKCdpMThueycsJ30nKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfSBvcGVuXG4gICAgICogQHBhcmFtIHthcnJheXxzdHJpbmd8dW5kZWZpbmVkfSBjbG9zZVxuICAgICAqIEByZXR1cm4ge0Zvcm1hdHRlcn1cbiAgICAgKiBAc2luY2UgMS4xMi4wXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBzZXRNYXJrZXIob3BlbiwgY2xvc2UpIHtcblxuICAgICAgICBpZiAoY2xvc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xvc2UgPSBvcGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzU3RyaW5nKG9wZW4pKSBvcGVuID0gW29wZW5dO1xuICAgICAgICBpZiAoaXNTdHJpbmcoY2xvc2UpKSBjbG9zZSA9IFtjbG9zZV07XG5cbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF1bJ21hcmtlciddWydvcGVuJ10gPSB2YWxpZGF0ZUFycmF5KG9wZW4pO1xuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXVsnbWFya2VyJ11bJ2Nsb3NlJ10gPSB2YWxpZGF0ZUFycmF5KGNsb3NlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0b28gZGVlcCBuZXN0aW5nXG4gICAgICovXG4gICAgZm9ybWF0KHRleHQpIHtcbiAgICAgICAgdGhpc1t3YXRjaGRvZ1N5bWJvbF0gPSAwO1xuICAgICAgICB0aGlzW21hcmtlck9wZW5JbmRleFN5bWJvbF0gPSAwO1xuICAgICAgICB0aGlzW21hcmtlckNsb3NlSW5kZXhTeW1ib2xdID0gMDtcbiAgICAgICAgdGhpc1t3b3JraW5nRGF0YVN5bWJvbF0gPSB7fTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdC5jYWxsKHRoaXMsIHRleHQpO1xuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdCh0ZXh0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBzZWxmW3dhdGNoZG9nU3ltYm9sXSsrO1xuICAgIGlmICh0aGlzW3dhdGNoZG9nU3ltYm9sXSA+IDIwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndG9vIGRlZXAgbmVzdGluZycpXG4gICAgfVxuXG4gICAgbGV0IG9wZW5NYXJrZXIgPSBzZWxmW2ludGVybmFsU3ltYm9sXVsnbWFya2VyJ11bJ29wZW4nXT8uW3RoaXNbbWFya2VyT3BlbkluZGV4U3ltYm9sXV07XG4gICAgbGV0IGNsb3NlTWFya2VyID0gc2VsZltpbnRlcm5hbFN5bWJvbF1bJ21hcmtlciddWydjbG9zZSddPy5bdGhpc1ttYXJrZXJDbG9zZUluZGV4U3ltYm9sXV07XG5cbiAgICAvLyBjb250YWlucyBubyBwbGFjZWhvbGRlcnNcbiAgICBpZiAodGV4dC5pbmRleE9mKG9wZW5NYXJrZXIpID09PSAtMSB8fCB0ZXh0LmluZGV4T2YoY2xvc2VNYXJrZXIpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gdG9rZW5pemUuY2FsbCh0aGlzLCB2YWxpZGF0ZVN0cmluZyh0ZXh0KSwgb3Blbk1hcmtlciwgY2xvc2VNYXJrZXIpXG5cbiAgICBpZiAoc2VsZltpbnRlcm5hbFN5bWJvbF1bJ21hcmtlciddWydvcGVuJ10/Llt0aGlzW21hcmtlck9wZW5JbmRleFN5bWJvbF0gKyAxXSkge1xuICAgICAgICB0aGlzW21hcmtlck9wZW5JbmRleFN5bWJvbF0rKztcbiAgICB9XG5cbiAgICBpZiAoc2VsZltpbnRlcm5hbFN5bWJvbF1bJ21hcmtlciddWydjbG9zZSddPy5bdGhpc1ttYXJrZXJDbG9zZUluZGV4U3ltYm9sXSArIDFdKSB7XG4gICAgICAgIHRoaXNbbWFya2VyQ2xvc2VJbmRleFN5bWJvbF0rKztcbiAgICB9XG5cbiAgICByZXN1bHQgPSBmb3JtYXQuY2FsbChzZWxmLCByZXN1bHQpXG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS4xMi4wXG4gKiBAcGFyYW0gdGV4dFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB0b2tlbml6ZSh0ZXh0LCBvcGVuTWFya2VyLCBjbG9zZU1hcmtlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgbGV0IGZvcm1hdHRlZCA9IFtdO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyQXNzaWdubWVudCA9IHNlbGZbaW50ZXJuYWxTeW1ib2xdWydwYXJhbWV0ZXInXVsnYXNzaWdubWVudCddXG4gICAgY29uc3QgcGFyYW1ldGVyRGVsaW1pdGVyID0gc2VsZltpbnRlcm5hbFN5bWJvbF1bJ3BhcmFtZXRlciddWydkZWxpbWl0ZXInXVxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHNlbGZbaW50ZXJuYWxTeW1ib2xdWydjYWxsYmFja3MnXTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG5cbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSB0ZXh0LmluZGV4T2Yob3Blbk1hcmtlcik7XG4gICAgICAgIC8vIG5vIG1hcmtlciBcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWQucHVzaCh0ZXh0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0SW5kZXggPiAwKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWQucHVzaCh0ZXh0LnN1YnN0cmluZygwLCBzdGFydEluZGV4KSlcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdGFydEluZGV4KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVuZEluZGV4ID0gdGV4dC5zdWJzdHJpbmcob3Blbk1hcmtlci5sZW5ndGgpLmluZGV4T2YoY2xvc2VNYXJrZXIpO1xuICAgICAgICBpZiAoZW5kSW5kZXggIT09IC0xKSBlbmRJbmRleCArPSBvcGVuTWFya2VyLmxlbmd0aDtcbiAgICAgICAgbGV0IGluc2lkZVN0YXJ0SW5kZXggPSB0ZXh0LnN1YnN0cmluZyhvcGVuTWFya2VyLmxlbmd0aCkuaW5kZXhPZihvcGVuTWFya2VyKTtcbiAgICAgICAgaWYgKGluc2lkZVN0YXJ0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBpbnNpZGVTdGFydEluZGV4ICs9IG9wZW5NYXJrZXIubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGluc2lkZVN0YXJ0SW5kZXggPCBlbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0b2tlbml6ZS5jYWxsKHNlbGYsIHRleHQuc3Vic3RyaW5nKGluc2lkZVN0YXJ0SW5kZXgpLCBvcGVuTWFya2VyLCBjbG9zZU1hcmtlcik7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluc2lkZVN0YXJ0SW5kZXgpICsgcmVzdWx0XG4gICAgICAgICAgICAgICAgZW5kSW5kZXggPSB0ZXh0LnN1YnN0cmluZyhvcGVuTWFya2VyLmxlbmd0aCkuaW5kZXhPZihjbG9zZU1hcmtlcik7XG4gICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ICE9PSAtMSkgZW5kSW5kZXggKz0gb3Blbk1hcmtlci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzeW50YXggZXJyb3IgaW4gZm9ybWF0dGVyIHRlbXBsYXRlXCIpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQga2V5ID0gdGV4dC5zdWJzdHJpbmcob3Blbk1hcmtlci5sZW5ndGgsIGVuZEluZGV4KTtcbiAgICAgICAgbGV0IHBhcnRzID0ga2V5LnNwbGl0KHBhcmFtZXRlckRlbGltaXRlcik7XG4gICAgICAgIGxldCBjdXJyZW50UGlwZSA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICAgICAgc2VsZlt3b3JraW5nRGF0YVN5bWJvbF0gPSBleHRlbmQoe30sIHNlbGZbaW50ZXJuYWxPYmplY3RTeW1ib2xdLCBzZWxmW3dvcmtpbmdEYXRhU3ltYm9sXSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBrdiBvZiBwYXJ0cykge1xuICAgICAgICAgICAgY29uc3QgW2ssIHZdID0ga3Yuc3BsaXQocGFyYW1ldGVyQXNzaWdubWVudCk7XG4gICAgICAgICAgICBzZWxmW3dvcmtpbmdEYXRhU3ltYm9sXVtrXSA9IHY7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0MSA9IGtleS5zcGxpdCgnfCcpLnNoaWZ0KCkudHJpbSgpOyAvLyBwaXBlIHN5bWJvbFxuICAgICAgICBjb25zdCB0MiA9IHQxLnNwbGl0KCc6OicpLnNoaWZ0KCkudHJpbSgpOyAvLyBrZXkgdmFsdWUgZGVsaW1pdGVyXG4gICAgICAgIGNvbnN0IHQzID0gdDIuc3BsaXQoJy4nKS5zaGlmdCgpLnRyaW0oKTsgLy8gcGF0aCBkZWxpbWl0ZXJcbiAgICAgICAgbGV0IHByZWZpeCA9IHNlbGZbd29ya2luZ0RhdGFTeW1ib2xdPy5bdDNdID8gJ3BhdGg6JyA6ICdzdGF0aWM6JztcblxuICAgICAgICBsZXQgY29tbWFuZCA9IFwiXCI7XG4gICAgICAgIGlmIChwcmVmaXggJiYga2V5LmluZGV4T2YocHJlZml4KSAhPT0gMFxuICAgICAgICAgICAgJiYga2V5LmluZGV4T2YoJ3BhdGg6JykgIT09IDBcbiAgICAgICAgICAgICYmIGtleS5pbmRleE9mKCdzdGF0aWM6JykgIT09IDApIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBwcmVmaXg7XG4gICAgICAgIH1cblxuICAgICAgICBjb21tYW5kICs9IGN1cnJlbnRQaXBlO1xuXG4gICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgUGlwZShjb21tYW5kKTtcblxuICAgICAgICBpZiAoaXNPYmplY3QoY2FsbGJhY2tzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY2FsbGJhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGNhbGxiYWNrcykpIHtcbiAgICAgICAgICAgICAgICBwaXBlLnNldENhbGxiYWNrKG5hbWUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdHRlZC5wdXNoKHZhbGlkYXRlU3RyaW5nKHBpcGUucnVuKHNlbGZbd29ya2luZ0RhdGFTeW1ib2xdKSkpO1xuXG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyhlbmRJbmRleCArIGNsb3NlTWFya2VyLmxlbmd0aCk7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVkLmpvaW4oJycpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tIFwiLi4vZGF0YS9wYXRoZmluZGVyLm1qc1wiO1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlT2JqZWN0fSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtCYXNlV2l0aE9wdGlvbnN9XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyB3aXRoIG9wdGlvbnMgZnJvbSB3aGljaCBzb21lIG1vbnN0ZXIgY2xhc3NlcyBhcmUgZGVyaXZlZC5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGFjdHVhbGx5IG9ubHkgdXNlZCBhcyBhIGJhc2UgY2xhc3MuXG4gKlxuICogYGBgaHRtbFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0Jhc2VXaXRoT3B0aW9uc30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qcyc7XG4gKiBuZXcgQmFzZVdpdGhPcHRpb25zKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQ2xhc3NlcyB0aGF0IHJlcXVpcmUgdGhlIHBvc3NpYmlsaXR5IG9mIG9wdGlvbnMgY2FuIGJlIGRlcml2ZWQgZGlyZWN0bHkgZnJvbSB0aGlzIGNsYXNzLlxuICogRGVyaXZlZCBjbGFzc2VzIGFsbW9zdCBhbHdheXMgb3ZlcnJpZGUgdGhlIGBkZWZhdWxgIGdldHRlciB3aXRoIHRoZWlyIG93biB2YWx1ZXMuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogY2xhc3MgTXkgZXh0ZW5kcyBCYXNlV2l0aE9wdGlvbnMge1xuICogICAgZ2V0IGRlZmF1bHRzKCkge1xuICogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICogICAgICAgICAgICBteWtleTogdHJ1ZVxuICogICAgICAgIH0pO1xuICogICAgfSAgXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgY2xhc3Mgd2FzIGZvcm1lcmx5IGNhbGxlZCBPYmplY3QuXG4gKlxuICogQHNpbmNlIDEuMTMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmNsYXNzIEJhc2VXaXRoT3B0aW9ucyBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXSA9IGV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0cywgdmFsaWRhdGVPYmplY3Qob3B0aW9ucykpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBnZXR0ZXIgcHJvdmlkZXMgdGhlIG9wdGlvbnMuIERlcml2ZWQgY2xhc3NlcyBvdmVyd3JpdGVcbiAgICAgKiB0aGlzIGdldHRlciB3aXRoIHRoZWlyIG93biB2YWx1ZXMuIEl0IGlzIGdvb2Qga2FybWEgdG8gYWx3YXlzIGluY2x1ZGVcbiAgICAgKiB0aGUgdmFsdWVzIGZyb20gdGhlIHBhcmVudCBjbGFzcy5cbiAgICAgKlxuICAgICAqIGBgYGphdmFzY3JpcHRcbiAgICAgKiBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICogICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAqICAgICAgICAgbXlrZXk6IHRydWVcbiAgICAgKiAgICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBuZXN0ZWQgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHBhdGggYGEuYi5jYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZVxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICogQHNpbmNlIDEuMTAuMFxuICAgICAqL1xuICAgIGdldE9wdGlvbihwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBQYXRoZmluZGVyKHRoaXNbaW50ZXJuYWxTeW1ib2xdKS5nZXRWaWEocGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cblxufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0Zvcm1hdHRlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90ZXh0L2Zvcm1hdHRlci5tanNcIjtcblxuXG5kZXNjcmliZSgnRm9ybWF0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvNDdcbiAgICBkZXNjcmliZSgnZXhhbXBsZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3JmYyBleGFtcGxlIHNob3VsZCBydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcih7XG5cbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IFwiSGVsbG9cIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkOiBcIldvcmxkXCIsXG4gICAgICAgICAgICAgICAgICAgIGU6IDFcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pLmZvcm1hdChcIiR7YS5iLmN9ICR7YS5kIHwgdG91cHBlcn0hXCIpKS50by5iZS5lcXVhbCgnSGVsbG8gV09STEQhJyk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2RvYyBleGFtcGxlIHNob3VsZCBydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcih7XG5cbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IFwiSGVsbG9cIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkOiBcIndvcmxkXCIsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KS5mb3JtYXQoXCIke2EuYi5jfSAke2EuZCB8IHVjZmlyc3R9IVwiKSkudG8uYmUuZXF1YWwoJ0hlbGxvIFdvcmxkIScpO1xuICAgICAgICB9KVxuXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ3NldCBtYXJrZXIoKScsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnI2EjJywgJyMnLCB1bmRlZmluZWQsICd0ZXN0J10sXG4gICAgICAgICAgICBbJ3thfScsICd7JywgJ30nLCAndGVzdCddLFxuICAgICAgICAgICAgWydpMThue2F9JywgJ2kxOG57JywgJ30nLCAndGVzdCddLFxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnZm9ybWF0ICcgKyBhICsgJyB3aXRoIG1hcmtlciAnICsgYiArICcgYW5kICcgKyBjICsgJyBzaG91bGQgcmV0dXJuICAnICsgYiwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KFxuICAgICAgICAgICAgICAgICAgICBuZXcgRm9ybWF0dGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGE6IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgIH0pLnNldE1hcmtlcihiLCBjKS5mb3JtYXQoYSlcbiAgICAgICAgICAgICAgICApLnRvLmVxdWFsKGQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZXhhbXBsZXMoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJyR7YSB8IHRvanNvbn0nLCBcIntcXFwiYlxcXCI6e1xcXCJjXFxcIjpcXFwiSGVsbG9cXFwifSxcXFwiZFxcXCI6XFxcIldvcmxkXFxcIixcXFwiZVxcXCI6MX1cIl0sXG4gICAgICAgICAgICBbJ2NsaWNrICR7YS5kfSB0aW1lcycsIFwiY2xpY2sgV29ybGQgdGltZXNcIl0sXG4gICAgICAgICAgICBbJyAke2EuYi5jfSAnLCAnIEhlbGxvICddLFxuICAgICAgICAgICAgWycgJHthLmIuY30nLCAnIEhlbGxvJ10sXG4gICAgICAgICAgICBbJyR7YS5iLmN9ICcsICdIZWxsbyAnXSxcbiAgICAgICAgICAgIFsnJHthLmIuY30nLCAnSGVsbG8nXSxcbiAgICAgICAgICAgIFsnJHthLmIuY30ke2EuYi5jfScsICdIZWxsb0hlbGxvJ10sXG4gICAgICAgICAgICBbJyR7YS5iLmN9ICR7YS5iLmN9JywgJ0hlbGxvIEhlbGxvJ10sXG4gICAgICAgICAgICBbJyR7YS5iLmN9ICR7YS5iLmN9ICcsICdIZWxsbyBIZWxsbyAnXSxcbiAgICAgICAgICAgIFsnICR7YS5iLmN9ICR7YS5iLmN9ICcsICcgSGVsbG8gSGVsbG8gJ10sXG4gICAgICAgICAgICBbJyAke2EuYi5jfSAke2EuZH0gJywgJyBIZWxsbyBXb3JsZCAnXSxcbiAgICAgICAgICAgIFsnICR7YS5iLmN9ICR7YS5iLmMgfCB0b3VwcGVyIHwgbGVuZ3RoIHwgdG9zdHJpbmd9ICcsICcgSGVsbG8gNSAnXSxcblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdmb3JtYXQgJyArIGEgKyAnIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBcIkhlbGxvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkOiBcIldvcmxkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlOiAxXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgRm9ybWF0dGVyKG9iaikuZm9ybWF0KGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnTWFya2VyIGluIG1hcmtlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgdGV4dCA9ICcke215a2V5JHtzdWJrZXl9fSc7XG4gICAgICAgIGxldCBleHBlY3RlZCA9ICcxJztcblxuICAgICAgICBpdCgnZm9ybWF0ICcgKyB0ZXh0ICsgJyBzaG91bGQgJyArIGV4cGVjdGVkLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgbXlrZXkyOiBcIjFcIixcbiAgICAgICAgICAgICAgICBzdWJrZXk6IFwiMlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcihvYmopLmZvcm1hdCh0ZXh0KSkuaXMuZXF1YWwoZXhwZWN0ZWQpXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldFBhcmFtZXRlckNoYXJzKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3NldFBhcmFtZXRlckNoYXJzKCkgc2hvdWxkIHJldHVybiBJbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgRm9ybWF0dGVyKHt9KS5zZXRQYXJhbWV0ZXJDaGFycygnYScsICdiJykpLmlzLmluc3RhbmNlb2YoRm9ybWF0dGVyKTtcblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCd3aXRoIGNhbGxiYWNrcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnYWRkIGNhbGxiYWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcih7XG4gICAgICAgICAgICAgICAgeDogJzEnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICAgICAgICAgIG15OiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiFcIiArIHZhbHVlICsgXCIhXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QoZm9ybWF0dGVyLmZvcm1hdCgnJHt4IHwgY2FsbDpteX0nKSkuaXMuZXF1YWwoJyExIScpO1xuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdNYXJrZXIgaW4gbWFya2VyIHdpdGggcGFyYW1ldGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCB0ZXh0ID0gJyR7bXlrZXk6Om15a2V5PSR7c3Via2V5fX0nO1xuICAgICAgICBsZXQgZXhwZWN0ZWQgPSAnMic7XG5cbiAgICAgICAgaXQoJ2Zvcm1hdCAnICsgdGV4dCArICcgc2hvdWxkICcgKyBleHBlY3RlZCwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIHN1YmtleTogXCIyXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGV4cGVjdChuZXcgRm9ybWF0dGVyKG9iaikuZm9ybWF0KHRleHQpKS5pcy5lcXVhbChleHBlY3RlZClcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdleGNlcHRpb25zJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnJHthLmIueH0nLCBUeXBlRXJyb3JdLFxuICAgICAgICAgICAgWycke2EuYi5kIHwgdG91cHBlciB8IGxlbmd0aH0nLCBUeXBlRXJyb3JdLFxuICAgICAgICAgICAgWycke2EuYi5kfScsIFR5cGVFcnJvcl0sICAvLyBhLmIuZCByZXR1cm4gdW5kZWZpbmVkIGJ5IHBhdGhmaW5kZXIgXG4gICAgICAgICAgICBbJyR7YS5iLmQgfCB0b2xvd2VyfScsIFR5cGVFcnJvcl0sICAvLyBhLmIuZCByZXR1cm4gdW5kZWZpbmVkIGJ5IHBhdGhmaW5kZXIgXG4gICAgICAgICAgICBbJyR7YSB8IH0nLCBFcnJvcl0sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnZm9ybWF0ICcgKyBhICsgJyBzaG91bGQgdGhyb3cgJyArIHR5cGVvZiBiLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1hdHRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBcInRlc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ6IDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvcm1hdChhKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKS50by50aHJvdyhiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pOyIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uLy4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtMaW5rfSBmcm9tIFwiLi4vbGluay5tanNcIjtcblxuZXhwb3J0IHtTdHlsZXNoZWV0fVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgcmVzb3VyY2UgbWFuYWdlciB0byBlbWJlZCBleHRlcm5hbCByZXNvdXJjZXMuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7U3R5bGV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9yZXNvdXJjZS9saW5rL3N0eWxlc2hlZXQubWpzJztcbiAqIG5ldyBTdHlsZXNoZWV0KClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuMjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTS5SZXNvdXJjZVxuICogQHN1bW1hcnkgQSBSZXNvdXJjZSBjbGFzc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGlua1xuICovXG5jbGFzcyBTdHlsZXNoZWV0IGV4dGVuZHMgTGluayB7XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVsIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGluayNhdHRyLXJlbH1cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICByZWw6ICdzdHlsZXNoZWV0J1xuICAgICAgICB9KVxuICAgIH1cblxufVxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuLi8uLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7XG4gICAgQVRUUklCVVRFX0NMQVNTLFxuICAgIEFUVFJJQlVURV9IUkVGLFxuICAgIEFUVFJJQlVURV9JRCxcbiAgICBBVFRSSUJVVEVfTk9OQ0UsIEFUVFJJQlVURV9TUkMsXG4gICAgQVRUUklCVVRFX1RJVExFLCBBVFRSSUJVVEVfVFlQRSxcbiAgICBUQUdfTElOS1xufSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtLRVlfRE9DVU1FTlQsIHJlZmVyZW5jZVN5bWJvbCwgUmVzb3VyY2V9IGZyb20gXCIuLi9yZXNvdXJjZS5tanNcIjtcblxuZXhwb3J0IHtMaW5rfVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgcmVzb3VyY2UgbWFuYWdlciB0byBlbWJlZCBleHRlcm5hbCByZXNvdXJjZXMuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7TGlua30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3Jlc291cmNlL2xpbmsubWpzJztcbiAqIG5ldyBMaW5rKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuMjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTS5SZXNvdXJjZVxuICogQHN1bW1hcnkgQSBSZXNvdXJjZSBjbGFzc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGlua1xuICovXG5jbGFzcyBMaW5rIGV4dGVuZHMgUmVzb3VyY2Uge1xuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFzIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGluayNhdHRyLWFzfVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcm9zc09yaWdpbj1hbm9ueW1vdXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1jcm9zc29yaWdpbn1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGRpc2FibGVkXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGhyZWYge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaHJlZn1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaHJlZmxhbmcge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaHJlZmxhbmd9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGltYWdlc2l6ZXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaW1hZ2VzaXplc31cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaW1hZ2VzcmNzZXQge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaW1hZ2VzcmNzZXR9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGludGVncml0eSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1pbnRlZ3JpdHl9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGluayNhdHRyLW1lZGlhfVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcmVmZXRjaCB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1wcmVmZXRjaH1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVmZXJyZXJwb2xpY3kge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItcmVmZXJyZXJwb2xpY3l9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbCB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1yZWx9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItdHlwZX1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gc2l6ZXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItc2l6ZXN9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IG5vbmNlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItbm9uY2V9XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBocmVmOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBocmVmbGFuZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW1hZ2VzaXplczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW1hZ2VzcmNzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGludGVncml0eTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbWVkaWE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByZWZldGNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZWZlcnJlcnBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVsOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzaXplczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHlwZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9uY2U6IHVuZGVmaW5lZFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2UuTGlua31cbiAgICAgKi9cbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRVUkxBdHRyaWJ1dGUoKSB7XG4gICAgICAgIHJldHVybiBBVFRSSUJVVEVfSFJFRlxuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZS5MaW5rfVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBzZWxmLmdldE9wdGlvbihLRVlfRE9DVU1FTlQpO1xuICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX0xJTkspO1xuXG4gICAgZm9yIChsZXQga2V5IG9mIFsnYXMnLCdjcm9zc09yaWdpbicsJ2Rpc2FibGVkJywnaHJlZicsJ2hyZWZsYW5nJywnaW1hZ2VzaXplcycsJ2ltYWdlc3Jjc2V0JywnaW50ZWdyaXR5JywnbWVkaWEnLCdwcmVmZXRjaCcsJ3JlZmVycmVycG9saWN5Jywnc2l6ZXMnLCdyZWwnLCd0eXBlJyxBVFRSSUJVVEVfSFJFRixBVFRSSUJVVEVfSUQsQVRUUklCVVRFX0NMQVNTLEFUVFJJQlVURV9USVRMRSxBVFRSSUJVVEVfTk9OQ0VdKSB7XG4gICAgICAgIGlmIChzZWxmLmdldE9wdGlvbihrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXVtrZXldID0gc2VsZi5nZXRPcHRpb24oa2V5KTtcbiAgICAgICAgfVxuICAgIH0gICAgXG4gICAgXG4gICAgcmV0dXJuIHNlbGY7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtpbnRlcm5hbFN0YXRlU3ltYm9sLCBpbnRlcm5hbFN5bWJvbCx9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtCYXNlV2l0aE9wdGlvbnN9IGZyb20gXCIuLi90eXBlcy9iYXNld2l0aG9wdGlvbnMubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7SUR9IGZyb20gXCIuLi90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7aXNTdHJpbmd9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi90eXBlcy9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7UHJveHlPYnNlcnZlcn0gZnJvbSBcIi4uL3R5cGVzL3Byb3h5b2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge0FUVFJJQlVURV9DTEFTUywgQVRUUklCVVRFX0lELCBBVFRSSUJVVEVfVElUTEV9IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHtSZXNvdXJjZSwgS0VZX0RPQ1VNRU5ULCBLRVlfUVVFUlksIHJlZmVyZW5jZVN5bWJvbH1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgS0VZX0RPQ1VNRU5UID0gJ2RvY3VtZW50JztcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgS0VZX1FVRVJZID0gJ3F1ZXJ5JztcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgS0VZX1RJTUVPVVQgPSAndGltZW91dCc7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHJlZmVyZW5jZVN5bWJvbCA9IFN5bWJvbCgncmVmZXJlbmNlJyk7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIHJlc291cmNlcyB0byBiZSBsb2FkZWQuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7UmVzb3VyY2V9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9yZXNvdXJjZS5tanMnO1xuICogbmV3IFJlc291cmNlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuMjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHN1bW1hcnkgQSBSZXNvdXJjZSBjbGFzc1xuICovXG5jbGFzcyBSZXNvdXJjZSBleHRlbmRzIEJhc2VXaXRoT3B0aW9ucyB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fHVuZGVmaW5lZH0gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICAgICAgbGV0IHVyaSA9IHRoaXMuZ2V0T3B0aW9uKHRoaXMuY29uc3RydWN0b3IuZ2V0VVJMQXR0cmlidXRlKCkpO1xuXG4gICAgICAgIGlmICh1cmkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHNvdXJjZScpXG4gICAgICAgIH0gZWxzZSBpZiAodXJpIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICAgICAgICB1cmkgPSB1cmkudG9TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpbmcodXJpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCB1cmwgdHlwZScpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXVt0aGlzLmNvbnN0cnVjdG9yLmdldFVSTEF0dHJpYnV0ZSgpXSA9IHVyaTtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN0YXRlU3ltYm9sXSA9IG5ldyBQcm94eU9ic2VydmVyKHtcbiAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXNbcmVmZXJlbmNlU3ltYm9sXSA9IHVuZGVmaW5lZDtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG5cbiAgICAgICAgaWYgKHRoaXNbcmVmZXJlbmNlU3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tyZWZlcmVuY2VTeW1ib2xdLmlzQ29ubmVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgdGhlIHNwZWNpYWwgY2xhc3NlcyBhbmQgY3JlYXRlcyB0aGUgRE9NIG9iamVjdC5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBhbHNvIGNhbGxlZCBpbXBsaWNpdGx5LCBpZiBub3QgeWV0IGRvbmUgZXhwbGljaXRseSwgYnkgY2FsbGluZyBgY29ubmVjdCgpYC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlc1xuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlfVxuICAgICAqL1xuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXNcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYXBwZW5kcyB0aGUgSFRNTEVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBkb2N1bWVudC5cbiAgICAgKiBJZiB0aGUgZWxlbWVudCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQsIGBjcmVhdGUoKWAgaXMgY2FsbGVkIGltcGxpY2l0bHkuXG4gICAgICpcbiAgICAgKiB0aHJvd3Mge0Vycm9yfSB0YXJnZXQgbm90IGZvdW5kXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2V9XG4gICAgICovXG4gICAgY29ubmVjdCgpIHtcblxuICAgICAgICBpZiAoISh0aGlzW3JlZmVyZW5jZVN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhcHBlbmRUb0RvY3VtZW50LmNhbGwodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7RG9jdW1lbnR9IGRvY3VtZW50IHRoZSBkb2N1bWVudCBvYmplY3QgaW50byB3aGljaCB0aGUgbm9kZSBpcyB0byBiZSBhcHBlbmRlZFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzcmMvaHJlZiB1cmwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnkgZGVmaW5lcyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHJlc291cmNlIGlzIHRvIGJlIGhvb2tlZCBpbnRvIHRoZSBkb20uXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIGVsZW1lbnQgYXR0cmlidXRlIGlkXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIGVsZW1lbnQgYXR0cmlidXRlIHRpdGxlXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzIGVsZW1lbnQgYXR0cmlidXRlIGNsYXNzXG4gICAgICogQHByb3BlcnR5IHtpbnR9IHRpbWVvdXQgdGltZW91dFxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgICAgICAgIFt0aGlzLmNvbnN0cnVjdG9yLmdldFVSTEF0dHJpYnV0ZSgpXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgW0tFWV9ET0NVTUVOVF06IGdldEdsb2JhbE9iamVjdCgnZG9jdW1lbnQnKSxcbiAgICAgICAgICAgIFtLRVlfUVVFUlldOiAnaGVhZCcsXG4gICAgICAgICAgICBbS0VZX1RJTUVPVVRdOiAxMDAwMCxcbiAgICAgICAgICAgIFtBVFRSSUJVVEVfSURdOiAobmV3IElEKCdyZXNvdXJjZScpKS50b1N0cmluZygpLFxuICAgICAgICAgICAgW0FUVFJJQlVURV9DTEFTU106IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFtBVFRSSUJVVEVfVElUTEVdOiB1bmRlZmluZWRcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaXRoIGBhdmFpbGFibGUoKWAgeW91IGNhbiBjaGVjayBpZiBhIHJlc291cmNlIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIHRhZyBpcyBpbmNsdWRlZCBhbmQgdGhlIHJlc291cmNlIGlzIGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG4gICAgYXZhaWxhYmxlKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKCEoc2VsZltyZWZlcmVuY2VTeW1ib2xdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ25vIGVsZW1lbnQnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZWxmLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnZWxlbWVudCBub3QgY29ubmVjdGVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmW2ludGVybmFsU3RhdGVTeW1ib2xdLmdldFN1YmplY3QoKVsnbG9hZGVkJ10gPT09IHRydWUpIHtcblxuICAgICAgICAgICAgaWYgKHNlbGZbaW50ZXJuYWxTdGF0ZVN5bWJvbF0uZ2V0U3ViamVjdCgpWydlcnJvciddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5nZXRTdWJqZWN0KClbJ2Vycm9yJ10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICAgICAgICAgIH0sIHNlbGYuZ2V0T3B0aW9uKCd0aW1lb3V0JykpXG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgICAgc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5kZXRhY2hPYnNlcnZlcihvYnNlcnZlcik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5hdHRhY2hPYnNlcnZlcihvYnNlcnZlcik7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRVUkxBdHRyaWJ1dGUoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpO1xuICAgIH1cblxufVxuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiB0aHJvd3Mge0Vycm9yfSB0YXJnZXQgbm90IGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFRvRG9jdW1lbnQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCB0YXJnZXROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLmdldE9wdGlvbihLRVlfUVVFUlksICdoZWFkJykpXG4gICAgaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldCBub3QgZm91bmQnKVxuICAgIH1cblxuICAgIGFkZEV2ZW50cy5jYWxsKHNlbGYpO1xuICAgIHRhcmdldE5vZGUuYXBwZW5kQ2hpbGQoc2VsZltyZWZlcmVuY2VTeW1ib2xdKTtcblxuICAgIHJldHVybiBzZWxmO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHthZGRFdmVudHN9XG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50cygpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG5cbiAgICAgICAgc2VsZltyZWZlcmVuY2VTeW1ib2xdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXS5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcblxuICAgICAgICBzZWxmW2ludGVybmFsU3RhdGVTeW1ib2xdLnNldFN1YmplY3Qoe1xuICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgZXJyb3I6IHNlbGZbcmVmZXJlbmNlU3ltYm9sXVtzZWxmLmNvbnN0cnVjdG9yLmdldFVSTEF0dHJpYnV0ZSgpXSArICcgaXMgbm90IGF2YWlsYWJsZScsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9uTG9hZCA9ICgpID0+IHtcbiAgICAgICAgc2VsZltyZWZlcmVuY2VTeW1ib2xdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXS5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICAgICAgc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5nZXRTdWJqZWN0KClbJ2xvYWRlZCddID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkLCBmYWxzZSk7XG4gICAgc2VsZltyZWZlcmVuY2VTeW1ib2xdLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgZmFsc2UpO1xuXG4gICAgcmV0dXJuIHNlbGY7XG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBjaGFpIGZyb20gXCJjaGFpXCJcbmltcG9ydCB7U3R5bGVzaGVldH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVzb3VyY2UvbGluay9zdHlsZXNoZWV0Lm1qc1wiO1xuaW1wb3J0IHtEYXRhVXJsfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2RhdGF1cmwubWpzXCI7XG5pbXBvcnQge0lEfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7Y2xlYW51cERPTUZyb21UZXN0aW5nLCBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3Rpbmd9IGZyb20gXCIuLi8uLi8uLi8uLi91dGlsL2NsZWFudXBkb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcblxuYDtcblxuXG5kZXNjcmliZSgnU3R5bGVzaGVldCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oe1xuICAgICAgICAgICAgcnVuU2NyaXB0czogXCJkYW5nZXJvdXNseVwiLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBcInVzYWJsZVwiXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdTdHlsZXNoZWV0KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdjb25uZWN0KCkuYXZhaWxhYmxlKCknLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBjb25zdCBzdHlsZXNoZWV0ID0gbmV3IFN0eWxlc2hlZXQoe1xuICAgICAgICAgICAgICAgIGhyZWY6IG5ldyBEYXRhVXJsKCcnLCAndGV4dC9jc3MnKS50b1N0cmluZygpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHN0eWxlc2hlZXQuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gc3R5bGVzaGVldC5nZXRPcHRpb24oJ2lkJylcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFeHRlcm5hbCBTdHlsZXNoZWV0JywgKCkgPT4ge1xuXG4gICAgICAgIGxldCBpZCA9IG5ldyBJRCgnU3R5bGVzaGVldCcpLnRvU3RyaW5nKCk7XG4gICAgICAgIGxldCBzdHlsZXNoZWV0LCB1cmwgPSAnaHR0cHM6Ly9tb25zdGVyanMub3JnL2Fzc2V0cy9lbXB0eS5jc3M/JyArIGlkO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICBzdHlsZXNoZWV0ID0gbmV3IFN0eWxlc2hlZXQoe1xuICAgICAgICAgICAgICAgIGhyZWY6IHVybCxcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYXBwZW5kIGFuZCByZW1vdmUgU3R5bGVzaGVldCAnLCAoZG9uZSkgPT4ge1xuXG4gICAgICAgICAgICBleHBlY3Qoc3R5bGVzaGVldC5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgc3R5bGVzaGVldC5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHN0eWxlc2hlZXQuaXNDb25uZWN0ZWQoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS50by5leGlzdDtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc3R5bGVzaGVldC5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHN0eWxlc2hlZXQuaXNDb25uZWN0ZWQoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChzdHlsZXNoZWV0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG59KTsiLCAiLyoqKioqKioqXG5cbiBDb252ZXJ0IGNoYWktZG9tIDEuOC4xIHRvIGVzIG1vZHVsZSwgd2l0aG91dCBhbnkgb3RoZXIgbW9kaWZpY2F0aW9uLlxuIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL25hdGhhbmJva3RhZS9jaGFpLWRvbS9ibG9iLzg2YzM0MjMvY2hhaS1kb20uanNcbiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25hdGhhbmJva3RhZS9jaGFpLWRvbS9pc3N1ZXMvMzhcblxuIFVzYWdlOlxuIGltcG9ydCB7IGNoYWlEb20gfSBmcm9tICc8cGF0aC10bz4vY2hhaS1kb20nO1xuIGNoYWkudXNlKGNoYWlEb20pO1xuXG4gQ29weXJpZ2h0IChjKSAyMDE1IE5hdGhhbiBCbGFjayBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG5cbiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZS4gRm9yIGEgY29weSwgc2VlIDxodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVD4uXG5cbiAqKioqKioqKioqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2hhaURvbShjaGFpLCB1dGlscykge1xuICAgIHZhciBmbGFnID0gdXRpbHMuZmxhZyxcblxuICAgICAgICBlbFRvU3RyaW5nID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICAgIHZhciBkZXNjXG4gICAgICAgICAgICBpZiAoaXNOb2RlTGlzdChlbCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWwubGVuZ3RoID09PSAwKSByZXR1cm4gJ2VtcHR5IE5vZGVMaXN0J1xuICAgICAgICAgICAgICAgIGRlc2MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbCwgMCwgNSkubWFwKGVsVG9TdHJpbmcpLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZWwubGVuZ3RoID4gNSA/IGRlc2MgKyAnLi4uICgrJyArIChlbC5sZW5ndGggLSA1KSArICcgbW9yZSknIDogZGVzY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZWwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc2MgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIGlmIChlbC5pZCkge1xuICAgICAgICAgICAgICAgIGRlc2MgKz0gJyMnICsgZWwuaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbC5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjICs9ICcuJyArIFN0cmluZyhlbC5jbGFzc05hbWUpLnJlcGxhY2UoL1xccysvZywgJy4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZSAhPT0gJ2NsYXNzJyAmJiBhdHRyLm5hbWUgIT09ICdpZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzYyArPSAnWycgKyBhdHRyLm5hbWUgKyAoYXR0ci52YWx1ZSA/ICc9XCInICsgYXR0ci52YWx1ZSArICdcIl0nIDogJ10nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gZGVzY1xuICAgICAgICB9LFxuXG4gICAgICAgIGF0dHJBc3NlcnQgPSBmdW5jdGlvbihuYW1lLCB2YWwpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpLCBhY3R1YWwgPSBlbC5nZXRBdHRyaWJ1dGUobmFtZSlcblxuICAgICAgICAgICAgaWYgKCFmbGFnKHRoaXMsICduZWdhdGUnKSB8fCB1bmRlZmluZWQgPT09IHZhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAhIWVsLmF0dHJpYnV0ZXNbbmFtZV1cbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyB0byBoYXZlIGFuIGF0dHJpYnV0ZSAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgbm90IHRvIGhhdmUgYW4gYXR0cmlidXRlICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCBuYW1lXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodW5kZWZpbmVkICE9PSB2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgdmFsID09PSBhY3R1YWxcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyB0byBoYXZlIGFuIGF0dHJpYnV0ZSAnICsgdXRpbHMuaW5zcGVjdChuYW1lKSArICcgd2l0aCB0aGUgdmFsdWUgI3tleHB9LCBidXQgdGhlIHZhbHVlIHdhcyAje2FjdH0nXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgbm90IHRvIGhhdmUgYW4gYXR0cmlidXRlICcgKyB1dGlscy5pbnNwZWN0KG5hbWUpICsgJyB3aXRoIHRoZSB2YWx1ZSAje2FjdH0nXG4gICAgICAgICAgICAgICAgICAgICwgdmFsXG4gICAgICAgICAgICAgICAgICAgICwgYWN0dWFsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBhY3R1YWwpXG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNIVE1MRWxlbWVudCA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwubm9kZVR5cGUgPT09IDEgLy8gd2luZG93Lk5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNOb2RlTGlzdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBOb2RlTGlzdF0nXG4gICAgICAgIH1cblxuICAgIHV0aWxzLmVsVG9TdHJpbmcgPSBlbFRvU3RyaW5nXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdhdHRyJywgYXR0ckFzc2VydClcbiAgICBjaGFpLkFzc2VydGlvbi5hZGRNZXRob2QoJ2F0dHJpYnV0ZScsIGF0dHJBc3NlcnQpXG5cbiAgICBjaGFpLkFzc2VydGlvbi5hZGRNZXRob2QoJ2NsYXNzJywgZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSlcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSBjbGFzcyAje2V4cH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIGNsYXNzICN7ZXhwfSdcbiAgICAgICAgICAgICwgY2xhc3NOYW1lXG4gICAgICAgIClcbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdpZCcsIGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgZWwuaWQgPT0gaWRcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSBpZCAje2V4cH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIGlkICN7ZXhwfSdcbiAgICAgICAgICAgICwgaWRcbiAgICAgICAgKVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5hZGRNZXRob2QoJ2h0bWwnLCBmdW5jdGlvbihodG1sKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpLCBhY3R1YWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKS5pbm5lckhUTUxcblxuICAgICAgICBpZiAoZmxhZyh0aGlzLCAnY29udGFpbnMnKSkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgYWN0dWFsLmluZGV4T2YoaHRtbCkgPj0gMFxuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICN7YWN0fSB0byBjb250YWluIEhUTUwgI3tleHB9J1xuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICN7YWN0fSBub3QgdG8gY29udGFpbiBIVE1MICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAsIGh0bWxcbiAgICAgICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgYWN0dWFsID09PSBodG1sXG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyB0byBoYXZlIEhUTUwgI3tleHB9LCBidXQgdGhlIEhUTUwgd2FzICN7YWN0fSdcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIEhUTUwgI3tleHB9J1xuICAgICAgICAgICAgICAgICwgaHRtbFxuICAgICAgICAgICAgICAgICwgYWN0dWFsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCd0cmltbWVkJywgbnVsbCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGZsYWcodGhpcywgJ3RyaW0tdGV4dCcsIHRydWUpXG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgndGV4dCcsIGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpLCBjb250YWlucyA9IGZsYWcodGhpcywgJ2NvbnRhaW5zJyksXG4gICAgICAgICAgICB0cmltID0gZmxhZyh0aGlzLCAndHJpbS10ZXh0JyksIGFjdHVhbCwgcmVzdWx0XG5cbiAgICAgICAgaWYgKGlzTm9kZUxpc3Qob2JqKSkge1xuICAgICAgICAgICAgYWN0dWFsID0gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG9iaiwgZnVuY3Rpb24oZWwpIHsgcmV0dXJuIHRyaW0gPyBlbC50ZXh0Q29udGVudC50cmltKCkgOiBlbC50ZXh0Q29udGVudCB9KVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb250YWlucyA/XG4gICAgICAgICAgICAgICAgICAgIHRleHRbZmxhZyh0aGlzLCAnbmVnYXRlJykgPyAnc29tZScgOiAnZXZlcnknXShmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChvYmosIGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cmltID8gZWwudGV4dENvbnRlbnQudHJpbSgpIDogZWwudGV4dENvbnRlbnQpID09PSB0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgIHV0aWxzLmVxbChhY3R1YWwsIHRleHQpXG5cbiAgICAgICAgICAgICAgICBhY3R1YWwgPSBhY3R1YWwuam9pbigpXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuam9pbigpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5qb2luKCcnKVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnRhaW5zID8gYWN0dWFsLmluZGV4T2YodGV4dCkgPj0gMCA6IGFjdHVhbCA9PT0gdGV4dFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWN0dWFsID0gdHJpbSA/IG9iai50ZXh0Q29udGVudC50cmltKCkgOiBvYmoudGV4dENvbnRlbnRcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbnRhaW5zID8gYWN0dWFsLmluZGV4T2YodGV4dCkgPj0gMCA6IGFjdHVhbCA9PT0gdGV4dFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9iakRlc2MgPSBlbFRvU3RyaW5nKG9iaiksIHRleHRNc2cgPSB0cmltID8gJ3RyaW1tZWQgdGV4dCcgOiAndGV4dCdcbiAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgb2JqRGVzYyArICcgdG8gY29udGFpbiAje2V4cH0sIGJ1dCB0aGUgJyArIHRleHRNc2cgKyAnIHdhcyAje2FjdH0nXG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIG9iakRlc2MgKyAnIG5vdCB0byBjb250YWluICN7ZXhwfSwgYnV0IHRoZSAnICsgdGV4dE1zZyArICcgd2FzICN7YWN0fSdcbiAgICAgICAgICAgICAgICAsIHRleHRcbiAgICAgICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIG9iakRlc2MgKyAnIHRvIGhhdmUgJyArIHRleHRNc2cgKyAnICN7ZXhwfSwgYnV0IHRoZSAnICsgdGV4dE1zZyArICcgd2FzICN7YWN0fSdcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgb2JqRGVzYyArICcgbm90IHRvIGhhdmUgJyArIHRleHRNc2cgKyAnICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAsIHRleHRcbiAgICAgICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgndmFsdWUnLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgZWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKSwgYWN0dWFsID0gZmxhZyh0aGlzLCAnb2JqZWN0JykudmFsdWVcbiAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnKS52YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSB2YWx1ZSAje2V4cH0sIGJ1dCB0aGUgdmFsdWUgd2FzICN7YWN0fSdcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgbm90IHRvIGhhdmUgdmFsdWUgI3tleHB9J1xuICAgICAgICAgICAgLCB2YWx1ZVxuICAgICAgICAgICAgLCBhY3R1YWxcbiAgICAgICAgKVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVQcm9wZXJ0eSgnZXhpc3QnLCBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgICAgICBpZiAoaXNOb2RlTGlzdChvYmopKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIG9iai5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkIGFuIGVtcHR5IE5vZGVMaXN0IHRvIGhhdmUgbm9kZXMnXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBleGlzdCcpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlUHJvcGVydHkoJ2VtcHR5JywgZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICAgICAgaWYgKGlzSFRNTEVsZW1lbnQob2JqKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICBvYmouY2hpbGRyZW4ubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIGJlIGVtcHR5J1xuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgYmUgZW1wdHknKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KG9iaikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgb2JqLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBiZSBlbXB0eSdcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IGJlIGVtcHR5JylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoJ2xlbmd0aCcsXG4gICAgICAgIGZ1bmN0aW9uKF9zdXBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIGlmIChpc05vZGVMaXN0KG9iaikgfHwgaXNIVE1MRWxlbWVudChvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxMZW5ndGggPSBvYmouY2hpbGRyZW4gPyBvYmouY2hpbGRyZW4ubGVuZ3RoIDogb2JqLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbExlbmd0aCA9PT0gbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBoYXZlICN7ZXhwfSBjaGlsZHJlbiBidXQgaXQgaGFkICN7YWN0fSBjaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBoYXZlICN7ZXhwfSBjaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgICwgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAsIGFjdHVhbExlbmd0aFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uKF9zdXBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApXG5cblxuICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZU1ldGhvZCgnbWF0Y2gnLCBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KG9iaikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgb2JqLm1hdGNoZXMoc2VsZWN0b3IpXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG1hdGNoICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IG1hdGNoICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCBzZWxlY3RvclxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlTGlzdChvYmopKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgICghIW9iai5sZW5ndGggJiYgQXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwob2JqLCBmdW5jdGlvbihlbCkgeyByZXR1cm4gZWwubWF0Y2hlcyhzZWxlY3RvcikgfSkpXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG1hdGNoICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IG1hdGNoICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgLCBzZWxlY3RvclxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoJ2NvbnRhaW4nLFxuICAgICAgICBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzdWJpdGVtKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgaWYgKGlzSFRNTEVsZW1lbnQob2JqKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN1Yml0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIW9iai5xdWVyeVNlbGVjdG9yKHN1Yml0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gY29udGFpbiAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IGNvbnRhaW4gI3tleHB9J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc3ViaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5jb250YWlucyhzdWJpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIGNvbnRhaW4gJyArIGVsVG9TdHJpbmcoc3ViaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgY29udGFpbiAnICsgZWxUb1N0cmluZyhzdWJpdGVtKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdkZXNjZW5kYW50JywgZnVuY3Rpb24oc3ViaXRlbSkge1xuICAgICAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JyksIGFjdHVhbCA9IHN1Yml0ZW1cblxuICAgICAgICBpZiAodHlwZW9mIHN1Yml0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhY3R1YWwgPSBvYmoucXVlcnlTZWxlY3RvcihzdWJpdGVtKVxuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgISFhY3R1YWxcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBoYXZlIGRlc2NlbmRhbnQgI3tleHB9J1xuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBoYXZlIGRlc2NlbmRhbnQgI3tleHB9J1xuICAgICAgICAgICAgICAgICwgc3ViaXRlbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgIG9iai5jb250YWlucyhzdWJpdGVtKVxuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIGNvbnRhaW4gJyArIGVsVG9TdHJpbmcoc3ViaXRlbSlcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgY29udGFpbiAnICsgZWxUb1N0cmluZyhzdWJpdGVtKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZsYWcodGhpcywgJ29iamVjdCcsIGFjdHVhbClcbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdkZXNjZW5kYW50cycsIGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKSxcbiAgICAgICAgICAgIGFjdHVhbCA9IG9iai5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICEhYWN0dWFsLmxlbmd0aFxuICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gaGF2ZSBkZXNjZW5kYW50cyAje2V4cH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgaGF2ZSBkZXNjZW5kYW50cyAje2V4cH0nXG4gICAgICAgICAgICAsIHNlbGVjdG9yKVxuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBhY3R1YWwpXG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdkaXNwbGF5ZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVsID0gZmxhZyh0aGlzLCAnb2JqZWN0JyksXG4gICAgICAgICAgICBhY3R1YWwgPSBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKSA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5kaXNwbGF5IDogZWwuc3R5bGUuZGlzcGxheVxuXG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgYWN0dWFsICE9PSAnbm9uZSdcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gYmUgZGlzcGxheWVkLCBidXQgaXQgd2FzIG5vdCdcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gbm90IGJlIGRpc3BsYXllZCwgYnV0IGl0IHdhcyBhcyAnICsgYWN0dWFsXG4gICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICApXG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCd2aXNpYmxlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpLFxuICAgICAgICAgICAgYWN0dWFsID0gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCkgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkudmlzaWJpbGl0eSA6IGVsLnN0eWxlLnZpc2liaWxpdHlcblxuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgIGFjdHVhbCAhPT0gJ2hpZGRlbicgJiYgYWN0dWFsICE9PSAnY29sbGFwc2UnXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIHRvIGJlIHZpc2libGUsIGJ1dCBpdCB3YXMgJyArIChhY3R1YWwgPT09ICdoaWRkZW4nID8gJ2hpZGRlbicgOiAnY29sbGFwc2VkJylcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gbm90IGJlIHZpc2libGUsIGJ1dCBpdCB3YXMnXG4gICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICApXG4gICAgfSlcbn0iLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbmxldCBhZGRlZE5vZGVzLCBtdXRhdGlvbm9ic2VydmVyO1xuXG5mdW5jdGlvbiBpbml0KCkge1xuXG4gICAgYWRkZWROb2RlcyA9IFtdO1xuICAgIG11dGF0aW9ub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChtdXRhdGlvbikge1xuICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIG11dGF0aW9uLnJlbW92ZWROb2Rlcykge1xuXG4gICAgICAgICAgICAgICAgbXV0YXRpb24uYWRkZWROb2Rlcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkTm9kZXMucHVzaChuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufVxuXG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZygpIHtcblxuICAgIGlmIChtdXRhdGlvbm9ic2VydmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5pdCgpXG4gICAgfVxuXG4gICAgbXV0YXRpb25vYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKSwge2NoaWxkTGlzdDogdHJ1ZX0pO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwRE9NRnJvbVRlc3RpbmcoKSB7XG4gICAgbXV0YXRpb25vYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cbiAgICBmb3IgKGNvbnN0IG4gb2YgYWRkZWROb2Rlcykge1xuICAgICAgICBuLnJlbW92ZSgpO1xuICAgIH1cbn0iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcblxuZXhwb3J0IGNvbnN0IGlzQnJvd3NlciA9IG5ldyBGdW5jdGlvbihcInRyeSB7cmV0dXJuIHRoaXM9PT13aW5kb3c7fWNhdGNoKGUpeyByZXR1cm4gZmFsc2U7fVwiKTtcblxuZXhwb3J0IGNvbnN0IGlzTm9kZSA9IG5ldyBGdW5jdGlvbihcInRyeSB7cmV0dXJuIHRoaXM9PT1nbG9iYWw7fWNhdGNoKGUpe3JldHVybiBmYWxzZTt9XCIpO1xuXG5cbi8qKlxuICogdGhpcyBoZWxwZXIgZnVuY3Rpb24gY3JlYXRlcyB0aGUgZG9tIHN0YWNrIGluIHRoZSBub2RlIGVudmlyb25tZW50XG4gKlxuICogQHJldHVybiB7UHJvbWlzZTx1bmtub3duPnxQcm9taXNlPHZvaWQ+fVxuICovXG5mdW5jdGlvbiBpbml0SlNET00ob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiICYmIHdpbmRvd1snRE9NUGFyc2VyJ10pIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIGNvbnN0IGcgPSBnZXRHbG9iYWwoKTtcblxuICAgIG9wdGlvbnMgPSBleHRlbmQoe30sIHtcbiAgICAgICAgcHJldGVuZFRvQmVWaXN1YWw6IHRydWUsXG4gICAgICAgIGNvbnRlbnRUeXBlOiBcInRleHQvaHRtbFwiLFxuICAgICAgICBpbmNsdWRlTm9kZUxvY2F0aW9uczogdHJ1ZSxcbiAgICAgICAgc3RvcmFnZVF1b3RhOiAxMDAwMDAwMCxcbiAgICAgICAgcnVuU2NyaXB0czogXCJkYW5nZXJvdXNseVwiLFxuICAgICAgICByZXNvdXJjZXM6IFwidXNhYmxlXCJcbiAgICB9LCBvcHRpb25zfHx7fSlcblxuICAgIHJldHVybiBpbXBvcnQoXCJqc2RvbVwiKS50aGVuKCh7SlNET019KSA9PiB7XG4gICAgICAgIGNvbnN0IHt3aW5kb3d9ID0gbmV3IEpTRE9NKGA8aHRtbD5cbjxoZWFkPlxuPC9oZWFkPlxuPGJvZHk+XG48ZGl2IGlkPVwibW9ja3NcIj48L2Rpdj5cbjwvYm9keT5gLCBvcHRpb25zKTtcblxuICAgICAgICBnWyd3aW5kb3cnXSA9IHdpbmRvdztcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PlxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcblxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJ3NlbGYnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTENvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAnTm9kZUxpc3QnLFxuICAgICAgICAgICAgICAgICAgICAnRWxlbWVudEludGVybmFscycsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MRG9jdW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTEZvcm1FbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxJbnB1dEVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTFNlbGVjdEVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTFRleHRBcmVhRWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdEb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdOb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgJ1NoYWRvd1Jvb3QnLFxuICAgICAgICAgICAgICAgICAgICAnRXZlbnQnLFxuICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tRXZlbnQnLFxuICAgICAgICAgICAgICAgICAgICAnRWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MRWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MRGl2RWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdjdXN0b21FbGVtZW50cycsXG4gICAgICAgICAgICAgICAgICAgICdEb2N1bWVudEZyYWdtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0RPTVBhcnNlcicsXG4gICAgICAgICAgICAgICAgICAgICdDU1NTdHlsZVNoZWV0JyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxTY3JpcHRFbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ011dGF0aW9uT2JzZXJ2ZXInLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTFRlbXBsYXRlRWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ05vZGVGaWx0ZXInLFxuICAgICAgICAgICAgICAgICAgICAnbmF2aWdhdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgJ0lucHV0RXZlbnQnLFxuICAgICAgICAgICAgICAgICAgICAnQmxvYicsXG4gICAgICAgICAgICAgICAgICAgICdDdXN0b21FdmVudCdcbiAgICAgICAgICAgICAgICBdLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ1trZXldID0gd2luZG93W2tleV1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cblxuICAgIH0pO1xufVxuXG5leHBvcnQge2luaXRKU0RPTX1cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTdGF0ZVN5bWJvbH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbEZ1bmN0aW9ufSBmcm9tIFwiLi4vLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtcbiAgICBBVFRSSUJVVEVfQ0xBU1MsXG4gICAgQVRUUklCVVRFX0VSUk9STUVTU0FHRSxcbiAgICBBVFRSSUJVVEVfSUQsXG4gICAgQVRUUklCVVRFX1NSQyxcbiAgICBBVFRSSUJVVEVfVElUTEUsXG4gICAgQVRUUklCVVRFX1RZUEUsXG4gICAgVEFHX1NDUklQVFxufSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtLRVlfRE9DVU1FTlQsIEtFWV9RVUVSWSwgcmVmZXJlbmNlU3ltYm9sLCBSZXNvdXJjZX0gZnJvbSBcIi4uL3Jlc291cmNlLm1qc1wiO1xuXG5leHBvcnQge0RhdGF9XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRvIGVtYmVkIGRhdGEuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7RGF0YX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3Jlc291cmNlL2RhdGEubWpzJztcbiAqIG5ldyBEYXRhKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuMjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTS5SZXNvdXJjZVxuICogQHN1bW1hcnkgQSBEYXRhIFJlc291cmNlIGNsYXNzXG4gKi9cbmNsYXNzIERhdGEgZXh0ZW5kcyBSZXNvdXJjZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZT1jb3JzIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9mZXRjaFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcmVkZW50aWFscz1zYW1lLW9yaWdpbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvZmV0Y2hcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZT1hcHBsaWNhdGlvbi9qc29uIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItdHlwZX1cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICBtb2RlOiAnY29ycycsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlLkRhdGF9XG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICBjcmVhdGVFbGVtZW50LmNhbGwodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGFwcGVuZHMgdGhlIEhUTUxFbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnRcbiAgICAgKlxuICAgICAqIHRocm93cyB7RXJyb3J9IHRhcmdldCBub3QgZm91bmRcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZX1cbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuXG4gICAgICAgIGlmICghKHRoaXNbcmVmZXJlbmNlU3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGVuZFRvRG9jdW1lbnQuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRVUkxBdHRyaWJ1dGUoKSB7XG4gICAgICAgIHJldHVybiBBVFRSSUJVVEVfU1JDXG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlLkRhdGF9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCBkb2N1bWVudCA9IHNlbGYuZ2V0T3B0aW9uKEtFWV9ET0NVTUVOVCk7XG4gICAgc2VsZltyZWZlcmVuY2VTeW1ib2xdID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfU0NSSVBUKTtcblxuICAgIGZvciAobGV0IGtleSBvZiBbQVRUUklCVVRFX1RZUEUsIEFUVFJJQlVURV9JRCwgQVRUUklCVVRFX0NMQVNTLCBBVFRSSUJVVEVfVElUTEVdKSB7XG4gICAgICAgIGlmIChzZWxmLmdldE9wdGlvbihrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXVtrZXldID0gc2VsZi5nZXRPcHRpb24oa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xufVxuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiB0aHJvd3Mge0Vycm9yfSB0YXJnZXQgbm90IGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFRvRG9jdW1lbnQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCB0YXJnZXROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLmdldE9wdGlvbihLRVlfUVVFUlksICdoZWFkJykpXG4gICAgaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldCBub3QgZm91bmQnKVxuICAgIH1cblxuICAgIHRhcmdldE5vZGUuYXBwZW5kQ2hpbGQoc2VsZltyZWZlcmVuY2VTeW1ib2xdKTtcblxuICAgIGdldEdsb2JhbEZ1bmN0aW9uKCdmZXRjaCcpKHNlbGYuZ2V0T3B0aW9uKEFUVFJJQlVURV9TUkMpLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsIC8vICpHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBldGMuXG4gICAgICAgIG1vZGU6IHNlbGYuZ2V0T3B0aW9uKCdtb2RlJywgJ2NvcnMnKSwgLy8gbm8tY29ycywgKmNvcnMsIHNhbWUtb3JpZ2luXG4gICAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLCAvLyAqZGVmYXVsdCwgbm8tY2FjaGUsIHJlbG9hZCwgZm9yY2UtY2FjaGUsIG9ubHktaWYtY2FjaGVkXG4gICAgICAgIGNyZWRlbnRpYWxzOiBzZWxmLmdldE9wdGlvbignY3JlZGVudGlhbHMnLCAnc2FtZS1vcmlnaW4nKSwgLy8gaW5jbHVkZSwgKnNhbWUtb3JpZ2luLCBvbWl0XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBY2NlcHQnOiBzZWxmLmdldE9wdGlvbigndHlwZScsICdhcHBsaWNhdGlvbi9qc29uJylcbiAgICAgICAgfSxcbiAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLCAvLyBtYW51YWwsICpmb2xsb3csIGVycm9yXG4gICAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXInLCAvLyBuby1yZWZlcnJlciwgXG4gICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKVxuXG5cbiAgICB9KS50aGVuKHRleHQgPT4ge1xuXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG4gICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7XG5cbiAgICAgICAgc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5nZXRTdWJqZWN0KClbJ2xvYWRlZCddID0gdHJ1ZTtcblxuXG4gICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgIHNlbGZbaW50ZXJuYWxTdGF0ZVN5bWJvbF0uc2V0U3ViamVjdCh7XG4gICAgICAgICAgICBsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICBlcnJvcjogZS50b1N0cmluZygpLFxuICAgICAgICB9KVxuXG4gICAgICAgIHRhcmdldE5vZGUuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUudG9TdHJpbmcoKSk7XG4gICAgfSlcblxuICAgIHJldHVybiBzZWxmO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGNoYWkgZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtEYXRhfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9yZXNvdXJjZS9kYXRhLm1qc1wiO1xuaW1wb3J0IHtEYXRhVXJsfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2RhdGF1cmwubWpzXCI7XG5pbXBvcnQge0lEfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7Y2xlYW51cERPTUZyb21UZXN0aW5nLCBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3Rpbmd9IGZyb20gXCIuLi8uLi8uLi91dGlsL2NsZWFudXBkb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcblxuYDtcblxuXG5kZXNjcmliZSgnRGF0YScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBmZXRjaFJlZmVyZW5jZSwgcmV0dXJuU3RhdHVzLCBtdXRhdGlvbm9ic2VydmVyLCBhZGRlZE5vZGVzID0gW107XG5cblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZygpXG5cbiAgICAgICAgcmV0dXJuU3RhdHVzID0gMjAwO1xuICAgICAgICBmZXRjaFJlZmVyZW5jZSA9IGdsb2JhbFRoaXNbJ2ZldGNoJ107XG4gICAgICAgIGdsb2JhbFRoaXNbJ2ZldGNoJ10gPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG5cbiAgICAgICAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXJsJylcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiBcInRlc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXR1cm5TdGF0dXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfTtcblxuXG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFRoaXNbJ2ZldGNoJ10gPSBmZXRjaFJlZmVyZW5jZTtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdEYXRhKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzZXRFdmVudFR5cGVzKCknLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IERhdGEoe1xuICAgICAgICAgICAgICAgIHNyYzogbmV3IERhdGFVcmwoJycsICd0ZXh0L2phdmFzY3JpcHQnKS50b1N0cmluZygpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGF0YS5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG4gICAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRXh0ZXJuYWwgRGF0YScsICgpID0+IHtcblxuICAgICAgICBsZXQgaWQgPSBuZXcgSUQoJ2RhdGEnKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgc2VydmVyLCBkYXRhLCB1cmwgPSAnaHR0cHM6Ly9tb25zdGVyanMub3JnL2Fzc2V0cy9lbXB0eS5qcz8nICsgaWQ7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YSh7XG4gICAgICAgICAgICAgICAgc3JjOiB1cmwsXG4gICAgICAgICAgICAgICAgaWQ6IGlkXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGF0YSBpcyBub3QgY29ubmVjdGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGRhdGEuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2Nvbm5lY3QgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eScsIChkb25lKSA9PiB7XG5cbiAgICAgICAgICAgIGRhdGEuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChkYXRhLmlzQ29ubmVjdGVkKCksICdpc0Nvbm5lY3RlZCAxJykudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3R5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCJdJyksICdleGlzdHMgMScpLnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5wYXJlbnRFbGVtZW50O1xuXG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZGF0YS5pc0Nvbm5lY3RlZCgpLCAnaXNDb25uZWN0ZWQgMicpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIl0nKSwgJ2V4aXN0cyAyJykubm90LnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgZGF0YS5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkYXRhLmlzQ29ubmVjdGVkKCksICdpc0Nvbm5lY3RlZCAzJykudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPVwiYXBwbGljYXRpb24vanNvblwiXScpLCAnZXhpc3RzIDMnKS50by5leGlzdDtcblxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIl0nKSwgJ2V4aXN0cyA0Jykubm90LnRvLmV4aXN0O1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZGF0YS5pc0Nvbm5lY3RlZCgpLCAnaXNDb25uZWN0ZWQgNCcpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgY2hhaSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0xpbmt9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3Jlc291cmNlL2xpbmsubWpzXCI7XG5pbXBvcnQge0RhdGFVcmx9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanNcIjtcbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaWQubWpzXCI7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5jaGFpLnVzZShjaGFpRG9tKTtcblxuXG5cbmRlc2NyaWJlKCdMaW5rJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZygpXG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGNsZWFudXBET01Gcm9tVGVzdGluZygpO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnTGluaygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQoNTAwMCk7XG5cbiAgICAgICAgaXQoJ2Nvbm5lY3QoKS5hdmFpbGFibGUoKScsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBuZXcgTGluayh7XG4gICAgICAgICAgICAgICAgaHJlZjogbmV3IERhdGFVcmwoJycsICd0ZXh0L2NzcycpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgcmVsOiAnc3R5bGVzaGVldCdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsaW5rLmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFeHRlcm5hbCBMaW5rJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVvdXQoNTAwMCk7XG5cbiAgICAgICAgbGV0IGlkID0gbmV3IElEKCdsaW5rJykudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IGxpbmssIHVybCA9ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL2VtcHR5LmNzcz8nICsgaWQ7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgIGxpbmsgPSBuZXcgTGluayh7XG4gICAgICAgICAgICAgICAgaHJlZjogdXJsLFxuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICByZWw6ICdzdHlsZXNoZWV0J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FwcGVuZCBhbmQgcmVtb3ZlIExpbmsgJywgKGRvbmUpID0+IHtcblxuICAgICAgICAgICAgZXhwZWN0KGxpbmsuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgICAgIGxpbmsuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChsaW5rLmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxpbmsuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkubm90LnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgbGluay5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChsaW5rLmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaHJlZj1cIicgKyB1cmwgKyAnXCJdJykpLnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkubm90LnRvLmV4aXN0O1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QobGluay5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge1xuICAgIEFUVFJJQlVURV9DTEFTUyxcbiAgICBBVFRSSUJVVEVfSUQsXG4gICAgQVRUUklCVVRFX05PTkNFLFxuICAgIEFUVFJJQlVURV9TUkMsXG4gICAgQVRUUklCVVRFX1RJVExFLFxuICAgIEFUVFJJQlVURV9UWVBFLFxuICAgIFRBR19TQ1JJUFRcbn0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7S0VZX0RPQ1VNRU5ULCByZWZlcmVuY2VTeW1ib2wsIFJlc291cmNlfSBmcm9tIFwiLi4vcmVzb3VyY2UubWpzXCI7XG5cbmV4cG9ydCB7U2NyaXB0fVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgcmVzb3VyY2UgbWFuYWdlciB0byBlbWJlZCBzY3JpcHRzLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1NjcmlwdH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3Jlc291cmNlL3NjcmlwdC5tanMnO1xuICogbmV3IFNjcmlwdCgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjI1LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET00uUmVzb3VyY2VcbiAqIEBzdW1tYXJ5IEEgUmVzb3VyY2UgY2xhc3NcbiAqL1xuY2xhc3MgU2NyaXB0IGV4dGVuZHMgUmVzb3VyY2Uge1xuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBhc3luYz10cnVlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItYXN5bmN9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNyb3NzT3JpZ2luPWFub255bW91cyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3NjcmlwdCNhdHRyLWNyb3Nzb3JpZ2lufVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGVmZXI9ZmFsc2Uge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1kZWZlcn1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaW50ZWdyaXR5IHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItaW50ZWdyaXR5fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm9tb2R1bGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1ub21vZHVsZX1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gbm9uY2Uge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1ub25jZX1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVmZXJyZXJwb2xpY3kge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1yZWZlcnJlcnBvbGljeX1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3NjcmlwdCNhdHRyLXR5cGV9XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXG4gICAgICAgICAgICBkZWZlcjogZmFsc2UsXG4gICAgICAgICAgICBpbnRlZ3JpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vbW9kdWxlOiBmYWxzZSxcbiAgICAgICAgICAgIG5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZWZlcnJlcnBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZS5TY3JpcHR9XG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICBjcmVhdGVFbGVtZW50LmNhbGwodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VVJMQXR0cmlidXRlKCkge1xuICAgICAgICByZXR1cm4gQVRUUklCVVRFX1NSQ1xuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZS5TY3JpcHR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCBkb2N1bWVudCA9IHNlbGYuZ2V0T3B0aW9uKEtFWV9ET0NVTUVOVCk7XG4gICAgc2VsZltyZWZlcmVuY2VTeW1ib2xdID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfU0NSSVBUKTtcblxuICAgIGZvciAobGV0IGtleSBvZiBbJ2Nyb3NzT3JpZ2luJywgJ2RlZmVyJywgJ2FzeW5jJywgJ2ludGVncml0eScsICdub21vZHVsZScsIEFUVFJJQlVURV9OT05DRSwgJ3JlZmVycmVycG9saWN5JywgQVRUUklCVVRFX1RZUEUsIEFUVFJJQlVURV9TUkMsIEFUVFJJQlVURV9JRCwgQVRUUklCVVRFX0NMQVNTLCBBVFRSSUJVVEVfVElUTEVdKSB7XG4gICAgICAgIGlmIChzZWxmLmdldE9wdGlvbihrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXVtrZXldID0gc2VsZi5nZXRPcHRpb24oa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcmV0dXJuIHNlbGY7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgY2hhaSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1NjcmlwdH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVzb3VyY2Uvc2NyaXB0Lm1qc1wiO1xuaW1wb3J0IHtEYXRhVXJsfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2RhdGF1cmwubWpzXCI7XG5pbXBvcnQge0lEfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7Y2xlYW51cERPTUZyb21UZXN0aW5nLCBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3Rpbmd9IGZyb20gXCIuLi8uLi8uLi91dGlsL2NsZWFudXBkb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcblxuYDtcblxuXG5kZXNjcmliZSgnU2NyaXB0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZygpXG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGNsZWFudXBET01Gcm9tVGVzdGluZygpO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnU2NyaXB0KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzZXRFdmVudFR5cGVzKCknLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBuZXcgU2NyaXB0KHtcbiAgICAgICAgICAgICAgICBzcmM6IG5ldyBEYXRhVXJsKCcnLCAndGV4dC9qYXZhc2NyaXB0JykudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXG4gICAgICAgICAgICAgICAgZGVmZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGludGVncml0eTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG5vbW9kdWxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBub25jZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlZmVycmVycG9saWN5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY3JpcHQuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBzY3JpcHQuZ2V0T3B0aW9uKCdpZCcpXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG4gICAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRXh0ZXJuYWwgSlMnLCAoKSA9PiB7XG5cbiAgICAgICAgbGV0IGlkID0gbmV3IElEKCdzY3JpcHQnKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgc2VydmVyLCBzY3JpcHQsIHVybCA9ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL2VtcHR5LmpzPycgKyBpZDtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgc2NyaXB0ID0gbmV3IFNjcmlwdCh7XG4gICAgICAgICAgICAgICAgc3JjOiB1cmwsXG4gICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICAgICAgY3Jvc3NPcmlnaW46ICdhbm9ueW1vdXMnLFxuICAgICAgICAgICAgICAgIGRlZmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbnRlZ3JpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBub21vZHVsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWZlcnJlcnBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnLFxuICAgICAgICAgICAgICAgIGlkOiBpZFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FwcGVuZCBhbmQgcmVtb3ZlIHNjcmlwdCAnLCAoZG9uZSkgPT4ge1xuXG4gICAgICAgICAgICBleHBlY3Qoc2NyaXB0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICBzY3JpcHQuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChzY3JpcHQuaXNDb25uZWN0ZWQoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3NyYz1cIicgKyB1cmwgKyAnXCJdJykpLnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChzY3JpcHQuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tzcmM9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3Qoc2NyaXB0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbc3JjPVwiJyArIHVybCArICdcIl0nKSkudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3NyYz1cIicgKyB1cmwgKyAnXCJdJykpLm5vdC50by5leGlzdDtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHNjcmlwdC5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGNoYWkgZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtVcGRhdGVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS91cGRhdGVyLm1qc1wiO1xuaW1wb3J0IHtJRH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge1Byb3h5T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcbiAgICA8dGVtcGxhdGUgaWQ9XCJjdXJyZW50XCI+XG4gICAgICAgIDxsaSBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6Y3VycmVudCB8IHRvanNvblwiPjwvbGk+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICAgICAgPHVsIGRhdGEtbW9uc3Rlci1pbnNlcnQ9XCJjdXJyZW50IHBhdGg6YS5iXCI+XG4gICAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInRlc3QyXCI+XG4gICAgICAgIDx1bCBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwiY3VycmVudCBwYXRoOmEuYiB8IGRvaXRcIj5cbiAgICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwidGVzdDNcIj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImNsYXNzIHBhdGg6YS5iXCI+XG4gICAgICAgICAgICA8aW5wdXQgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJ2YWx1ZSBwYXRoOmEuY1wiIGlkPVwiaW5wdXQxXCI+XG4gICAgICAgICAgICA8aW5wdXQgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjaGVja2VkIHBhdGg6YS5jaGVja2JveFwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJjaGVja2JveFwiIGlkPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgIDxpbnB1dCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS50ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidGV4dFwiIGlkPVwidGV4dFwiPlxuICAgICAgICAgICAgPGlucHV0IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2hlY2tlZCBwYXRoOmEucmFkaW9cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInIxXCIgaWQ9XCJyYWRpb1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJyYWRpb1wiIHZhbHVlPVwicjJcIiBpZD1cInIyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInJhZGlvXCIgdmFsdWU9XCJyeFwiIGlkPVwicnhcIj5cblxuICAgICAgICAgICAgPHNlbGVjdCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS5zZWxlY3RcIiBuYW1lPVwic2VsZWN0XCIgaWQ9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3RoZXItdmFsdWVcIj52YWx1ZTE8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxzZWxlY3QgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJ2YWx1ZSBwYXRoOmEubXVsdGlzZWxlY3RcIiBuYW1lPVwibXVsdGlzZWxlY3RcIiBtdWx0aXBsZSBpZD1cIm11bHRpc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTE8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3RoZXItdmFsdWU1XCI+dmFsdWU1PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cblxuICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9XCJ0ZXh0YXJlYVwiIGlkPVwidGV4dGFyZWFcIiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS50ZXh0YXJlYVwiPjwvdGV4dGFyZWE+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbmA7XG5cbmxldCBodG1sMiA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6dGV4dCB8IHRvbG93ZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6dGV4dCB8IGNhbGw6bXlmb3JtYXR0ZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInN0YXRpYzpoZWxsb1xcXFwgXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5gO1xuXG5sZXQgaHRtbDMgPSBgXG5cbiAgICA8dGVtcGxhdGUgaWQ9XCJteWlubmVyaWRcIj5cbiAgICAgICAgPHNwYW4gZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOm15aW5uZXJpZCB8IHRvanNvblwiPjwvc3Bhbj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlIGlkPVwibXlpZFwiPlxuICAgICAgICA8cCBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpbm5lcmlkIHBhdGg6YS5iXCI+PC9wPlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpZCBwYXRoOmEuYlwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG5gO1xuXG5sZXQgaHRtbDQgPSBgXG4gICAgPGRpdj5cbiAgICAgICAgPGZvcm0gaWQ9XCJmb3JtMVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwiY2hlY2tlZFwiIG5hbWU9XCJjaGVja2JveFwiIGRhdGEtbW9uc3Rlci1iaW5kPVwicGF0aDpzdGF0ZVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInRleHRcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInIxXCIgaWQ9XCJyMVwiIGRhdGEtbW9uc3Rlci1iaW5kPVwicGF0aDpyYWRpb1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJyYWRpb1wiIHZhbHVlPVwicjJcIiBpZD1cInIyXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnJhZGlvXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInJhZGlvXCIgdmFsdWU9XCJyeFwiIGlkPVwicnhcIiBkYXRhLWNvbW1lbnQ9XCJub3QgY2FsbGVkIGJlY2F1c2Ugbm8gYmluZCBhdHRyaWJ1dGVcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgbmFtZT1cImJ1dHRvblwiPlxuXG4gICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJzZWxlY3QxXCIgaWQ9XCJzZWxlY3QxXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUxPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTI8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJzZWxlY3QyXCIgbXVsdGlwbGUgaWQ9XCJzZWxlY3QyXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOm11bHRpc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTE8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlNTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPVwidGV4dGFyZWFcIiBpZD1cInRleHRhcmVhXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnRleHRhcmVhXCI+XG4gICAgICAgICAgICBcbiAgICAgICAgPC90ZXh0YXJlYT5cblxuICAgICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG5cbmA7XG5cblxuZGVzY3JpYmUoJ0RPTScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgndGVzdCBHZXR0ZXIgJiYgU2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3NldEV2ZW50VHlwZXMoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpXG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBVcGRhdGVyKGVsZW1lbnQpLnNldEV2ZW50VHlwZXMoWyd0b3VjaCddKSkudG8uYmUuaW5zdGFuY2VvZihVcGRhdGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpdCgnZ2V0U3ViamVjdCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBsZXQgc3ViamVjdCA9IHthOiAxfTtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFVwZGF0ZXIoZWxlbWVudCwgc3ViamVjdCkuZ2V0U3ViamVjdCgpLmEpLnRvLmJlLmVxdWFsKDEpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3Rlc3QgY29udHJvbCBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2VuYWJsZUV2ZW50UHJvY2Vzc2luZygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFVwZGF0ZXIoZWxlbWVudCkuZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCkpLnRvLmJlLmluc3RhbmNlb2YoVXBkYXRlcik7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnZGlzYWJsZUV2ZW50UHJvY2Vzc2luZygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFVwZGF0ZXIoZWxlbWVudCkuZGlzYWJsZUV2ZW50UHJvY2Vzc2luZygpKS50by5iZS5pbnN0YW5jZW9mKFVwZGF0ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3Rlc3QgRXJyb3JzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IFVwZGF0ZXIoKSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB2YWx1ZSBpcyB3cm9uZycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IFVwZGF0ZXIoZWxlbWVudCwgbnVsbCkpLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgRXJyb3I6IHRoZSB2YWx1ZSBpcyBub3QgaXRlcmFibGUnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcblxuICAgICAgICAgICAgICAgIGxldCB1ID0gbmV3IFVwZGF0ZXIoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuXG4gICAgICAgICAgICAgICAgdS5ydW4oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJzaG91bGQgbmV2ZXIgY2FsbGVkIVwiKSk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGUpLmlzLmluc3RhbmNlT2YoRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZSArIFwiXCIpLnRvLmJlLmVxdWFsKCdFcnJvcjogdGhlIHZhbHVlIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZXIoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzY3JpYmUoJ25ldyBVcGRhdGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBkb2N1bWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgnUmVwZWF0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGJ1aWxkIDYgbGkgZWxlbWVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcblxuICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IFVwZGF0ZXIoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpOiAnMCd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aTogJzEnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2k6ICcyJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpOiAnMyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aTogJzQnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2k6ICc1J30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGQucnVuKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8bGkgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmEuYi4nICsgaSArICcgfCB0b2pzb25cIiBkYXRhLW1vbnN0ZXItaW5zZXJ0LXJlZmVyZW5jZT1cImN1cnJlbnQtJyArIGkgKyAnXCI+e1wiaVwiOlwiJyArIGkgKyAnXCJ9PC9saT4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChcbiAgICAgICAgICAgICAgICAgICAgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihlKSlcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVcGRhdGVyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWw0O1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdFdmVudGhhbmRsaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgdXBkYXRlciwgZm9ybTEsIHByb3h5b2JzZXJ2ZXI7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyID0gbmV3IFByb3h5T2JzZXJ2ZXIoe30pXG4gICAgICAgICAgICAgICAgdXBkYXRlciA9IG5ldyBVcGRhdGVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtMScpLCBwcm94eW9ic2VydmVyKTtcbiAgICAgICAgICAgICAgICBmb3JtMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtMScpO1xuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAvLyBoZXJlIGNsaWNrIGV2ZW50cyBhcmUgdGhyb3duIG9uIHRoZSBjaGVja2JveCBhbmQgdGhlIHNldHRpbmcgb2YgdGhlIHZhbHVlIGlzIG9ic2VydmVkIHZpYSB0aGUgcHJveHlvYnNlcnZlci5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGNoZWNrYm94IGNsaWNrIGV2ZW50cycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHN1YmplY3QgPSB1cGRhdGVyLmdldFN1YmplY3QoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc3ViamVjdCkuaXMuZXF1YWwocHJveHlvYnNlcnZlci5nZXRTdWJqZWN0KCkpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gWydjaGVja2VkJywgdW5kZWZpbmVkLCAnY2hlY2tlZCddO1xuICAgICAgICAgICAgICAgIC8vIGhlcmUgdGhlIG5vdGF0aW9uIHdpdGggZnVuY3Rpb24gaXMgaW1wb3J0YW50LCBiZWNhdXNlIHRoZSBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U3ViamVjdCgpWydzdGF0ZSddICE9PSBlKSBkb25lKG5ldyBFcnJvcih0aGlzLmdldFN1YmplY3QoKVsnc3RhdGUnXSArICcgc2hvdWxkICcgKyBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybTEucXVlcnlTZWxlY3RvcignW25hbWU9Y2hlY2tib3hdJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwKVxuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybTEucXVlcnlTZWxlY3RvcignW25hbWU9Y2hlY2tib3hdJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9LCAxMClcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSByYWRpbyBjbGljayBldmVudHMgMScsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHN1YmplY3QgPSB1cGRhdGVyLmdldFN1YmplY3QoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc3ViamVjdCkuaXMuZXF1YWwocHJveHlvYnNlcnZlci5nZXRTdWJqZWN0KCkpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gWydyMScsICdyMicsICdyMSddO1xuICAgICAgICAgICAgICAgIGxldCBjbGlja1RhcmdldHMgPSBbJ3IyJywgJ3IxJ11cbiAgICAgICAgICAgICAgICAvLyBoZXJlIHRoZSBub3RhdGlvbiB3aXRoIGZ1bmN0aW9uIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgdGhpcyBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmdldFN1YmplY3QoKVsncmFkaW8nXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IGUpIGRvbmUobmV3IEVycm9yKHYgKyAnIHNob3VsZCAnICsgZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjbGlja1RhcmdldHMuc2hpZnQoKSkuY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwKVxuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3IxJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9LCAxMClcblxuICAgICAgICAgICAgICAgIC8vIG5vIGhhbmRsZXIgLy8gYmluZFxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncngnKS5jbGljaygpO1xuICAgICAgICAgICAgICAgIH0sIDIwKVxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBzZWxlY3QgY2xpY2sgZXZlbnRzIDInLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0MScpO1xuXG4gICAgICAgICAgICAgICAgdXBkYXRlci5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHN1YmplY3QpLmlzLmVxdWFsKHByb3h5b2JzZXJ2ZXIuZ2V0U3ViamVjdCgpKTtcblxuICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IFsndmFsdWUyJywgJ3ZhbHVlMScsICd2YWx1ZTInXTtcbiAgICAgICAgICAgICAgICAvLyBoZXJlIHRoZSBub3RhdGlvbiB3aXRoIGZ1bmN0aW9uIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgdGhpcyBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmdldFN1YmplY3QoKVsnc2VsZWN0J107XG4gICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSBlKSBkb25lKG5ldyBFcnJvcih2ICsgJyBzaG91bGQgJyArIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4ID09PSAxID8gMCA6IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgYW5kIHNpbXVsYXRlIGNsaWNrIGV2ZW50IGZvciBidWJibGVcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5jbGljaygpO1xuXG4gICAgICAgICAgICAgICAgfSwgMjApXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSB0ZXh0YXJlYSBldmVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRleHRhcmVhRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXh0YXJlYScpO1xuXG4gICAgICAgICAgICAgICAgdXBkYXRlci5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHN1YmplY3QpLmlzLmVxdWFsKHByb3h5b2JzZXJ2ZXIuZ2V0U3ViamVjdCgpKTtcblxuICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IFsndGVzdFgnLCAnbG9yZW0gaXBzdW0nLCAnJ107XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RWYWx1ZXMgPSBbXCJsb3JlbSBpcHN1bVwiLCBcIlwiXTtcbiAgICAgICAgICAgICAgICAvLyBoZXJlIHRoZSBub3RhdGlvbiB3aXRoIGZ1bmN0aW9uIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgdGhpcyBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmdldFN1YmplY3QoKVsndGV4dGFyZWEnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHYpICE9PSBKU09OLnN0cmluZ2lmeShlKSkgZG9uZShuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodikgKyAnIHNob3VsZCAnICsgSlNPTi5zdHJpbmdpZnkoZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWFFbGVtZW50LnZhbHVlID0gdGVzdFZhbHVlcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhcmVhRWxlbWVudC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBhbmQgc2ltdWxhdGUgY2xpY2sgZXZlbnQgZm9yIGJ1YmJsZVxuICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYUVsZW1lbnQudmFsdWUgPSBcInRlc3RYXCI7XG4gICAgICAgICAgICAgICAgICAgIHRleHRhcmVhRWxlbWVudC5jbGljaygpO1xuXG4gICAgICAgICAgICAgICAgfSwgMjApXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBzZWxlY3QgZXZlbnRzJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdDInKTtcblxuICAgICAgICAgICAgICAgIHVwZGF0ZXIuZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3ViamVjdCA9IHVwZGF0ZXIuZ2V0U3ViamVjdCgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChzdWJqZWN0KS5pcy5lcXVhbChwcm94eW9ic2VydmVyLmdldFN1YmplY3QoKSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBbXG4gICAgICAgICAgICAgICAgICAgIFsndmFsdWUxJ10sXG4gICAgICAgICAgICAgICAgICAgIFsndmFsdWUyJywgJ3ZhbHVlMycsICd2YWx1ZTQnXSxcbiAgICAgICAgICAgICAgICAgICAgWyd2YWx1ZTEnLCAndmFsdWU0J10sXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGxldCB0ZXN0U2VsZWN0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICAgICAgICAgICAgW3RydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAgICAgLy8gaGVyZSB0aGUgbm90YXRpb24gd2l0aCBmdW5jdGlvbiBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgdGhlIHRoaXMgcG9pbnRlciBpcyBzZXQuXG4gICAgICAgICAgICAgICAgcHJveHlvYnNlcnZlci5hdHRhY2hPYnNlcnZlcihuZXcgT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBlID0gZXhwZWN0ZWQuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IHVuZGVmaW5lZCAmJiBleHBlY3RlZC5sZW5ndGggPT09IDApIGRvbmUobmV3IEVycm9yKCd0byBtYW55IGNhbGxzJykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdGhpcy5nZXRTdWJqZWN0KClbJ211bHRpc2VsZWN0J107XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHYpICE9PSBKU09OLnN0cmluZ2lmeShlKSkgZG9uZShuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodikgKyAnIHNob3VsZCAnICsgSlNPTi5zdHJpbmdpZnkoZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0ZXN0U2VsZWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1swXS5zZWxlY3RlZCA9IHZbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzFdLnNlbGVjdGVkID0gdlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMl0uc2VsZWN0ZWQgPSB2WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1szXS5zZWxlY3RlZCA9IHZbM107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1sxXS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMl0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzNdLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuY2xpY2soKTtcblxuICAgICAgICAgICAgICAgIH0sIDIwKVxuXG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cblxuICAgIGRlc2NyaWJlKCdVcGRhdGVyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwyO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdSZXBsYWNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGFkZCBsb3dlciBoZWxsbyBhbmQgSEVMTE95ZXMhJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpXG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IG5ldyBVcGRhdGVyKFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBcIkhBTExPXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBkLnNldENhbGxiYWNrKCdteWZvcm1hdHRlcicsIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhICsgJ3llcyEnXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkLnJ1bigpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCB0b2xvd2VyXCI+aGFsbG88L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCBjYWxsOm15Zm9ybWF0dGVyXCI+SEFMTE95ZXMhPC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwic3RhdGljOmhlbGxvXFxcXCBcIj5oZWxsbyA8L2Rpdj4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSwgMTAwKVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdVcGRhdGVyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwzO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdSZXBsYWNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkICcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2k6ICcwJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuXG4gICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPGRpdiBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpZCBwYXRoOmEuYlwiPicpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8cCBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpbm5lcmlkIHBhdGg6YS5iXCIgZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJteWlkLTBcIj4nKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPHNwYW4gZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmEuYi4wIHwgdG9qc29uXCIgZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJteWlubmVyaWQtMFwiPntcImlcIjpcIjBcIn08L3NwYW4+Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKFxuICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKGUpKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZXIoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzY3JpYmUoJ0F0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIGF0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QzJylcblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZXh0LnZhbHVlKS50by5iZS5lcXVhbChcIlwiKTtcblxuICAgICAgICAgICAgICAgIGxldCByYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWRpbycpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHJhZGlvLmNoZWNrZWQpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrYm94JylcbiAgICAgICAgICAgICAgICBleHBlY3QoY2hlY2tib3guY2hlY2tlZCkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdCcpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHNlbGVjdC5zZWxlY3RlZEluZGV4KS50by5iZS5lcXVhbCgwKTtcblxuICAgICAgICAgICAgICAgIGxldCBtdWx0aXNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtdWx0aXNlbGVjdCcpXG4gICAgICAgICAgICAgICAgZXhwZWN0KG11bHRpc2VsZWN0LnNlbGVjdGVkSW5kZXgpLnRvLmJlLmVxdWFsKC0xKTtcblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXh0YXJlYScpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHRleHRhcmVhLnZhbHVlKS50by5iZS5lcXVhbChcIlwiKTtcblxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IFwiZGl2LWNsYXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCJoZWxsb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IFwiaGVsbG9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpbzogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWE6IFwidGVzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpc2VsZWN0OiBbJ3ZhbHVlMycsICd2YWx1ZTQnLCAnb3RoZXItdmFsdWU1J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0OiBcInZhbHVlMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94OiBcInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuXG4gICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcblxuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmEuYlwiIGNsYXNzPVwiZGl2LWNsYXNzXCI+Jyk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxpbnB1dCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS5jXCIgaWQ9XCJpbnB1dDFcIiB2YWx1ZT1cImhlbGxvXCI+Jyk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzx0ZXh0YXJlYSBuYW1lPVwidGV4dGFyZWFcIiBpZD1cInRleHRhcmVhXCIgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJ2YWx1ZSBwYXRoOmEudGV4dGFyZWFcIiB2YWx1ZT1cInRlc3RcIj4nKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPGlucHV0IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2hlY2tlZCBwYXRoOmEucmFkaW9cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInIxXCIgaWQ9XCJyYWRpb1wiIGNoZWNrZWQ9XCJ0cnVlXCI+Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRleHQudmFsdWUsICd0ZXh0IGNvbnRyb2wnKS50by5iZS5lcXVhbChkLmdldFN1YmplY3QoKVsnYSddWydjJ10pO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QocmFkaW8uY2hlY2tlZCwgJ3JhZGlvIGNvbnRyb2wnKS50by5iZS5lcXVhbCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRleHRhcmVhLnZhbHVlLCAndGV4dGFyZWEgY29udHJvbCcpLnRvLmJlLmVxdWFsKGQuZ2V0U3ViamVjdCgpWydhJ11bJ3RleHRhcmVhJ10pO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3Qoc2VsZWN0LnNlbGVjdGVkSW5kZXgsICdzZWxlY3QgY29udHJvbCcpLnRvLmJlLmVxdWFsKDEpOyAvLyBbMD0+b3RoZXItdmFsdWUsIDE9PnZhbHVlMl1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgbXVsdGlzZWxlY3RTZWxlY3RlZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIG9ial0gb2YgT2JqZWN0LmVudHJpZXMobXVsdGlzZWxlY3Quc2VsZWN0ZWRPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlzZWxlY3RTZWxlY3RlZE9wdGlvbnMucHVzaChvYmoudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkobXVsdGlzZWxlY3RTZWxlY3RlZE9wdGlvbnMpLCAnbXVsdGlzZWxlY3QgY29udHJvbCcpLnRvLmJlLmVxdWFsKEpTT04uc3RyaW5naWZ5KGQuZ2V0U3ViamVjdCgpWydhJ11bJ211bHRpc2VsZWN0J10pKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGNoZWNrYm94LmNoZWNrZWQsICdjaGVja2JveCBjb250cm9sJykudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoZSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0dldCBBdHRyaWJ1dGUgUGlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGlkLCBtb2NrcztcbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgaWQgPSBuZXcgSUQoJ21vbnN0ZXInKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGAgPGRpdiBpZD1cImAgKyBpZCArIGBcIlxuICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmEgfCBpZjp2YWx1ZTpcXFxcIFwiPjwvZGl2PmBcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGluY2x1ZGUgc3BhY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZC50b1N0cmluZygpKVxuXG4gICAgICAgICAgICBjb25zdCBwaXBlID0gZGl2LmdldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLXJlcGxhY2UnKTtcbiAgICAgICAgICAgIGV4cGVjdChwaXBlLmxlbmd0aCkudG8uYmUuZXF1YWwoMjApO1xuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnbWFudWVsIHVwZGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGlkLCBtb2NrcztcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBpZCA9IG5ldyBJRCgnbW9uc3RlcicpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgPGlucHV0IGlkPVwiYCArIGlkICsgYFwiZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOm15dmFsdWVcIj5gXG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBnZXQgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS52YWx1ZSA9IFwiaGVsbG9cIjtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZXIgPSBuZXcgVXBkYXRlcihtb2Nrcyk7XG4gICAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChzdWJqZWN0KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnbXl2YWx1ZScpO1xuICAgICAgICAgICAgdXBkYXRlci5yZXRyaWV2ZSgpO1xuICAgICAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvLmhhdmUucHJvcGVydHkoJ215dmFsdWUnKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICAvKipcbiAgICAgKiBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMTJcbiAgICAgKi9cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpIDIwMjIwMTA3JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAvLyBsYW5ndWFnZT1IVE1MXG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICBgO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdCdWdmaXggIzExMicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBhZGQgJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MID0gJ3llYWghIDxiPlRlc3Q8L2I+ISc7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJIVE1MID0gY29udGFpbmVyRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3SFRNTCA9IG5ld0VsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogbmV3RWxlbWVudFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGNvbnRhaW5lckVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPGRpdj55ZWFoISA8Yj5UZXN0PC9iPiE8L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LCAxMDApXG5cbiAgICAgICAgICAgICAgICAvLyBkLnNldENhbGxiYWNrKCdteWZvcm1hdHRlcicsIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBhICsgJ3llcyEnXG4gICAgICAgICAgICAgICAgLy8gfSlcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBkLnJ1bigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCB0b2xvd2VyXCI+aGFsbG88L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCBjYWxsOm15Zm9ybWF0dGVyXCI+SEFMTE95ZXMhPC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwic3RhdGljOmhlbGxvXFxcXCBcIj5oZWxsbyA8L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihlKSlcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gfSwgMTAwKVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGNoYWkgZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtBVFRSSUJVVEVfT1BUSU9OU30gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtnZXREb2N1bWVudH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICA8L2Rpdj5cbmA7XG5cbmRlc2NyaWJlKCdET00nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgQ3VzdG9tQ29udHJvbCwgcmVnaXN0ZXJDdXN0b21FbGVtZW50LCBUZXN0Q29tcG9uZW50LCBkb2N1bWVudCwganNkb21GbGFnO1xuXG4gICAgZGVzY3JpYmUoJ0N1c3RvbUNvbnRyb2woKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy8ganNkb20gZG9lcyBub3Qgc3VwcG9ydCBFbGVtZW50SW50ZXJuYWxzXG4gICAgICAgICAgICAgICAganNkb21GbGFnID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcyhcImpzZG9tXCIpO1xuXG4gICAgICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCA9IG1bJ3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCddO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9jdXN0b21jb250cm9sLm1qc1wiKS50aGVuKChtKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21Db250cm9sID0gbVsnQ3VzdG9tQ29udHJvbCddO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbXBvbmVudCA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tQ29udHJvbCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJtb25zdGVyLWN1c3RvbWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudChUZXN0Q29tcG9uZW50KVxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gY3VzdG9tLWVsZW1lbnQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IFRlc3RDb21wb25lbnQoKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnY29ubmVjdCBlbXB0eSBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2RvY3VtZW50IHNob3VsZCBjb250YWluIG1vbnN0ZXItY3VzdG9tY29udHJvbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpLmFwcGVuZENoaWxkKGQpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbW9uc3Rlci1jdXN0b21jb250cm9sJykubGVuZ3RoKS5pcy5lcXVhbCgxKTtcbiAgICAgICAgICAgICAgICAvLyBubyBkYXRhLW1vbnN0ZXItb2JqZWN0bGluaz1cIlN5bWJvbChtb25zdGVyVXBkYXRlcilcIiBiZWNhdXNlIGl0IGhhcyBub3RoaW5nIHRvIHVwZGF0ZVxuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci1jdXN0b21jb250cm9sPjwvbW9uc3Rlci1jdXN0b21jb250cm9sPicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdPcHRpb25zIGNoYW5nZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaXQoJ2RlbGVnYXRlc0ZvY3VzIHNob3VsZCBjaGFuZ2UgZnJvbSB0cnVlIHRvIGZhbHNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJylcblxuICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldE9wdGlvbignZGVsZWdhdGVzRm9jdXMnKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OUywgSlNPTi5zdHJpbmdpZnkoe2RlbGVnYXRlc0ZvY3VzOiBmYWxzZX0pKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRPcHRpb24oJ2RlbGVnYXRlc0ZvY3VzJykpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnVGVzdCBFbGVtZW50SW50ZXJuYWxzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgZm9ybTtcblxuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCdmb3JtQXNzb2NpYXRlZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChkLmNvbnN0cnVjdG9yLmZvcm1Bc3NvY2lhdGVkKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGl0KCdmb3JtJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGpzZG9tRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gZC5mb3JtKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGQuZm9ybSkudG8uYmUuaW5zdGFuY2VvZihIVE1MRm9ybUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgndmFsdWUgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGQudmFsdWUpLnRvLnRocm93KEVycm9yKTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCd2YWx1ZSBzZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gZC52YWx1ZSA9IDQpLnRvLnRocm93KEVycm9yKTtcblxuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgaXQoJ3NldEZvcm1WYWx1ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIGlmIChqc2RvbUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGQuc2V0Rm9ybVZhbHVlKCkpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICBpdCgnbmFtZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZC5uYW1lKS50by5iZS5udWxsO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3R5cGUgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQudHlwZSkudG8uYmUuZXF1YWwoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3ZhbGlkaXR5IGdldHRlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcbiAgICAgICAgICAgICAgICBpZiAoanNkb21GbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBkLnZhbGlkaXR5KS50by50aHJvdyhFcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCd2YWxpZGF0aW9uTWVzc2FnZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoanNkb21GbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBkLnZhbGlkaXR5KS50by50aHJvdyhFcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCd3aWxsVmFsaWRhdGUgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGpzZG9tRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gZC53aWxsVmFsaWRhdGUpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGl0KCdjaGVja1ZhbGlkaXR5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoanNkb21GbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBkLmNoZWNrVmFsaWRpdHkoKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgncmVwb3J0VmFsaWRpdHkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIGlmIChqc2RvbUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGQucmVwb3J0VmFsaWRpdHkoKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgIGl0KCdzZXRWYWxpZGl0eSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuICAgICAgICAgICAgICAgIGlmIChqc2RvbUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGQuc2V0VmFsaWRpdHkoKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkLnNldFZhbGlkaXR5KHsndmFsdWVNaXNzaW5nJzogdHJ1ZX0sIFwibXkgbWVzc2FnZVwiKSkudG8uYmUudW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxufSk7XG5cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSBcIi4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge2Nsb25lfSBmcm9tIFwiLi4vdXRpbC9jbG9uZS5tanNcIjtcblxuZXhwb3J0IHtMb2NhbGUsIHBhcnNlTG9jYWxlfVxuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkkxOG5cbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHByb3BlcnRpZXNTeW1ib2wgPSBTeW1ib2woJ3Byb3BlcnRpZXMnKTtcblxuLyoqXG4gKiBAdHlwZSB7c3ltYm9sfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuSTE4blxuICovXG5jb25zdCBsb2NhbGVTdHJpbmdTeW1ib2wgPSBTeW1ib2woJ2xvY2FsZVN0cmluZycpO1xuXG4vKipcbiAqIFRoZSBMb2NhbGUgY2xhc3MgaXMgYSBiYXNlIGNsYXNzIGZvciB0aGUgbGFuZ3VhZ2UgY2xhc3Nlcy5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtMb2NhbGV9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2kxOG4vbG9jYWxlLm1qcyc7XG4gKiBuZXcgTG9jYWxlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogUkZDXG4gKlxuICogYGBgXG4gKiBBIExhbmd1YWdlLVRhZyBjb25zaXN0cyBvZjpcbiAqIGxhbmd0YWcgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGdlbmVyYXRlZCB0YWdcbiAqICAgICAgICAgICAtb3ItIHByaXZhdGUtdXNlICAgICAgICA7IGEgcHJpdmF0ZSB1c2UgdGFnXG4gKlxuICogbGFuZ3RhZyAgICAgICA9IChsYW5ndWFnZVxuICogICAgICAgICAgICAgICAgICAgIFtcIi1cIiBzY3JpcHRdXG4gKiAgICAgICAgICAgICAgICAgICAgW1wiLVwiIHJlZ2lvbl1cbiAqICAgICAgICAgICAgICAgICAgICAqKFwiLVwiIHZhcmlhbnQpXG4gKiAgICAgICAgICAgICAgICAgICAgKihcIi1cIiBleHRlbnNpb24pXG4gKiAgICAgICAgICAgICAgICAgICAgW1wiLVwiIHByaXZhdGV1c2VdKVxuICpcbiAqIGxhbmd1YWdlICAgICAgPSBcImVuXCIsIFwiYWxlXCIsIG9yIGEgcmVnaXN0ZXJlZCB2YWx1ZVxuICpcbiAqIHNjcmlwdCAgICAgICAgPSBcIkxhdG5cIiwgXCJDeXJsXCIsIFwiSGFudFwiIElTTyAxNTkyNCBjb2Rlc1xuICpcbiAqIHJlZ2lvbiAgICAgICAgPSBcIlVTXCIsIFwiQ1NcIiwgXCJGUlwiIElTTyAzMTY2IGNvZGVzXG4gKiAgICAgICAgICAgICAgICAgXCI0MTlcIiwgXCIwMTlcIiwgIG9yIFVOIE0uNDkgY29kZXNcbiAqXG4gKiB2YXJpYW50ICAgICAgID0gXCJyb3phalwiLCBcIm5lZGlzXCIsIFwiMTk5NlwiLCBtdWx0aXBsZSBzdWJ0YWdzIGNhbiBiZSB1c2VkIGluIGEgdGFnXG4gKlxuICogZXh0ZW5zaW9uICAgICA9IHNpbmdsZSBsZXR0ZXIgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBzdWJ0YWdzOyBtb3JlIHRoYW4gb25lIGV4dGVuc2lvblxuICogICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIGluIGEgbGFuZ3VhZ2UgdGFnXG4gKlxuICogcHJpdmF0ZS11c2UgICA9IFwieC1cIiBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIHN1YnRhZ3MsIGFzIG1hbnkgYXMgYXJlIHJlcXVpcmVkXG4gKiAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZXNlIGNhbiBzdGFydCBhIHRhZyBvciBhcHBlYXIgYXQgdGhlIGVuZCAoYnV0IG5vdFxuICogICAgICAgICAgICAgICAgIGluIHRoZSBtaWRkbGUpXG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS4xMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuSTE4blxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzMwNjZcbiAqL1xuY2xhc3MgTG9jYWxlIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlZ2lvbl1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NjcmlwdF1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhcmlhbnRzXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0bGFuZ11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ByaXZhdGVVc2VdXG4gICAgICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGxvY2FsZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxhbmd1YWdlLCByZWdpb24sIHNjcmlwdCwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW3Byb3BlcnRpZXNTeW1ib2xdID0ge1xuICAgICAgICAgICAgbGFuZ3VhZ2U6IChsYW5ndWFnZSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKGxhbmd1YWdlKSxcbiAgICAgICAgICAgIHNjcmlwdDogKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKHNjcmlwdCksXG4gICAgICAgICAgICByZWdpb246IChyZWdpb24gPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiB2YWxpZGF0ZVN0cmluZyhyZWdpb24pLFxuICAgICAgICAgICAgdmFyaWFudHM6ICh2YXJpYW50cyA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKHZhcmlhbnRzKSxcbiAgICAgICAgICAgIGV4dGxhbmc6IChleHRsYW5nID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogdmFsaWRhdGVTdHJpbmcoZXh0bGFuZyksXG4gICAgICAgICAgICBwcml2YXRlVXNlOiAocHJpdmF0ZVVzZSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKHByaXZhdGVVc2UpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBzID0gW107XG4gICAgICAgIGlmIChsYW5ndWFnZSAhPT0gdW5kZWZpbmVkKSBzLnB1c2gobGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoc2NyaXB0ICE9PSB1bmRlZmluZWQpIHMucHVzaChzY3JpcHQpO1xuICAgICAgICBpZiAocmVnaW9uICE9PSB1bmRlZmluZWQpIHMucHVzaChyZWdpb24pO1xuICAgICAgICBpZiAodmFyaWFudHMgIT09IHVuZGVmaW5lZCkgcy5wdXNoKHZhcmlhbnRzKTtcbiAgICAgICAgaWYgKGV4dGxhbmcgIT09IHVuZGVmaW5lZCkgcy5wdXNoKGV4dGxhbmcpO1xuICAgICAgICBpZiAocHJpdmF0ZVVzZSAhPT0gdW5kZWZpbmVkKSBzLnB1c2gocHJpdmF0ZVVzZSk7XG5cbiAgICAgICAgaWYgKHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGxvY2FsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1tsb2NhbGVTdHJpbmdTeW1ib2xdID0gcy5qb2luKCctJyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IGxvY2FsZVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbbG9jYWxlU3RyaW5nU3ltYm9sXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGdldCBsYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydGllc1N5bWJvbF0ubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXQgcmVnaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0aWVzU3ltYm9sXS5yZWdpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXQgc2NyaXB0KCkge1xuICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0aWVzU3ltYm9sXS5zY3JpcHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXQgdmFyaWFudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnRpZXNTeW1ib2xdLnZhcmlhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9XG4gICAgICovXG4gICAgZ2V0IGV4dGxhbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnRpZXNTeW1ib2xdLmV4dGxhbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXQgcHJpdmF0ZVVzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydGllc1N5bWJvbF0ucHJpdmF0ZVZhbHVlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gXCJcIiArIHRoaXMubG9jYWxlU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJ1Y3R1cmUgaGFzIHRoZSBmb2xsb3dpbmc6IGxhbmd1YWdlLCBzY3JpcHQsIHJlZ2lvbiwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2VcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuSTE4bi5Mb2NhbGVNYXB9XG4gICAgICovXG4gICAgZ2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpc1twcm9wZXJ0aWVzU3ltYm9sXSlcbiAgICB9XG5cblxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvY2FsZU1hcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxhbmd1YWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2NyaXB0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVnaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFyaWFudHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHRsYW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJpdmF0ZVVzZVxuICogQG1lbWJlck9mIE1vbnN0ZXIuSTE4blxuICovXG5cbi8qKlxuICogUGFyc2UgbG9jYWwgYWNjb3JkaW5nIHRvIHJmYzQ2NDYgc3RhbmRhcmRcbiAqXG4gKiBMaW1pdGF0aW9uczogVGhlIHJlZ2V4IGNhbm5vdCBoYW5kbGUgbXVsdGlwbGUgdmFyaWFudHMgb3IgcHJpdmF0ZS5cbiAqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIG1ldGhvZCB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLkkxOG4uY3JlYXRlTG9jYWxlKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge01vbnN0ZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlLy9tb25zdGVyLm1qcyc7XG4gKiBuZXcgTW9uc3Rlci5JMThuLmNyZWF0ZUxvY2FsZSgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyBpbnRlZ3JhdGUgdGhpcyBmdW5jdGlvbiBpbmRpdmlkdWFsbHkuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Y3JlYXRlTG9jYWxlfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9pMThuL2xvY2FsZS5tanMnO1xuICogY3JlYXRlTG9jYWxlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogUkZDXG4gKlxuICogYGBgXG4gKiAgIFRoZSBzeW50YXggb2YgdGhlIGxhbmd1YWdlIHRhZyBpbiBBQk5GIFtSRkM0MjM0XSBpczpcbiAqXG4gKiAgIExhbmd1YWdlLVRhZyAgPSBsYW5ndGFnXG4gKiAgICAgICAgICAgICAgICAgLyBwcml2YXRldXNlICAgICAgICAgICAgIDsgcHJpdmF0ZSB1c2UgdGFnXG4gKiAgICAgICAgICAgICAgICAgLyBncmFuZGZhdGhlcmVkICAgICAgICAgIDsgZ3JhbmRmYXRoZXJlZCByZWdpc3RyYXRpb25zXG4gKlxuICogICBsYW5ndGFnICAgICAgID0gKGxhbmd1YWdlXG4gKiAgICAgICAgICAgICAgICAgICAgW1wiLVwiIHNjcmlwdF1cbiAqICAgICAgICAgICAgICAgICAgICBbXCItXCIgcmVnaW9uXVxuICogICAgICAgICAgICAgICAgICAgICooXCItXCIgdmFyaWFudClcbiAqICAgICAgICAgICAgICAgICAgICAqKFwiLVwiIGV4dGVuc2lvbilcbiAqICAgICAgICAgICAgICAgICAgICBbXCItXCIgcHJpdmF0ZXVzZV0pXG4gKlxuICogICBsYW5ndWFnZSAgICAgID0gKDIqM0FMUEhBIFsgZXh0bGFuZyBdKSA7IHNob3J0ZXN0IElTTyA2MzkgY29kZVxuICogICAgICAgICAgICAgICAgIC8gNEFMUEhBICAgICAgICAgICAgICAgICA7IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlXG4gKiAgICAgICAgICAgICAgICAgLyA1KjhBTFBIQSAgICAgICAgICAgICAgIDsgcmVnaXN0ZXJlZCBsYW5ndWFnZSBzdWJ0YWdcbiAqXG4gKiAgIGV4dGxhbmcgICAgICAgPSAqMyhcIi1cIiAzQUxQSEEpICAgICAgICAgOyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZVxuICpcbiAqICAgc2NyaXB0ICAgICAgICA9IDRBTFBIQSAgICAgICAgICAgICAgICAgOyBJU08gMTU5MjQgY29kZVxuICpcbiAqICAgcmVnaW9uICAgICAgICA9IDJBTFBIQSAgICAgICAgICAgICAgICAgOyBJU08gMzE2NiBjb2RlXG4gKiAgICAgICAgICAgICAgICAgLyAzRElHSVQgICAgICAgICAgICAgICAgIDsgVU4gTS40OSBjb2RlXG4gKlxuICogICB2YXJpYW50ICAgICAgID0gNSo4YWxwaGFudW0gICAgICAgICAgICA7IHJlZ2lzdGVyZWQgdmFyaWFudHNcbiAqICAgICAgICAgICAgICAgICAvIChESUdJVCAzYWxwaGFudW0pXG4gKlxuICogICBleHRlbnNpb24gICAgID0gc2luZ2xldG9uIDEqKFwiLVwiICgyKjhhbHBoYW51bSkpXG4gKlxuICogICBzaW5nbGV0b24gICAgID0gJXg0MS01NyAvICV4NTktNUEgLyAleDYxLTc3IC8gJXg3OS03QSAvIERJR0lUXG4gKiAgICAgICAgICAgICAgICAgOyBcImFcIi1cIndcIiAvIFwieVwiLVwielwiIC8gXCJBXCItXCJXXCIgLyBcIllcIi1cIlpcIiAvIFwiMFwiLVwiOVwiXG4gKiAgICAgICAgICAgICAgICAgOyBTaW5nbGUgbGV0dGVyczogeC9YIGlzIHJlc2VydmVkIGZvciBwcml2YXRlIHVzZVxuICpcbiAqICAgcHJpdmF0ZXVzZSAgICA9IChcInhcIi9cIlhcIikgMSooXCItXCIgKDEqOGFscGhhbnVtKSlcbiAqXG4gKiAgIGdyYW5kZmF0aGVyZWQgPSAxKjNBTFBIQSAxKjIoXCItXCIgKDIqOGFscGhhbnVtKSlcbiAqICAgICAgICAgICAgICAgICAgIDsgZ3JhbmRmYXRoZXJlZCByZWdpc3RyYXRpb25cbiAqICAgICAgICAgICAgICAgICAgIDsgTm90ZTogaSBpcyB0aGUgb25seSBzaW5nbGV0b25cbiAqICAgICAgICAgICAgICAgICAgIDsgdGhhdCBzdGFydHMgYSBncmFuZGZhdGhlcmVkIHRhZ1xuICpcbiAqICAgYWxwaGFudW0gICAgICA9IChBTFBIQSAvIERJR0lUKSAgICAgICA7IGxldHRlcnMgYW5kIG51bWJlcnNcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIEZpZ3VyZSAxOiBMYW5ndWFnZSBUYWcgQUJORlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZVxuICogQHJldHVybnMge0xvY2FsZX1cbiAqIEBzaW5jZSAxLjE0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5JMThuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGxvY2FsZVxuICovXG5mdW5jdGlvbiBwYXJzZUxvY2FsZShsb2NhbGUpIHtcblxuICAgIGxvY2FsZSA9IHZhbGlkYXRlU3RyaW5nKGxvY2FsZSkucmVwbGFjZSgvXy9nLCBcIi1cIik7XG5cbiAgICBsZXQgbGFuZ3VhZ2UsIHJlZ2lvbiwgdmFyaWFudHMsIHBhcnRzLCBzY3JpcHQsIGV4dGxhbmcsXG4gICAgICAgIHJlZ2V4UmVndWxhciA9IFwiKGFydC1sb2piYW58Y2VsLWdhdWxpc2h8bm8tYm9rfG5vLW55bnx6aC1ndW95dXx6aC1oYWtrYXx6aC1taW58emgtbWluLW5hbnx6aC14aWFuZylcIixcbiAgICAgICAgcmVnZXhJcnJlZ3VsYXIgPSBcIihlbi1HQi1vZWR8aS1hbWl8aS1ibm58aS1kZWZhdWx0fGktZW5vY2hpYW58aS1oYWt8aS1rbGluZ29ufGktbHV4fGktbWluZ298aS1uYXZham98aS1wd258aS10YW98aS10YXl8aS10c3V8c2duLUJFLUZSfHNnbi1CRS1OTHxzZ24tQ0gtREUpXCIsXG4gICAgICAgIHJlZ2V4R3JhbmRmYXRoZXJlZCA9IFwiKFwiICsgcmVnZXhJcnJlZ3VsYXIgKyBcInxcIiArIHJlZ2V4UmVndWxhciArIFwiKVwiLFxuICAgICAgICByZWdleFByaXZhdGVVc2UgPSBcIih4KC1bQS1aYS16MC05XXsxLDh9KSspXCIsXG4gICAgICAgIHJlZ2V4U2luZ2xldG9uID0gXCJbMC05QS1XWS1aYS13eS16XVwiLFxuICAgICAgICByZWdleEV4dGVuc2lvbiA9IFwiKFwiICsgcmVnZXhTaW5nbGV0b24gKyBcIigtW0EtWmEtejAtOV17Miw4fSkrKVwiLFxuICAgICAgICByZWdleFZhcmlhbnQgPSBcIihbQS1aYS16MC05XXs1LDh9fFswLTldW0EtWmEtejAtOV17M30pXCIsXG4gICAgICAgIHJlZ2V4UmVnaW9uID0gXCIoW0EtWmEtel17Mn18WzAtOV17M30pXCIsXG4gICAgICAgIHJlZ2V4U2NyaXB0ID0gXCIoW0EtWmEtel17NH0pXCIsXG4gICAgICAgIHJlZ2V4RXh0bGFuZyA9IFwiKFtBLVphLXpdezN9KC1bQS1aYS16XXszfSl7MCwyfSlcIixcbiAgICAgICAgcmVnZXhMYW5ndWFnZSA9IFwiKChbQS1aYS16XXsyLDN9KC1cIiArIHJlZ2V4RXh0bGFuZyArIFwiKT8pfFtBLVphLXpdezR9fFtBLVphLXpdezUsOH0pXCIsXG4gICAgICAgIHJlZ2V4TGFuZ3RhZyA9IFwiKFwiICsgcmVnZXhMYW5ndWFnZSArIFwiKC1cIiArIHJlZ2V4U2NyaXB0ICsgXCIpP1wiICsgXCIoLVwiICsgcmVnZXhSZWdpb24gKyBcIik/XCIgKyBcIigtXCIgKyByZWdleFZhcmlhbnQgKyBcIikqXCIgKyBcIigtXCIgKyByZWdleEV4dGVuc2lvbiArIFwiKSpcIiArIFwiKC1cIiArIHJlZ2V4UHJpdmF0ZVVzZSArIFwiKT9cIiArIFwiKVwiLFxuICAgICAgICByZWdleExhbmd1YWdlVGFnID0gXCJeKFwiICsgcmVnZXhHcmFuZGZhdGhlcmVkICsgXCJ8XCIgKyByZWdleExhbmd0YWcgKyBcInxcIiArIHJlZ2V4UHJpdmF0ZVVzZSArIFwiKSRcIixcbiAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4TGFuZ3VhZ2VUYWcpLCBtYXRjaDtcblxuXG4gICAgaWYgKChtYXRjaCA9IHJlZ2V4LmV4ZWMobG9jYWxlKSkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG1hdGNoLmluZGV4ID09PSByZWdleC5sYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHJlZ2V4Lmxhc3RJbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoID09PSB1bmRlZmluZWQgfHwgbWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBsb2NhbGUnKTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hbNl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYW5ndWFnZSA9IG1hdGNoWzZdO1xuXG4gICAgICAgIHBhcnRzID0gbGFuZ3VhZ2Uuc3BsaXQoJy0nKTtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGxhbmd1YWdlID0gcGFydHNbMF07XG4gICAgICAgICAgICBleHRsYW5nID0gcGFydHNbMV07XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGlmIChtYXRjaFsxNF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWdpb24gPSBtYXRjaFsxNF07XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoWzEyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjcmlwdCA9IG1hdGNoWzEyXTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hbMTZdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyaWFudHMgPSBtYXRjaFsxNl07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBMb2NhbGUobGFuZ3VhZ2UsIHJlZ2lvbiwgc2NyaXB0LCB2YXJpYW50cywgZXh0bGFuZyk7XG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge3BhcnNlTG9jYWxlfSBmcm9tIFwiLi4vaTE4bi9sb2NhbGUubWpzXCI7XG5cbmltcG9ydCB7Z2V0RG9jdW1lbnR9IGZyb20gXCIuL3V0aWwubWpzXCI7XG5cbmV4cG9ydCB7Z2V0TG9jYWxlT2ZEb2N1bWVudH1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRSA9ICdlbic7XG5cbi8qKlxuICogV2l0aCB0aGlzIGZ1bmN0aW9uIHlvdSBjYW4gcmVhZCB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiBzZXQgYnkgdGhlIGRvY3VtZW50LlxuICogRm9yIHRoaXMgdGhlIGF0dHJpYnV0ZSBgbGFuZ2AgaW4gdGhlIGh0bWwgdGFnIGlzIHJlYWQuIElmIG5vIGF0dHJpYnV0ZSBpcyBzZXQsIGBlbmAgaXMgdXNlZCBhcyBkZWZhdWx0LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxodG1sIGxhbmc9XCJlblwiPlxuICogYGBgXG4gKlxuICogWW91IGNhbiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBuZXcgTW9uc3Rlci5ET00uZ2V0TG9jYWxlT2ZEb2N1bWVudCgpYC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtnZXRMb2NhbGVPZkRvY3VtZW50fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vbG9jYWxlLm1qcyc7XG4gKiBuZXcgZ2V0TG9jYWxlT2ZEb2N1bWVudCgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjEzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgbG9jYWxlXG4gKiBAc3VtbWFyeSBUcmllcyB0byBkZXRlcm1pbmUgdGhlIGxvY2FsZSB1c2VkXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZU9mRG9jdW1lbnQoKSB7XG5cbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG5cbiAgICBsZXQgaHRtbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKVxuICAgIGlmIChodG1sIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgaHRtbC5oYXNBdHRyaWJ1dGUoJ2xhbmcnKSkge1xuICAgICAgICBsZXQgbG9jYWxlID0gaHRtbC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKTtcbiAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBwYXJzZUxvY2FsZShsb2NhbGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VMb2NhbGUoREVGQVVMVF9MQU5HVUFHRSk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5pbXBvcnQge2dldExvY2FsZU9mRG9jdW1lbnR9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2xvY2FsZS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0F0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldExvY2FsZU9mRG9jdW1lbnQnLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgICAgICBbXG4gICAgICAgICAgICBbXCJkZVwiXSxcbiAgICAgICAgICAgIFtcInNsLUlULW5lZGlzXCJdLFxuICAgICAgICAgICAgW1wiZW4tR0JcIl0sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgaXQoJ3JldHVybiBsYW5ndWFnZSAnICsgYSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGh0bWwuaXRlbSgwKTtcblxuICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdsYW5nJywgYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGdldExvY2FsZU9mRG9jdW1lbnQoKS50b1N0cmluZygpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG59KSIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7Z2V0RG9jdW1lbnRGcmFnbWVudEZyb21TdHJpbmd9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3V0aWwubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtUaGVtZSwgZ2V0RG9jdW1lbnRUaGVtZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vdGhlbWUubWpzXCI7XG5cbmRlc2NyaWJlKCdUaGVtZScsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbmV3IFRoZW1lKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFRoZW1lIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgVGhlbWUoJ215LXRoZW1lJykpLmlzLmEuaW5zdGFuY2VPZihUaGVtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBUaGVtZS1OYW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBUaGVtZSgnbXktdGhlbWUnKS5nZXROYW1lKCkpLmlzLmVxdWFsKCdteS10aGVtZScpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBFcnJvciBiZWNhdXNlIGVtcHR5IGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBUaGVtZSgpKS50by50aHJvdyhUeXBlRXJyb3IpXG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93IEVycm9yIGJlY2F1c2Ugbm8gc3RyaW5nIGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBUaGVtZSgyKSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXREb2N1bWVudFRoZW1lKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFRoZW1lIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChnZXREb2N1bWVudFRoZW1lKCkpLmlzLmEuaW5zdGFuY2VPZihUaGVtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIERlZmF1bHQgVGhlbWUgbmFtZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChnZXREb2N1bWVudFRoZW1lKCkuZ2V0TmFtZSgpKS5pcy5lcXVhbCgnbW9uc3RlcicpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldERvY3VtZW50VGhlbWUoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci10aGVtZS1uYW1lJywgJ3Rlc3R0aGVtZScpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJykucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItdGhlbWUtbmFtZScpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRlc3R0aGVtZSBUaGVtZSBuYW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGdldERvY3VtZW50VGhlbWUoKS5nZXROYW1lKCkpLmlzLmVxdWFsKCd0ZXN0dGhlbWUnKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbn0pO1xuXG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtCYXNlV2l0aE9wdGlvbnN9IGZyb20gXCIuLi90eXBlcy9iYXNld2l0aG9wdGlvbnMubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7aXNBcnJheX0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfSFJFRiwgQVRUUklCVVRFX1NSQ30gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtSZXNvdXJjZX0gZnJvbSBcIi4vcmVzb3VyY2UubWpzXCI7XG5pbXBvcnQge0RhdGF9IGZyb20gXCIuL3Jlc291cmNlL2RhdGEubWpzXCI7XG5pbXBvcnQge1N0eWxlc2hlZXR9IGZyb20gXCIuL3Jlc291cmNlL2xpbmsvc3R5bGVzaGVldC5tanNcIjtcbmltcG9ydCB7U2NyaXB0fSBmcm9tIFwiLi9yZXNvdXJjZS9zY3JpcHQubWpzXCI7XG5cbmV4cG9ydCB7UmVzb3VyY2VNYW5hZ2VyfVxuXG4vKipcbiAqIFRoZSBSZXNvdXJjZU1hbmFnZXIgaXMgYSBzaW5nbGV0b24gdGhhdCBtYW5hZ2VzIGFsbCByZXNvdXJjZXMuXG4gKiBcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1Jlc291cmNlfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kb20vcmVzb3VyY2VtYW5hZ2VyLm1qcyc7XG4gKiBuZXcgUmVzb3VyY2VNYW5hZ2VyKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuMjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHN1bW1hcnkgQSBSZXNvdXJjZSBjbGFzc1xuICovXG4gY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIGV4dGVuZHMgQmFzZVdpdGhPcHRpb25zIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiB0aHJvdyB7RXJyb3J9IHVuc3VwcG9ydGVkIGRvY3VtZW50IHR5cGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICghKHRoaXMuZ2V0T3B0aW9uKCdkb2N1bWVudCcpIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGRvY3VtZW50IHR5cGUnKVxuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiYXNldXJsXG4gICAgICovXG4gICAgZ2V0QmFzZVVSTCgpIHtcbiAgICAgICAgdGhpcy5nZXRPcHRpb24oJ2RvY3VtZW50Jyk/LmJhc2VVUkw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0hUTUxEb2N1bWVudH0gZG9jdW1lbnQ9ZG9jdW1lbnQgRG9jdW1lbnRcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gcmVzb3VyY2VzXG4gICAgICogQHByb3BlcnR5IHtBcnJheX0gcmVzb3VyY2VzLnNjcmlwdHM9W10gYXJyYXkgd2l0aCB7QGxpbmsgTW9uc3Rlci5ET00uUmVzb3VyY2UuU2NyaXB0fSBvYmplY3RzXG4gICAgICogQHByb3BlcnR5IHtBcnJheX0gcmVzb3VyY2VzLnN0eWxlc2hlZXRzPVtdIGFycmF5IHdpdGgge0BsaW5rIE1vbnN0ZXIuRE9NLlJlc291cmNlLkxpbmsuU3R5bGVzaGVldH0gb2JqZWN0c1xuICAgICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHJlc291cmNlcy5kYXRhPVtdIGFycmF5IHdpdGgge0BsaW5rIE1vbnN0ZXIuRE9NLlJlc291cmNlLkRhdGF9IG9iamVjdHNcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldEdsb2JhbE9iamVjdCgnZG9jdW1lbnQnKSxcbiAgICAgICAgICAgIHJlc291cmNlczoge1xuICAgICAgICAgICAgICAgIHNjcmlwdHM6IFtdLFxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXRzOiBbXSxcbiAgICAgICAgICAgICAgICBkYXRhOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGVuZCBUYWdzIHRvIERPTVxuICAgICAqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2VNYW5hZ2VyfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCByZXNvdXJjZSBkZWZpbml0aW9uXG4gICAgICovXG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgcnVuUmVzb3VyY2VNZXRob2QuY2FsbCh0aGlzLCAnY29ubmVjdCcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhdmFpbGFibGVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIHJlc291cmNlIGRlZmluaXRpb25cbiAgICAgKi9cbiAgICBhdmFpbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChydW5SZXNvdXJjZU1ldGhvZC5jYWxsKHRoaXMsICdhdmFpbGFibGUnKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc2NyaXB0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICAgICAqIEBwYXJhbSBbT2JqZWN0fHVuZGVmaW5lZH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlTWFuYWdlcn1cbiAgICAgKiBAc2VlIE1vbnN0ZXIuRE9NLlJlc291cmNlLlNjcmlwdFxuICAgICAqL1xuICAgIGFkZFNjcmlwdCh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGFkZFJlc291cmNlLmNhbGwodGhpcywgJ3NjcmlwdHMnLCB1cmwsIG9wdGlvbnMpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQWRkIFN0eWxlc2hlZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gICAgICogQHBhcmFtIFtPYmplY3R8dW5kZWZpbmVkfSBvcHRpb25zXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2VNYW5hZ2VyfVxuICAgICAqIEBzZWUgTW9uc3Rlci5ET00uUmVzb3VyY2UuTGluay5TdHlsZXNoZWV0XG4gICAgICovXG4gICAgYWRkU3R5bGVzaGVldCh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGFkZFJlc291cmNlLmNhbGwodGhpcywgJ3N0eWxlc2hlZXRzJywgdXJsLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgRGF0YSBUYWdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gICAgICogQHBhcmFtIFtPYmplY3R8dW5kZWZpbmVkfSBvcHRpb25zXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2VNYW5hZ2VyfVxuICAgICAqIEBzZWUgTW9uc3Rlci5ET00uUmVzb3VyY2UuRGF0YVxuICAgICAqL1xuICAgIGFkZERhdGEodXJsLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhZGRSZXNvdXJjZS5jYWxsKHRoaXMsICdkYXRhJywgdXJsLCBvcHRpb25zKTtcbiAgICB9XG5cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gcnVuUmVzb3VyY2VNZXRob2QobWV0aG9kKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgdHlwZSBvZiBbJ3NjcmlwdHMnLCAnc3R5bGVzaGVldHMnLCAnZGF0YSddKSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHNlbGYuZ2V0T3B0aW9uKCdyZXNvdXJjZXMuJyArIHR5cGUpO1xuICAgICAgICBpZiAoIWlzQXJyYXkocmVzb3VyY2VzKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBSZXNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHJlc291cmNlIGRlZmluaXRpb24nKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQucHVzaChyZXNvdXJjZVttZXRob2RdKCkpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcbiAqIEBwYXJhbSBbT2JqZWN0fHVuZGVmaW5lZH0gb3B0aW9uc1xuICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2VNYW5hZ2VyfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkUmVzb3VyY2UodHlwZSwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodXJsIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICAgIHVybCA9IHVybC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgICBsZXQgcmVzb3VyY2U7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NjcmlwdHMnOlxuICAgICAgICAgICAgcmVzb3VyY2UgPSBuZXcgU2NyaXB0KGV4dGVuZCh7fSwgb3B0aW9ucywge1tBVFRSSUJVVEVfU1JDXTogdXJsfSkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3R5bGVzaGVldHMnOlxuICAgICAgICAgICAgcmVzb3VyY2UgPSBuZXcgU3R5bGVzaGVldChleHRlbmQoe30sIG9wdGlvbnMsIHtbQVRUUklCVVRFX0hSRUZdOiB1cmx9KSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICAgIHJlc291cmNlID0gbmV3IERhdGEoZXh0ZW5kKHt9LCBvcHRpb25zLCB7W0FUVFJJQlVURV9TUkNdOiB1cmx9KSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCB0eXBlICcgKyB0eXBlKVxuICAgIH1cblxuICAgIChzZWxmLmdldE9wdGlvbigncmVzb3VyY2VzJyk/Llt0eXBlXSkucHVzaChyZXNvdXJjZSk7XG4gICAgcmV0dXJuIHNlbGY7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5pbXBvcnQge1Jlc291cmNlTWFuYWdlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVzb3VyY2VtYW5hZ2VyLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ1Jlc291cmNlTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBmZXRjaFJlZmVyZW5jZSwgcmV0dXJuU3RhdHVzO1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBnbG9iYWxUaGlzWydmZXRjaCddID0gZmV0Y2hSZWZlcmVuY2U7XG4gICAgICAgIGNsZWFudXBET01Gcm9tVGVzdGluZygpO1xuICAgIH0pXG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3RpbmcoKVxuXG4gICAgICAgIHJldHVyblN0YXR1cyA9IDIwMDtcbiAgICAgICAgZmV0Y2hSZWZlcmVuY2UgPSBnbG9iYWxUaGlzWydmZXRjaCddO1xuICAgICAgICBnbG9iYWxUaGlzWydmZXRjaCddID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuXG4gICAgICAgICAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVybCcpXG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYTogXCJ0ZXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmV0dXJuU3RhdHVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIH07XG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ25ldycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ25ldyBSZXNvdXJjZU1hbmFnZXIoKSBzaG91bGQgcmV0dXJuIFJlc291cmNlTWFuYWdlciBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG5ldyBSZXNvdXJjZU1hbmFnZXIoKTtcbiAgICAgICAgICAgIGV4cGVjdChkKS50by5iZS5pbnN0YW5jZU9mKFJlc291cmNlTWFuYWdlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xvYWQgcmVzb3VyY2VzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBtYW5hZ2VyO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbWFuYWdlciA9IG5ldyBSZXNvdXJjZU1hbmFnZXIoKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnYWRkIHNjcmlwdCBzaG91bGQgaW5zdGFuY2Ugb2YgUmVzb3VyY2VNYW5hZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkU2NyaXB0KCcvZXhhbXBsZS5qcycpKS50by5iZS5pbnN0YW5jZU9mKFJlc291cmNlTWFuYWdlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhZGQgc3R5bGUgc2hvdWxkIGluc3RhbmNlIG9mIFJlc291cmNlTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZFN0eWxlc2hlZXQoJy9zdHlsZS5qcycpKS50by5iZS5pbnN0YW5jZU9mKFJlc291cmNlTWFuYWdlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhZGQgZGF0YSBzaG91bGQgaW5zdGFuY2Ugb2YgUmVzb3VyY2VNYW5hZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkRGF0YSgnL2RhdGEuanNvbicpKS50by5iZS5pbnN0YW5jZU9mKFJlc291cmNlTWFuYWdlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdjb25uZWN0IHJlc291cmNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdhZGQgc2NyaXB0IGFuZCBjb25uZWN0IHNob3VsZCBpbnN0YW5jZSBvZiBSZXNvdXJjZU1hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkU2NyaXB0KCcvZXhhbXBsZS5qcycpLmNvbm5lY3QoKSkudG8uYmUuaW5zdGFuY2VPZihSZXNvdXJjZU1hbmFnZXIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdhZGQgc3R5bGUgYW5kIGNvbm5lY3Qgc2hvdWxkIGluc3RhbmNlIG9mIFJlc291cmNlTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGRTdHlsZXNoZWV0KCcvc3R5bGUuanMnKS5jb25uZWN0KCkpLnRvLmJlLmluc3RhbmNlT2YoUmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnYWRkIGRhdGEgYW5kIGNvbm5lY3QgIHNob3VsZCBpbnN0YW5jZSBvZiBSZXNvdXJjZU1hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkRGF0YSgnL2RhdGEuanNvbicpLmNvbm5lY3QoKSkudG8uYmUuaW5zdGFuY2VPZihSZXNvdXJjZU1hbmFnZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG5cblxuICAgICAgICBkZXNjcmliZSgnY2hlY2sgYXZhaWxhYmlsaXR5IHJlc291cmNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdhZGQgc2NyaXB0IGFuZCBjaGVjayBhdmFpbGFiaWxpdHkgc2hvdWxkIHJldHVybiBQcm9taXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZFNjcmlwdCgnL2V4YW1wbGUuanMnKS5hdmFpbGFibGUoKSkudG8uYmUuaW5zdGFuY2VPZihQcm9taXNlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnYWRkIHN0eWxlIGFuZCBjaGVjayBhdmFpbGFiaWxpdHkgc2hvdWxkIHNob3VsZCByZXR1cm4gUHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGRTdHlsZXNoZWV0KCcvc3R5bGUuanMnKS5hdmFpbGFibGUoKSkudG8uYmUuaW5zdGFuY2VPZihQcm9taXNlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnYWRkIGRhdGEgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eSAgc2hvdWxkIHNob3VsZCByZXR1cm4gUHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGREYXRhKCcvZGF0YS5qc29uJykuYXZhaWxhYmxlKCkpLnRvLmJlLmluc3RhbmNlT2YoUHJvbWlzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnY2hlY2sgYXZhaWxhYmlsaXR5IGV4YW1wbGUuanNvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdhZGQgZGF0YSBhbmQgY2hlY2sgY29udGVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAgICAgbWFuYWdlci5hZGREYXRhKCdodHRwczovL2V4YW1wbGUuY29tL2V4YW1wbGUuanNvbicpLmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpLm91dGVySFRNTCkuY29udGFpbnMoJz57XCJhXCI6XCJ0ZXN0XCJ9PC9zY3JpcHQ+PC9oZWFkPicpO1xuICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge1xuICAgIGdldERvY3VtZW50LCBnZXRXaW5kb3csIGdldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nXG59IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3V0aWwubWpzXCI7XG5cblxuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5cbmRlc2NyaWJlKCdET00nLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5pdEpTRE9NKCk7XG4gICAgfSlcbiAgICBkZXNjcmliZSgnZ2V0RG9jdW1lbnQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZG9jdW1lbnQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBnZXREb2N1bWVudCgpO1xuICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldFdpbmRvdygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBkb2N1bWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IGdldFdpbmRvdygpO1xuICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgICAgICBbXG4gICAgICAgICAgICBbJzxkaXY+PC9kaXY+J10sXG4gICAgICAgICAgICBbJzxkaXY+PGRpdj4yPC9kaXY+PC9kaXY+J10sXG4gICAgICAgICAgICBbJzxkaXY+PGRpdj4yPC9kaXY+JywgJzxkaXY+PGRpdj4yPC9kaXY+PC9kaXY+J10sIC8vIHRlc3QgaW52YWxpZCBodG1sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKCFiKSBiID0gYTtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZG9jdW1lbnRGcmFnbWVudCBvYmplY3QgJyArIGEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJhZ21lbnQgPSBnZXREb2N1bWVudEZyYWdtZW50RnJvbVN0cmluZyhhKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZnJhZ21lbnQpLnRvLmJlLmluc3RhbmNlT2YoRG9jdW1lbnRGcmFnbWVudCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGZyYWdtZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRpdi5pbm5lckhUTUwpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbn0pOyIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBjaGFpIGZyb20gXCJjaGFpXCJcbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfT1BUSU9OU30gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtnZXREb2N1bWVudH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICA8L2Rpdj5cbmA7XG5cblxuZGVzY3JpYmUoJ0RPTScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBDdXN0b21FbGVtZW50LCByZWdpc3RlckN1c3RvbUVsZW1lbnQsIFRlc3RDb21wb25lbnQsIGRvY3VtZW50LCBUZXN0Q29tcG9uZW50MjtcblxuICAgIGRlc2NyaWJlKCdDdXN0b21FbGVtZW50KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vY3VzdG9tZWxlbWVudC5tanNcIikudGhlbigobSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21FbGVtZW50ID0gbVsnQ3VzdG9tRWxlbWVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50ID0gbVsncmVnaXN0ZXJDdXN0b21FbGVtZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29tcG9uZW50ID0gY2xhc3MgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0VGFnKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJtb25zdGVyLXRlc3RjbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVzdENvbXBvbmVudClcblxuICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbXBvbmVudDIgPSBjbGFzcyBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm1vbnN0ZXItdGVzdGNsYXNzMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGRlZmF1bHRzKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb3Rlc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW46ICc8aDE+PC9oMT48YXJ0aWNsZT48cD50ZXN0PC9wPjxkaXYgaWQ9XCJjb250YWluZXJcIj48L2Rpdj48L2FydGljbGU+J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KFRlc3RDb21wb25lbnQyKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ0N1c3RvbUVsZW1lbnQoKSB3aXRoIENvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmVhZCBjb25maWcgZnJvbSB0YWcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPHNjcmlwdCBpZD1cImNvbmZpZzFcIiB0eXBlPVwiYXBwbGljYXRpb24vanNvblwiPlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJkZW1vdGVzdFwiOjE0MjVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG1vbnN0ZXItdGVzdGNsYXNzMiBpZD1cInRoaXNpc2F0ZXN0XCIgZGF0YS1tb25zdGVyLW9wdGlvbnMtc2VsZWN0b3I9XCIjY29uZmlnMVwiPlxuICAgICAgICAgICAgICAgIDwvbW9uc3Rlci10ZXN0Y2xhc3MyPlxuICAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICAgICBsZXQgbW9uc3RlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGlzaXNhdGVzdCcpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChtb25zdGVyLmdldE9wdGlvbignZGVtb3Rlc3QnKSkuaXMuZXFsKDE0MjUpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdjcmVhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBjdXN0b20tZWxlbWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVGVzdENvbXBvbmVudCgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0eXBlb2YgZCkuaXMuZXF1YWwoJ29iamVjdCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdjb25uZWN0IGVtcHR5IGVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnZG9jdW1lbnQgc2hvdWxkIGNvbnRhaW4gbW9uc3Rlci10ZXN0Y2xhc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRlc3RjbGFzcycpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpLmFwcGVuZENoaWxkKGQpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbW9uc3Rlci10ZXN0Y2xhc3MnKS5sZW5ndGgpLmlzLmVxdWFsKDEpO1xuICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEtbW9uc3Rlci1vYmplY3RsaW5rPVwiU3ltYm9sKG1vbnN0ZXJVcGRhdGVyKVwiIGJlY2F1c2UgaXQgaGFzIG5vdGhpbmcgdG8gdXBkYXRlXG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpKS5jb250YWluLmh0bWwoJzxtb25zdGVyLXRlc3RjbGFzcz48L21vbnN0ZXItdGVzdGNsYXNzPicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdjb25uZWN0IGVsZW1lbnQgd2l0aCBodG1sJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2RvY3VtZW50IHNob3VsZCBjb250YWluIG1vbnN0ZXItdGVzdGNsYXNzMicsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRlc3RjbGFzczInKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIC8vIGluc2VydCBET00gcnVuIGluIGV4dHJhIHByb2Nlc3MgdmlhIHNldFRpbWVvdXQhXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21vbnN0ZXItdGVzdGNsYXNzMicpLmxlbmd0aCkuaXMuZXF1YWwoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21vbnN0ZXItdGVzdGNsYXNzMicpLml0ZW0oMCkuc2hhZG93Um9vdC5pbm5lckhUTUwpLmlzLmVxdWFsKCc8aDE+PC9oMT48YXJ0aWNsZT48cD50ZXN0PC9wPjxkaXYgaWQ9XCJjb250YWluZXJcIj48L2Rpdj48L2FydGljbGU+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJykpLmNvbnRhaW4uaHRtbCgnPG1vbnN0ZXItdGVzdGNsYXNzMiBkYXRhLW1vbnN0ZXItb2JqZWN0bGluaz1cIlN5bWJvbChtb25zdGVyVXBkYXRlcilcIj48L21vbnN0ZXItdGVzdGNsYXNzMj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0sIDEwKTtcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdPcHRpb25zIGNoYW5nZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaXQoJ2RlbGVnYXRlc0ZvY3VzIHNob3VsZCBjaGFuZ2UgZnJvbSB0cnVlIHRvIGZhbHNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MnKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0O1xuICAgICAgICAgICAgICAgIGV4cGVjdChPYmplY3QuaXMoZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0ucmVhbFN1YmplY3QsIG8pKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0Lm9wdGlvbnMuZGVsZWdhdGVzRm9jdXMpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3Qub3B0aW9ucy5kZWxlZ2F0ZXNGb2N1cykudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRPcHRpb24oJ2RlbGVnYXRlc0ZvY3VzJykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KE9iamVjdC5pcyhlbGVtZW50W2ludGVybmFsU3ltYm9sXS5yZWFsU3ViamVjdCwgbykpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OUywgSlNPTi5zdHJpbmdpZnkoe2RlbGVnYXRlc0ZvY3VzOiBmYWxzZX0pKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoT2JqZWN0LmlzKGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0LCBvKSkudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldE9wdGlvbignZGVsZWdhdGVzRm9jdXMnKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0Lm9wdGlvbnMuZGVsZWdhdGVzRm9jdXMpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChPYmplY3QuaXMoZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0ucmVhbFN1YmplY3QsIG8pKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnc2V0T3B0aW9ucygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnc2hhZG93TW9kZScsICd4MSddLFxuICAgICAgICAgICAgICAgIFsndGVtcGxhdGVzLm1haW4nLCAneDInXSwgLy8gaXMgZXhwbGljaXRseSBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgWydkZWxlZ2F0ZXNGb2N1cycsICd4NCddLFxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cblxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0ga2V5ICsgJyBzaG91bGQgcmV0dXJuICcgKyBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0ga2V5ICsgJyB3YXMgbm90IHNldCwgdGhlcmVmb3JlIGRlZmF1bHQgJyArIG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgaXQodGV4dCwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MnKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGQuZ2V0T3B0aW9uKGtleSkpLnRvLmJlLm5vdC5lcXVhbChuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4ID0gZC5zZXRPcHRpb24oa2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkLmdldE9wdGlvbihrZXkpKS50by5iZS5lcXVhbChuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnZ2V0T3B0aW9ucygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydzaGFkb3dNb2RlJywgJ29wZW4nXSxcbiAgICAgICAgICAgICAgICBbJ3RlbXBsYXRlcy5tYWluJywgdW5kZWZpbmVkXSwgLy8gaXMgZXhwbGljaXRseSBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgWydkZWxlZ2F0ZXNGb2N1cycsIHRydWVdLFxuICAgICAgICAgICAgICAgIFsneC55LnonLCB0cnVlLCB0cnVlXSwgLy8geC55LnogaXNudCBzZXQsIGRlZmF1bHRWYWx1ZSBpcyB1c2VkXG4gICAgICAgICAgICAgICAgWyd4JywgdHJ1ZSwgdHJ1ZV0gLy8geCBpc250IHNldCwgZGVmYXVsdFZhbHVlIGlzIHVzZWRcbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG5cbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICAgICAgbGV0IHRleHQgPSBrZXkgKyAnIHNob3VsZCByZXR1cm4gJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0ga2V5ICsgJyB3YXMgbm90IHNldCwgdGhlcmVmb3JlIGRlZmF1bHQgJyArIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGl0KHRleHQsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdGVzdGNsYXNzJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4ID0gZC5nZXRPcHRpb24oa2V5LCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoeCkudG8uYmUuZXF1YWwodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvMTEzXG4gICAgICAgICAqL1xuICAgICAgICBkZXNjcmliZSgnQXNzaWduIENTU1N0eWxlIGFzIEFycmF5IHdpdGggd3JvbmcgdHlwZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgY29uc3QgaHRtbFRBRyA9ICdtb25zdGVyLXRlc3RjbGFzcy14MSc7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcywgVGVzdENvbXBvbmVudFgxO1xuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuXG5cbiAgICAgICAgICAgICAgICBUZXN0Q29tcG9uZW50WDEgPSBjbGFzcyBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0VGFnKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxUQUdcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0cnVlXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBnZXQgZGVmYXVsdHMoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiAnPGgxPnRlc3Q8L2gxPidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KFRlc3RDb21wb25lbnRYMSlcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdChodG1sVEFHICsgXCIgc2hvdWxkIHRocm93IEV4Y2VwdGlvblwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChodG1sVEFHKTtcblxuICAgICAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kKGQpO1xuXG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZGl2KS5jb250YWluLmh0bWwoJ2RhdGEtbW9uc3Rlci1lcnJvcj1cIlR5cGVFcnJvcjogdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIENTU1N0eWxlU2hlZXRcIicpO1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvMTEzXG4gICAgICAgICAqL1xuICAgICAgICBkZXNjcmliZSgnQXNzaWduIENTU1N0eWxlIGFzIEFycmF5IGFuZCBDU1NTdHlsZXNoZWV0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBodG1sVEFHID0gJ21vbnN0ZXItdGVzdGNsYXNzLXgxMTMtMic7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcywgVGVzdENvbXBvbmVudFgxMTNYMjtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgICAgIFRlc3RDb21wb25lbnRYMTEzWDIgPSBjbGFzcyBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0VGFnKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxUQUdcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXM6IHttYWluOiAnPGgxPnRlc3Q8L2gxPid9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSAobmV3IENTU1N0eWxlU2hlZXQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuaW5zZXJ0UnVsZSgnYSB7IGNvbG9yIDogcmVkfScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3NdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KFRlc3RDb21wb25lbnRYMTEzWDIpXG5cblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoaHRtbFRBRyArIFwiIHNob3VsZCB0aHJvdyBFeGNlcHRpb24gMlwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChodG1sVEFHKTtcblxuICAgICAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kKGQpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuc2hhZG93Um9vdC5pbm5lckhUTUwpLmlzLmVxKCc8aDE+dGVzdDwvaDE+Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMTNcbiAgICAgICAgICovXG4gICAgICAgIGRlc2NyaWJlKCdBc3NpZ24gQ1NTU3R5bGUgYXMgQXJyYXkgYW5kIENTUyBhcyBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWxUQUcgPSAnbW9uc3Rlci10ZXN0Y2xhc3MteDExMy0yMSc7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcywgVGVzdENvbXBvbmVudFgxMTNYMjI7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgICAgIG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG5cbiAgICAgICAgICAgICAgICBUZXN0Q29tcG9uZW50WDExM1gyMiA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbFRBR1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlczoge21haW46ICc8aDE+dGVzdDwvaDE+J30sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYSB7IGNvbG9yOnJlZCB9JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudChUZXN0Q29tcG9uZW50WDExM1gyMilcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdChodG1sVEFHICsgXCIgc2hvdWxkIGVxIDxzdHlsZT5hIHsgY29sb3I6cmVkIH08L3N0eWxlPjxoMT50ZXN0PC9oMT5cIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbFRBRyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZChkKTtcblxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuc2hhZG93Um9vdC5pbm5lckhUTUwpLmlzLmVxKCc8c3R5bGU+YSB7IGNvbG9yOnJlZCB9PC9zdHlsZT48aDE+dGVzdDwvaDE+Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgICAvKipcbiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvMTEzXG4gICAgICAgICAqL1xuICAgICAgICBkZXNjcmliZSgnQXNzaWduIENTU1N0eWxlIGFzIEFycmF5IGFuZCBDU1MgYXMgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBodG1sVEFHID0gJ21vbnN0ZXItdGVzdGNsYXNzLXgxMTMtMjInO1xuXG4gICAgICAgICAgICBsZXQgbW9ja3MsIFRlc3RDb21wb25lbnRYMTEzWDIyMztcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgICAgIFRlc3RDb21wb25lbnRYMTEzWDIyMyA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbFRBR1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlczoge21haW46ICc8aDE+dGVzdDwvaDE+J30sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbJ2EgeyBjb2xvcjpyZWQgfSddO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KFRlc3RDb21wb25lbnRYMTEzWDIyMylcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdChodG1sVEFHICsgXCIgc2hvdWxkIGVxIDxzdHlsZT5hIHsgY29sb3I6cmVkIH08L3N0eWxlPjxoMT50ZXN0PC9oMT5cIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbFRBRyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZChkKTtcblxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuc2hhZG93Um9vdC5pbm5lckhUTUwpLmlzLmVxKCc8c3R5bGU+YSB7IGNvbG9yOnJlZCB9PC9zdHlsZT48aDE+dGVzdDwvaDE+Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdoYXNOb2RlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcztcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoXCJoYXNOb2RlIG1vbnN0ZXItdGVzdGNsYXNzIHNob3VsZCByZXR1cm4gLi4uXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdGVzdGNsYXNzJyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgcDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgICAgICAgICAgICAgbGV0IHQxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgcDEuYXBwZW5kQ2hpbGQodDEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCd0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChwMSk7XG4gICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZCh0KTtcbiAgICAgICAgICAgICAgICBkLmFwcGVuZENoaWxkKHApO1xuXG4gICAgICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmQoZCk7XG5cblxuICAgICAgICAgICAgICAgIGxldCBuMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUobjEpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHQpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUocCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZShwMSkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZSh0MSkpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KFwiaGFzTm9kZSBtb25zdGVyLXRlc3RjbGFzczIgc2hvdWxkIHJldHVybiAuLi5cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MyJyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgcDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgICAgICAgICAgICAgbGV0IHQxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgcDEuYXBwZW5kQ2hpbGQodDEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCd0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChwMSk7XG4gICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZCh0KTtcblxuXG4gICAgICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmQoZCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGQuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgICAgICBkLnNoYWRvd1Jvb3QuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLmFwcGVuZENoaWxkKHApO1xuXG4gICAgICAgICAgICAgICAgbGV0IG4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZShuMSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUodCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZShwKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHAxKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHQxKSkudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pXG5cbiAgICB9KTtcbn0pO1xuXG5cbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmltcG9ydCB7XG4gICAgYWRkQXR0cmlidXRlVG9rZW4sXG4gICAgYWRkVG9PYmplY3RMaW5rLFxuICAgIGNsZWFyQXR0cmlidXRlVG9rZW5zLFxuICAgIGNvbnRhaW5zQXR0cmlidXRlVG9rZW4sXG4gICAgZmluZENsb3Nlc3RCeUF0dHJpYnV0ZSxcbiAgICBmaW5kQ2xvc2VzdE9iamVjdExpbmssXG4gICAgZ2V0TGlua2VkT2JqZWN0cyxcbiAgICBoYXNPYmplY3RMaW5rLFxuICAgIHJlbW92ZUF0dHJpYnV0ZVRva2VuLFxuICAgIHJlbW92ZU9iamVjdExpbmssXG4gICAgcmVwbGFjZUF0dHJpYnV0ZVRva2VuLFxuICAgIHRvZ2dsZUF0dHJpYnV0ZVRva2VuLFxuICAgIGZpbmRDbG9zZXN0QnlDbGFzc1xufSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9hdHRyaWJ1dGVzLm1qc1wiO1xuXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBodG1sMSwgaHRtbDIsIGh0bWwzO1xuXG5kZXNjcmliZSgnQXR0cmlidXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBodG1sMSA9IGA8ZGl2IGlkPVwidGVzdDFcIj48L2Rpdj5gO1xuICAgICAgICBodG1sMiA9IGA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICA8ZGl2IGlkPVwic3ViMVwiPlxuICAgICAgICA8ZGl2IGlkPVwic3ViMlwiPlxuICAgICAgICAgICAgPGRpdiBpZD1cInN1YjNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwic3ViNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwic3ViNVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5gO1xuICAgICAgICBcbiAgICAgICAgaHRtbDMgPSBgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cInRlc3QxXCI+XG4gICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cInN1YjFcIiBpZD1cImExXCIgY2xhc3M9XCJzdWIxXCI+XG4gICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzdWIyXCIgaWQ9XCJhMlwiIGNsYXNzPVwic3ViMlwiPlxuICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cInN1YjNcIiBpZD1cImEzXCIgY2xhc3M9XCJzdWIzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cInN1YjRcIiBpZD1cImE0XCIgY2xhc3M9XCJzdWI0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJvbGU9XCJzdWI1XCIgaWQ9XCJhNVwiIGNsYXNzPVwic3ViNVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5gO1xuXG5cbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdPYmplY3RMaW5rJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbCgnbXl0ZXN0Jyk7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgb2JqZWN0LWxpbmtzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG9iaiA9IHthOiAxfTtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICBleHBlY3QoaGFzT2JqZWN0TGluayhlbGVtZW50LCBzeW1ib2wpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGFkZFRvT2JqZWN0TGluayhlbGVtZW50LCBzeW1ib2wsIG9iaik7XG4gICAgICAgICAgICBleHBlY3QoaGFzT2JqZWN0TGluayhlbGVtZW50LCBzeW1ib2wpKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICBsZXQgbyA9IGdldExpbmtlZE9iamVjdHMoZWxlbWVudCwgc3ltYm9sKS5uZXh0KCk7XG4gICAgICAgICAgICBleHBlY3Qoby52YWx1ZSkudG8uZXF1YWwob2JqKTtcblxuICAgICAgICAgICAgcmVtb3ZlT2JqZWN0TGluayhlbGVtZW50LCBzeW1ib2wpO1xuICAgICAgICAgICAgZXhwZWN0KGhhc09iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gZ2V0TGlua2VkT2JqZWN0cyhlbGVtZW50LCBzeW1ib2wpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pXG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2ZpbmRDbG9zZXN0T2JqZWN0TGluaygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbCgnbXl0ZXN0Jyk7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwyO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gb2JqZWN0bGluaycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IHN1YjQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViNCcpXG4gICAgICAgICAgICBsZXQgc3ViMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWIyJylcblxuICAgICAgICAgICAgbGV0IG9iaiA9IHt9O1xuXG4gICAgICAgICAgICBleHBlY3QoaGFzT2JqZWN0TGluayhzdWIyLCBzeW1ib2wpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGFkZFRvT2JqZWN0TGluayhzdWIyLCBzeW1ib2wsIG9iaik7XG4gICAgICAgICAgICBleHBlY3QoaGFzT2JqZWN0TGluayhzdWIyLCBzeW1ib2wpKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGZpbmRDbG9zZXN0T2JqZWN0TGluayhzdWI0KTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5pcy5pbnN0YW5jZU9mKEhUTUxEaXZFbGVtZW50KTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZSgnaWQnKSkudG8uYmUuZXF1YWwoJ3N1YjInKTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0F0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMztcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdmaW5kIGNsb3Nlc3QgQXR0cmlidXRlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnYTUnLCAnZGF0YS1tb25zdGVyLXJvbGUnLCB1bmRlZmluZWQsICdzdWI1J10sXG4gICAgICAgICAgICAgICAgWydhNScsICdkYXRhLW1vbnN0ZXItcm9sZScsICdzdWIzJywgJ3N1YjMnXSxcbiAgICAgICAgICAgICAgICBbJ2E1JywgJ2RhdGEtbW9uc3Rlci1yb2xlJywgJ3N1YjEnLCAnc3ViMSddLFxuICAgICAgICAgICAgICAgIFsnYTQnLCAnZGF0YS1tb25zdGVyLXJvbGUnLCAnc3ViMScsICdzdWIxJ10sXG4gICAgICAgICAgICAgICAgWydhMycsICdkYXRhLW1vbnN0ZXItcm9sZScsICdzdWIxJywgJ3N1YjEnXSxcbiAgICAgICAgICAgICAgICBbJ2EyJywgJ2RhdGEtbW9uc3Rlci1yb2xlJywgdW5kZWZpbmVkLCAnc3ViMiddLFxuICAgICAgICAgICAgICAgIFsnYTUnLCAnZGF0YS1tb25zdGVyLXJvbGUnLCAnc3ViNScsICdzdWI1J11cbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgICAgIGl0KCdmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKCcgKyBhICsgJywgJyArIGIgKyAnLCcgKyBjICsgJykgc2hvdWxkIHJldHVybiAnICsgZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZmluZENsb3Nlc3RCeUF0dHJpYnV0ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSwgYiwgYykuZ2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItcm9sZScpKS50by5iZS5lcXVhbChkKTtcbiAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgXG4gICAgICAgIFxuICAgICAgICBkZXNjcmliZSgnZmluZCBjbG9zZXN0IEVsZW1lbnQgd2l0aCBjbGFzcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnYTUnLCAgJ3N1YjMnLCAnc3ViMyddLFxuICAgICAgICAgICAgICAgIFsnYTUnLCAgJ3N1YjEnLCAnc3ViMSddLFxuICAgICAgICAgICAgICAgIFsnYTQnLCAgJ3N1YjEnLCAnc3ViMSddLFxuICAgICAgICAgICAgICAgIFsnYTMnLCAgJ3N1YjEnLCAnc3ViMSddLFxuICAgICAgICAgICAgICAgIFsnYTUnLCAgJ3N1YjUnLCAnc3ViNSddXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGl0KCdmaW5kQ2xvc2VzdEJ5Q2xhc3MoJyArIGEgKyAnLCAnICsgYiArICcpIHNob3VsZCByZXR1cm4gJyArIGMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGZpbmRDbG9zZXN0QnlDbGFzcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSwgYikuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdBdHRyaWJ1dGVzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGF0cmlidXRlS2V5ID0gJ2RhdGEtdGVzdCc7XG5cbiAgICAgICAgaXQoJ3RvZ2dsZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdmFsdWUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXksICdhcHBsZSBiYW5hbm5hJylcbiAgICAgICAgICAgIHRvZ2dsZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAncGluYXBwbGUnKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCdhcHBsZSBiYW5hbm5hIHBpbmFwcGxlJyk7XG4gICAgICAgICAgICB0b2dnbGVBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ3BpbmFwcGxlJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgnYXBwbGUgYmFuYW5uYScpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdhZGRBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHZhbHVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGFkZEF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAncGluYXBwbGUnKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCdwaW5hcHBsZScpO1xuICAgICAgICAgICAgYWRkQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdiYW5hbm5hJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgncGluYXBwbGUgYmFuYW5uYScpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdyZW1vdmVBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHZhbHVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSwgJ2FwcGxlIGJhbmFubmEgbGVtbW9uJylcbiAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAncGluYXBwbGUnKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCdhcHBsZSBiYW5hbm5hIGxlbW1vbicpO1xuICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdiYW5hbm5hJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgnYXBwbGUgbGVtbW9uJyk7XG5cbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnY29udGFpbnNBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHZhbHVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICBleHBlY3QoY29udGFpbnNBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ3BpbmFwcGxlJykpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXksICdhcHBsZSBiYW5hbm5hJylcbiAgICAgICAgICAgIGV4cGVjdChjb250YWluc0F0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAncGluYXBwbGUnKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3QoY29udGFpbnNBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ2JhbmFubmEnKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChjb250YWluc0F0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAnYXBwbGUnKSkudG8uYmUudHJ1ZTtcblxuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCcgcmVwbGFjZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdmFsdWUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0cmlidXRlS2V5LCAnYXBwbGUgYmFuYW5uYSB0b21hdG8nKVxuICAgICAgICAgICAgcmVwbGFjZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAndG9tYXRvJywgJ2xlbW1vbicpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJ2FwcGxlIGJhbmFubmEgbGVtbW9uJyk7XG4gICAgICAgICAgICByZXBsYWNlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdiYW5hbm5hJywgJ3BlYXInKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCdhcHBsZSBwZWFyIGxlbW1vbicpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdjbGVhckF0dHJpYnV0ZVRva2VucyhlbGVtZW50LCBrZXkpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0cmlidXRlS2V5LCAnYXBwbGUgYmFuYW5uYScpXG4gICAgICAgICAgICBjbGVhckF0dHJpYnV0ZVRva2VucyhlbGVtZW50LCBhdHJpYnV0ZUtleSk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgnJyk7XG5cbiAgICAgICAgfSlcblxuXG4gICAgfSlcbn0pIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuaW1wb3J0IHtmaXJlRXZlbnQsIGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50LCBmaXJlQ3VzdG9tRXZlbnR9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2V2ZW50cy5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0V2ZW50cycsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGluaXRKU0RPTSgpO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnZmluZCBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyJywgJ2hlbGxvJyk7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBlID0gZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQoZXZlbnQsICdkYXRhLW1vbnN0ZXInKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3RlcicpKS50by5iZS5lcXVhbCgnaGVsbG8nKVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KGRpdiwgJ2NsaWNrJyk7XG4gICAgICAgICAgICB9LDApXG4gICAgICAgICAgICBcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdmaXJlRXZlbnQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgY2xpY2sgZXZlbnQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBmaXJlRXZlbnQoZGl2LCAnY2xpY2snKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgdG91Y2ggZXZlbnQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBmaXJlRXZlbnQoZGl2LCAndG91Y2gnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgdG91Y2ggZXZlbnQgb24gY29sbGVjdGlvbicsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICAgICAgICAgIGxldCBjb2xsZWN0aW9uID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdicpO1xuXG5cbiAgICAgICAgICAgIGZpcmVFdmVudChjb2xsZWN0aW9uLCAndG91Y2gnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgdG91Y2ggZXZlbnQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgICAgICAgICBsZXQgY29sbGVjdGlvbiA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdkaXYnKTtcblxuXG4gICAgICAgICAgICBmaXJlRXZlbnQoY29sbGVjdGlvbiwgJ3RvdWNoJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gZmlyZUV2ZW50KHt9LCAndG91Y2gnKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICAgICAgXG4gICAgICAgIH0pO1xuICAgIH0pOyAgIFxuICAgIFxuICAgIGRlc2NyaWJlKCdmaXJlQ3VzdG9tRXZlbnQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgY2xpY2sgZXZlbnQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBmaXJlQ3VzdG9tRXZlbnQoZGl2LCAnY2xpY2snKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgdG91Y2ggZXZlbnQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBmaXJlQ3VzdG9tRXZlbnQoZGl2LCAndG91Y2gnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgdG91Y2ggZXZlbnQgb24gY29sbGVjdGlvbjEnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZihlLmRldGFpbC5kZXRhaWwhPT0naGVsbG8gd29ybGQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoJ2Vycm9yJyk7ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgICAgICAgICAgbGV0IGNvbGxlY3Rpb24gPSBkaXYucXVlcnlTZWxlY3RvckFsbCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGZpcmVDdXN0b21FdmVudChjb2xsZWN0aW9uLCAndG91Y2gnLCBcImhlbGxvIHdvcmxkXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGl0KCdzaG91bGQgZmlyZSBhIHRvdWNoIGV2ZW50IG9uIGNvbGxlY3Rpb24yJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCd0b3VjaCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoZS5kZXRhaWwuYSE9PSdoZWxsbyB3b3JsZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgnZXJyb3InKTsgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgICAgICAgICBsZXQgY29sbGVjdGlvbiA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdkaXYnKTtcblxuICAgICAgICAgICAgZmlyZUN1c3RvbUV2ZW50KGNvbGxlY3Rpb24sICd0b3VjaCcsIHthOlwiaGVsbG8gd29ybGRcIn0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICAgICAgICAgIGxldCBjb2xsZWN0aW9uID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdicpO1xuXG5cbiAgICAgICAgICAgIGZpcmVDdXN0b21FdmVudChjb2xsZWN0aW9uLCAndG91Y2gnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBmaXJlQ3VzdG9tRXZlbnQoe30sICd0b3VjaCcpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbn0pOyIsICIndXNlIHN0cmljdCc7XG5cblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cblxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7QmFzZX0gZnJvbSBcIi4uLy4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbCwgZ2V0R2xvYmFsRnVuY3Rpb259IGZyb20gXCIuLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2lzRnVuY3Rpb259IGZyb20gXCIuLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi8uLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtGYWN0b3J5fVxuXG4vKipcbiAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgd29ya2VyIGluc3RhbmNlcy5cbiAqIFxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7RmFjdG9yeX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZG9tL3dvcmtlci9mYWN0b3J5Lm1qcyc7XG4gKiBjb25zb2xlLmxvZyhuZXcgRmFjdG9yeSgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NLldvcmtlclxuICogQHN1bW1hcnkgQSBzbWFsbCBmYWN0b3J5IHRvIGNyZWF0ZSB3b3JrZXJcbiAqL1xuY2xhc3MgRmFjdG9yeSBleHRlbmRzIEJhc2Uge1xuXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXSA9IHtcbiAgICAgICAgICAgIHdvcmtlcjogbmV3IFdlYWtNYXBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB3b3JrZXIgZnJvbSBhIFVSTFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXNzYWdlSGFuZGxlclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVycm9ySGFuZGxlclxuICAgICAqIEByZXR1cm4ge1dvcmtlcn1cbiAgICAgKi9cbiAgICBjcmVhdGVGcm9tVVJMID0gZnVuY3Rpb24gKHVybCwgbWVzc2FnZUhhbmRsZXIsIGVycm9ySGFuZGxlcikge1xuXG4gICAgICAgIGlmICh1cmwgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd29ya2VyQ2xhc3MgPSBnZXRHbG9iYWxGdW5jdGlvbignV29ya2VyJyk7XG4gICAgICAgIHZhciB3b3JrZXIgPSBuZXcgd29ya2VyQ2xhc3ModmFsaWRhdGVTdHJpbmcodXJsKSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24obWVzc2FnZUhhbmRsZXIpKSB7XG4gICAgICAgICAgICB3b3JrZXIub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuY2FsbCh3b3JrZXIsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGVycm9ySGFuZGxlcikpIHtcbiAgICAgICAgICAgIHdvcmtlci5vbmVycm9yID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmNhbGwod29ya2VyLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgd29ya2VyIGZyb20gYSBzY3JpcHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWVzc2FnZUhhbmRsZXJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlcnJvckhhbmRsZXJcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9XG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9BUEkvVVJML2NyZWF0ZU9iamVjdFVSTFxuICAgICAqL1xuICAgIGNyZWF0ZUZyb21TY3JpcHQgPSBmdW5jdGlvbiAoY29udGVudCwgbWVzc2FnZUhhbmRsZXIsIGVycm9ySGFuZGxlcikge1xuICAgICAgICBjb25zdCBibG9iRnVuY3Rpb24gPSBuZXcgZ2V0R2xvYmFsRnVuY3Rpb24oJ0Jsb2InKVxuICAgICAgICBjb25zdCBibG9iID0gbmV3IGJsb2JGdW5jdGlvbihbdmFsaWRhdGVTdHJpbmcoY29udGVudCldLCB7dHlwZTogJ3NjcmlwdC9qYXZhc2NyaXB0J30pO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGdldEdsb2JhbEZ1bmN0aW9uKCdVUkwnKS5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuY3JlYXRlRnJvbVVSTCh1cmwsIG1lc3NhZ2VIYW5kbGVyLCBlcnJvckhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdWyd3b3JrZXInXS5zZXQod29ya2VyLCB1cmwpO1xuXG4gICAgICAgIHJldHVybiB3b3JrZXI7XG5cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVybWluYXRlIHRoZSB3b3JrZXIgYW5kIGNhbGwgcmV2b2tlT2JqZWN0VVJMIGlmIG5lY2Vzc2FyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3b3JrZXJcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Xb3JrZXIuRmFjdG9yeX1cbiAgICAgKi9cbiAgICB0ZXJtaW5hdGUod29ya2VyKSB7XG5cbiAgICAgICAgY29uc3Qgd29ya2VyQ2xhc3MgPSBnZXRHbG9iYWxGdW5jdGlvbignV29ya2VyJyk7XG4gICAgICAgIHZhbGlkYXRlSW5zdGFuY2Uod29ya2VyLCB3b3JrZXJDbGFzcyk7XG5cbiAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzW2ludGVybmFsU3ltYm9sXVsnd29ya2VyJ10uaGFzKHdvcmtlcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdWyd3b3JrZXInXS5nZXQod29ya2VyKTtcbiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuXG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuaW1wb3J0IHtGYWN0b3J5fSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS93b3JrZXIvZmFjdG9yeS5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NLCBpc05vZGV9IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWwoKTtcblxuZGVzY3JpYmUoJ1dvcmtlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFsnVVJMJ10sICdjcmVhdGVPYmplY3RVUkwnLCB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiL2V4YW1wbGUubWpzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBnbG9iYWxbJ1dvcmtlciddID0gY2xhc3Mge1xuICAgICAgICAgICAgICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb25lcnJvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb25tZXNzYWdlKCkge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhID0gdHlwZW9mIGdsb2JhbFsnV29ya2VyJ107XG4gICAgICAgICAgICBsZXQgYTEgPSB0eXBlb2YgV29ya2VyO1xuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBqc2RvbSA9IGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdGYWN0b3J5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdjcmVhdGUgd29ya2VyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IGZhY3RvcnkuY3JlYXRlRnJvbVNjcmlwdCgnY29uc29sZS5sb2coXCJoZWxsbyB3b3JsZFwiKTsnKVxuICAgICAgICAgICAgZXhwZWN0KHdvcmtlcikuaXMuaW5zdGFuY2VvZihXb3JrZXIpO1xuXG4gICAgICAgICAgICBleHBlY3QoZmFjdG9yeS50ZXJtaW5hdGUod29ya2VyKSkuaXMuaW5zdGFuY2VvZihGYWN0b3J5KVxuXG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtBVFRSSUJVVEVfVEhFTUVfTkFNRX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vY29uc3RhbnRzLm1qc1wiO1xuXG5pbXBvcnQge2ZpbmREb2N1bWVudFRlbXBsYXRlLCBUZW1wbGF0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vdGVtcGxhdGUubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxuZGVzY3JpYmUoJ1RlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5pdEpTRE9NKCk7XG4gICAgfSlcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPHRlbXBsYXRlIGlkPVwibXl0ZW1wbGF0ZVwiPjwvdGVtcGxhdGU+YDtcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdjcmVhdGUgSFRNTEZyYWdtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBbXG4gICAgICAgICAgICBbXCI8ZGl2PmZpcnN0PC9kaXY+PGRpdj5zZWNvbmQ8L2Rpdj5cIl0sXG4gICAgICAgICAgICBbXCI8ZGl2PmZpcnN0PC9kaXY+XCJdLFxuICAgICAgICAgICAgW1wiPGRpdj5maXJzdDwvZGl2PjxwPnNlY29uZDwvcD5cIl1cblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ25ldyBUZW1wbGF0ZSgpLmdldE5ld0RvY3VtZW50RnJhZ21lbnRBc1N0cmluZygpIHNob3VsZCByZXR1cm4gc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gYTtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IG5ldyBUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG5cblxuICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChjb250YWluZXIuaW5uZXJIVE1MKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGUgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCduZXcgVGVtcGxhdGUoKSBzaG91bGQgcmV0dXJuIGRvY3VtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gbmV3IFRlbXBsYXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJykpO1xuICAgICAgICAgICAgZXhwZWN0KGQpLnRvLmJlLmluc3RhbmNlT2YoVGVtcGxhdGUpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZ2V0VGVtcGxhdGVFbGVtZW50KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCduZXcgVGVtcGxhdGUoKS5nZXRUZW1wbGF0ZUVsZW1lbnQoKSBzaG91bGQgcmV0dXJuIEhUTUxUZW1wbGF0ZUVsZW1lbnQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBuZXcgVGVtcGxhdGUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7XG4gICAgICAgICAgICBleHBlY3QoZC5nZXRUZW1wbGF0ZUVsZW1lbnQoKSkudG8uYmUuaW5zdGFuY2VPZihIVE1MVGVtcGxhdGVFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmZpbmREb2N1bWVudFRlbXBsYXRlKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgVGVtcGxhdGUgbm90IGZvdW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmREb2N1bWVudFRlbXBsYXRlKFwibm93YXlcIiwgZGl2KVxuICAgICAgICAgICAgfSkudG8udGhyb3dzKEVycm9yKTtcbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZmluZERvY3VtZW50VGVtcGxhdGUoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzY3JpYmUoJ1RlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCBmaW5kIHRlbXBsYXRlIG92ZXIgb3duZXJEb2N1bWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm15dGVtcGxhdGVcIiwgZGl2KTtcbiAgICAgICAgICAgICAgICBleHBlY3QodCkuaXMuaW5zdGFuY2VvZihUZW1wbGF0ZSk7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdUaG1lbmVkIFRlbXBsYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG1lbUF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD1cIm15dGVtcGxhdGVcIj48cD4xPC9wPjwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD1cIm15dGVtcGxhdGUtbW9uc3RlclwiPjxwPjI8L3A+PC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlkPVwibXl0ZW1wbGF0ZS10ZXN0dGhlbWVcIj48cD40PC9wPjwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD1cIm15cHJlZml4LW15dGVtcGxhdGUtbW9uc3RlclwiPjxwPjM8L3A+PC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgICAgbGV0IGh0bWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJyk7XG4gICAgICAgICAgICAgICAgaWYgKGh0bWwuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FKSkge1xuICAgICAgICAgICAgICAgICAgICBtZW1BdHRyaWJ1dGVWYWx1ZSA9IGh0bWwuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgbGV0IGh0bWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaHRtbC5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX1RIRU1FX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWVtQXR0cmlidXRlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1RIRU1FX05BTUUsIG1lbUF0dHJpYnV0ZVZhbHVlKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGZpbmQgdGVtcGxhdGUgb3ZlciBvd25lckRvY3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBodG1sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci10ZW1wbGF0ZS1wcmVmaXgnLCAnbXlwcmVmaXgnKVxuICAgICAgICAgICAgICAgIGRpdi5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBsZXQgdDEgPSBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm15dGVtcGxhdGVcIiwgZGl2KTtcbiAgICAgICAgICAgICAgICBleHBlY3QodDEpLmlzLmluc3RhbmNlb2YoVGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0MS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkudGV4dENvbnRlbnQpLmlzLmVxdWFsKFwiM1wiKTtcblxuICAgICAgICAgICAgICAgIGRpdi5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci10ZW1wbGF0ZS1wcmVmaXgnKVxuICAgICAgICAgICAgICAgIGxldCB0MiA9IGZpbmREb2N1bWVudFRlbXBsYXRlKFwibXl0ZW1wbGF0ZVwiLCBkaXYpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0MikuaXMuaW5zdGFuY2VvZihUZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQyLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS50ZXh0Q29udGVudCkuaXMuZXF1YWwoXCIyXCIpO1xuXG4gICAgICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1RIRU1FX05BTUUsJ3Rlc3R0aGVtZScpO1xuICAgICAgICAgICAgICAgIGxldCBhPSBodG1sLm91dGVySFRNTDtcbiAgICAgICAgICAgICAgICBsZXQgdDMgPSBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm15dGVtcGxhdGVcIiwgZGl2KTtcbiAgICAgICAgICAgICAgICBleHBlY3QodDMpLmlzLmluc3RhbmNlb2YoVGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0My5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkudGV4dENvbnRlbnQpLmlzLmVxdWFsKFwiNFwiKTtcblxuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IHdpbmRvd1JlYWR5O1xubGV0IGRvbVJlYWR5O1xuXG5kZXNjcmliZSgnUmVhZHknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIGltcG9ydChcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVhZHkubWpzXCIpLnRoZW4oKG0pID0+IHtcbiAgICAgICAgICAgICAgICBkb21SZWFkeSA9IG1bJ2RvbVJlYWR5J107XG4gICAgICAgICAgICAgICAgd2luZG93UmVhZHkgPSBtWyd3aW5kb3dSZWFkeSddO1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZG9tUmVhZHknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Jlc29sdmUgcHJvbWlzZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBkb21SZWFkeS50aGVuKGRvbmUpLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2luZG93UmVhZHknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Jlc29sdmUgcHJvbWlzZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICB3aW5kb3dSZWFkeS50aGVuKGRvbmUpLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7QmFzZVdpdGhPcHRpb25zfSBmcm9tIFwiLi4vdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2lzQXJyYXl9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7U3RhY2t9IGZyb20gXCIuLi90eXBlcy9zdGFjay5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtGb2N1c01hbmFnZXJ9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEtFWV9ET0NVTUVOVCA9ICdkb2N1bWVudCc7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEtFWV9DT05URVhUID0gJ2NvbnRleHQnO1xuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtTeW1ib2x9XG4gKi9cbmNvbnN0IHN0YWNrU3ltYm9sID0gU3ltYm9sKCdzdGFjaycpO1xuXG5cbi8qKlxuICogV2l0aCB0aGUgZm9jdXNtYW5hZ2VyIHRoZSBmb2N1cyBjYW4gYmUgc3RvcmVkIGluIGEgZG9jdW1lbnQsIHJlY2FsbGVkIGFuZCBtb3ZlZC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtGb2N1c01hbmFnZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9mb2N1c21hbmFnZXIubWpzJztcbiAqIG5ldyBGb2N1c01hbmFnZXIoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgbG9jYWxlXG4gKiBAc3VtbWFyeSBIYW5kbGUgdGhlIGZvY3VzXG4gKi9cbiBjbGFzcyBGb2N1c01hbmFnZXIgZXh0ZW5kcyBCYXNlV2l0aE9wdGlvbnMge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdHx1bmRlZmluZWR9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKHRoaXMuZ2V0T3B0aW9uKEtFWV9ET0NVTUVOVCksIEhUTUxEb2N1bWVudCk7XG5cbiAgICAgICAgdGhpc1tzdGFja1N5bWJvbF0gPSBuZXcgU3RhY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge0hUTUxEb2N1bWVudH0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IG9iamVjdCBpbnRvIHdoaWNoIHRoZSBub2RlIGlzIHRvIGJlIGFwcGVuZGVkXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgW0tFWV9ET0NVTUVOVF06IGdldEdsb2JhbE9iamVjdCgnZG9jdW1lbnQnKSxcbiAgICAgICAgICAgIFtLRVlfQ09OVEVYVF06IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1lbWJlcnMgdGhlIGN1cnJlbnQgZm9jdXMgb24gYSBzdGFjay5cbiAgICAgKiBTZXZlcmFsIGZvY3VzIGNhbiBiZSBzdG9yZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Gb2N1c01hbmFnZXJ9XG4gICAgICovXG4gICAgc3RvcmVGb2N1cygpIHtcblxuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmdldEFjdGl2ZSgpO1xuICAgICAgICBpZiAoYWN0aXZlIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgICAgdGhpc1tzdGFja1N5bWJvbF0ucHVzaChhY3RpdmUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgZm9jdXMgb24gdGhlIHN0YWNrIGlzIHNldCBhZ2FpblxuICAgICAqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uRm9jdXNNYW5hZ2VyfVxuICAgICAqL1xuICAgIHJlc3RvcmVGb2N1cygpIHtcblxuICAgICAgICBjb25zdCBsYXN0ID0gdGhpc1tzdGFja1N5bWJvbF0ucG9wKCk7XG4gICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1cyhsYXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBwcmV2ZW50U2Nyb2xsXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Gb2N1c01hbmFnZXJ9XG4gICAgICovXG4gICAgZm9jdXMoZWxlbWVudCwgcHJldmVudFNjcm9sbCkge1xuXG4gICAgICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgTm9kZSlcblxuICAgICAgICBlbGVtZW50LmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHByZXZlbnRTY3JvbGwgPz8gZmFsc2VcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAgICovXG4gICAgZ2V0QWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb24oS0VZX0RPQ1VNRU5UKS5hY3RpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhbGwgZWxlbWVudHMgdGhhdCBjYW4gYmUgZm9jdXNlZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSBxdWVyeVxuICAgICAqIEByZXR1cm4ge2FycmF5fVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mXG4gICAgICovXG4gICAgZ2V0Rm9jdXNhYmxlKHF1ZXJ5KSB7XG5cbiAgICAgICAgbGV0IGNvbnRleHRFbGVtZW50ID0gdGhpcy5nZXRPcHRpb24oS0VZX0NPTlRFWFQpO1xuICAgICAgICBpZiAoY29udGV4dEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQgPSB0aGlzLmdldE9wdGlvbihLRVlfRE9DVU1FTlQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdGVJbnN0YW5jZShjb250ZXh0RWxlbWVudCwgTm9kZSlcblxuICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocXVlcnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFsuLi5jb250ZXh0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgJ2RldGFpbHMsIGJ1dHRvbiwgaW5wdXQsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKSwgc2VsZWN0LCB0ZXh0YXJlYSwgYVtocmVmXSwgYm9keSdcbiAgICAgICAgKV0uZmlsdGVyKChlbGVtZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkICYmICFlbGVtZW50Lm1hdGNoZXMocXVlcnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSAndHJ1ZScpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBpZihyZWN0LndpZHRoPT09MCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYocmVjdC5oZWlnaHQ9PT0wKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Gb2N1c01hbmFnZXJ9XG4gICAgICovXG4gICAgZm9jdXNOZXh0KHF1ZXJ5KSB7XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0QWN0aXZlKCk7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IHRoaXMuZ2V0Rm9jdXNhYmxlKHF1ZXJ5KTtcblxuICAgICAgICBpZiAoIWlzQXJyYXkoZm9jdXNhYmxlKSB8fCBmb2N1c2FibGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gZm9jdXNhYmxlLmluZGV4T2YoY3VycmVudCk7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1cyhmb2N1c2FibGVbaW5kZXggKyAxXSB8fCBmb2N1c2FibGVbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKGZvY3VzYWJsZVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKGZvY3VzYWJsZVswXSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLkZvY3VzTWFuYWdlcn1cbiAgICAgKi9cbiAgICBmb2N1c1ByZXYocXVlcnkpIHtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXRBY3RpdmUoKTtcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gdGhpcy5nZXRGb2N1c2FibGUocXVlcnkpO1xuXG4gICAgICAgIGlmICghaXNBcnJheShmb2N1c2FibGUpIHx8IGZvY3VzYWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBmb2N1c2FibGUuaW5kZXhPZihjdXJyZW50KTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKGZvY3VzYWJsZVtpbmRleCAtIDFdIHx8IGZvY3VzYWJsZVtmb2N1c2FibGUubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKGZvY3VzYWJsZVtmb2N1c2FibGUubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1cyhmb2N1c2FibGVbZm9jdXNhYmxlLmxlbmd0aCAtIDFdKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbn1cblxuXG5cblxuXG5cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCI7XG5pbXBvcnQge0ZvY3VzTWFuYWdlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vZm9jdXNtYW5hZ2VyLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0ZvY3VzTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpLmlubmVySFRNTCA9ICcnXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCduZXcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBGb2N1c01hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEZvY3VzTWFuYWdlcigpKS5pcy5pbnN0YW5jZW9mKEZvY3VzTWFuYWdlcik7XG4gICAgICAgIH0pXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ3N0b3JlIGFuZCByZXN0b3JlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbWFuYWdlcjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1hbmFnZXIgPSBuZXcgRm9jdXNNYW5hZ2VyKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKS5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4MVwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidGVzdGl0XCIgaWQ9XCJ0eDJcIj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInRlc3RpdFwiIGlkPVwidHgzXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4NFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXN0aXRcIiB0YWJpbmRleD1cIjJcIiBpZD1cInR4NVwiPmhlbGxvPC9wPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidGVzdGl0XCIgaWQ9XCJ0eDZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4N1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGVzdGl0JykpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206IDIwMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3J1biBpc3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIG1hbmFnZXIuZm9jdXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R4MScpKTtcbiAgICAgICAgICAgIG1hbmFnZXIuc3RvcmVGb2N1cygpO1xuXG4gICAgICAgICAgICBjb25zdCBlMSA9IG1hbmFnZXIuZ2V0QWN0aXZlKCk7XG4gICAgICAgICAgICBleHBlY3QoZTEuZ2V0QXR0cmlidXRlKCdpZCcpLCAnZXJyb3IxJykudG8uYmUuZXF1YWwoJ3R4MScpO1xuXG4gICAgICAgICAgICBtYW5hZ2VyLmZvY3VzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0eDInKSk7XG5cbiAgICAgICAgICAgIG1hbmFnZXIuc3RvcmVGb2N1cygpO1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuZ2V0QWN0aXZlKCkuZ2V0QXR0cmlidXRlKCdpZCcpLCAnZXJyb3IyJykudG8uYmUuZXF1YWwoJ3R4MicpO1xuICAgICAgICAgICAgbWFuYWdlci5mb2N1c05leHQoKTtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmdldEFjdGl2ZSgpLmdldEF0dHJpYnV0ZSgnaWQnKSwgJ2Vycm9yMycpLnRvLmJlLmVxdWFsKCd0eDQnKTtcbiAgICAgICAgICAgIG1hbmFnZXIuZm9jdXNOZXh0KCk7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5nZXRBY3RpdmUoKS5nZXRBdHRyaWJ1dGUoJ2lkJyksICdlcnJvcjQnKS50by5iZS5lcXVhbCgndHg1Jyk7XG4gICAgICAgICAgICBtYW5hZ2VyLnJlc3RvcmVGb2N1cygpO1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuZ2V0QWN0aXZlKCkuZ2V0QXR0cmlidXRlKCdpZCcpLCAnZXJyb3I1JykudG8uYmUuZXF1YWwoJ3R4MicpO1xuICAgICAgICAgICAgbWFuYWdlci5yZXN0b3JlRm9jdXMoKTtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmdldEFjdGl2ZSgpLmdldEF0dHJpYnV0ZSgnaWQnKSwgJ2Vycm9yNicpLnRvLmJlLmVxdWFsKCd0eDEnKTtcbiAgICAgICAgICAgIG1hbmFnZXIucmVzdG9yZUZvY3VzKCk7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5nZXRBY3RpdmUoKS5nZXRBdHRyaWJ1dGUoJ2lkJyksICdlcnJvcjcnKS50by5iZS5lcXVhbCgndHgxJyk7XG4gICAgICAgIH0pXG5cblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgncmV0dXJudHlwZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZm9jdXNtYW5hZ2VyO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgZm9jdXNtYW5hZ2VyID0gbmV3IEZvY3VzTWFuYWdlcigpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdjaGVjayByZXR1cm5zJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBleHBlY3QoZm9jdXNtYW5hZ2VyLmdldEZvY3VzYWJsZSgpKS5pcy5pbnN0YW5jZW9mKEFycmF5KTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIuZ2V0QWN0aXZlKCkpLmlzLmluc3RhbmNlb2YoSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgZXhwZWN0KGZvY3VzbWFuYWdlci5mb2N1c05leHQoKSkuaXMuaW5zdGFuY2VvZihGb2N1c01hbmFnZXIpO1xuICAgICAgICAgICAgZXhwZWN0KGZvY3VzbWFuYWdlci5mb2N1c1ByZXYoKSkuaXMuaW5zdGFuY2VvZihGb2N1c01hbmFnZXIpO1xuICAgICAgICAgICAgZXhwZWN0KGZvY3VzbWFuYWdlci5zdG9yZUZvY3VzKCkpLmlzLmluc3RhbmNlb2YoRm9jdXNNYW5hZ2VyKTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIuZm9jdXMoZG9jdW1lbnQuYm9keSkpLmlzLmluc3RhbmNlb2YoRm9jdXNNYW5hZ2VyKTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIucmVzdG9yZUZvY3VzKCkpLmlzLmluc3RhbmNlb2YoRm9jdXNNYW5hZ2VyKTtcblxuICAgICAgICB9KVxuXG4gICAgfSlcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge2dldEdsb2JhbEZ1bmN0aW9ufSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtQcm94eU9ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtBVFRSSUJVVEVQUkVGSVgsQXNzZW1ibGVyfVxuXG4vKipcbiAqIGF0dHJpYnV0ZSBwcmVmaXhcbiAqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKi9cbmNvbnN0IEFUVFJJQlVURVBSRUZJWCA9IFwiZGF0YS1tb25zdGVyLVwiO1xuXG4vKipcbiAqIEFzc2VtYmxlciBjbGFzc1xuICogXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtBc3NlbWJsZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS9hc3NlbWJsZXIubWpzJztcbiAqIGNvbnNvbGUubG9nKG5ldyBBc3NlbWJsZXIoKSlcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAc3VtbWFyeSBBbGxvd3MgeW91IHRvIGJ1aWxkIGFuIGh0bWwgZnJhZ21lbnRcbiAqL1xuY2xhc3MgQXNzZW1ibGVyIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZyYWdtZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlUHJlZml4ID0gQVRUUklCVVRFUFJFRklYO1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKGZyYWdtZW50LCBnZXRHbG9iYWxGdW5jdGlvbignRG9jdW1lbnRGcmFnbWVudCcpKTtcbiAgICAgICAgdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgICAqIEByZXR1cm5zIHtBc3NlbWJsZXJ9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBzZXRBdHRyaWJ1dGVQcmVmaXgocHJlZml4KSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHByZWZpeCk7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlUHJlZml4ID0gcHJlZml4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0QXR0cmlidXRlUHJlZml4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVQcmVmaXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3h5T2JzZXJ2ZXJ8dW5kZWZpbmVkfSBkYXRhXG4gICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICAgICAqL1xuICAgIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoZGF0YSkge1xuXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgUHJveHlPYnNlcnZlcih7fSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKGRhdGEsIFByb3h5T2JzZXJ2ZXIpO1xuICAgICAgICBsZXQgZnJhZ21lbnQgPSB0aGlzLmZyYWdtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIH1cblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuaW1wb3J0IHtBVFRSSUJVVEVQUkVGSVgsIEFzc2VtYmxlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vYXNzZW1ibGVyLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5kZXNjcmliZSgnQXNzZW1ibGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGluaXRKU0RPTSgpO1xuICAgIH0pXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZURvY3VtZW50RnJhZ21lbnQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gPGRpdj5PbmU8L2Rpdj48ZGl2PlR3bzwvZGl2PicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoJzxkaXY+T25lPC9kaXY+PGRpdj5Ud288L2Rpdj4nKTtcblxuICAgICAgICAgICAgbGV0IGYgPSBuZXcgQXNzZW1ibGVyKGZyYWdtZW50KTtcblxuICAgICAgICAgICAgLy8gY29udmVydCB0byBzdHJpbmdcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICBleHBlY3QoY29udGFpbmVyLmlubmVySFRNTCkudG8uYmUuZXF1YWwoJzxkaXY+T25lPC9kaXY+PGRpdj5Ud288L2Rpdj4nKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBEb2N1bWVudEZyYWdtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gbmV3IEFzc2VtYmxlcihkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICAgICAgICAgICAgZXhwZWN0KGQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKS50by5iZS5pbnN0YW5jZU9mKERvY3VtZW50RnJhZ21lbnQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCduZXcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCduZXcgUmVuZGVyZXIoKSBzaG91bGQgcmV0dXJuIEFzc2VtYmxlciBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG5ldyBBc3NlbWJsZXIoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgICAgICAgIGV4cGVjdChkKS50by5iZS5pbnN0YW5jZU9mKEFzc2VtYmxlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldEF0dHJpYnV0ZVByZWZpeCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiAnICsgQVRUUklCVVRFUFJFRklYLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG5ldyBBc3NlbWJsZXIoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgICAgICAgIGV4cGVjdChkLmdldEF0dHJpYnV0ZVByZWZpeCgpKS50by5iZS5lcXVhbChBVFRSSUJVVEVQUkVGSVgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXRBdHRyaWJ1dGVQcmVmaXgoKS5nZXRBdHRyaWJ1dGVQcmVmaXgoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gc2FtZSB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gbmV3IEFzc2VtYmxlcihkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICAgICAgICAgICAgZXhwZWN0KGQuc2V0QXR0cmlidXRlUHJlZml4KCd0ZXN0MDEnKS5nZXRBdHRyaWJ1dGVQcmVmaXgoKSkudG8uYmUuZXF1YWwoJ3Rlc3QwMScpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7aXNPYmplY3QsIGlzU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlSW50ZWdlciwgdmFsaWRhdGVPYmplY3QsIHZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge0xvY2FsZSwgcGFyc2VMb2NhbGV9IGZyb20gXCIuL2xvY2FsZS5tanNcIjtcblxuZXhwb3J0IHtUcmFuc2xhdGlvbnN9XG5cbi8qKlxuICogV2l0aCB0aGlzIGNsYXNzIHlvdSBjYW4gbWFuYWdlIHRyYW5zbGF0aW9ucyBhbmQgYWNjZXNzIHRoZSBrZXlzLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1RyYW5zbGF0aW9uc30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzJztcbiAqIG5ldyBUcmFuc2xhdGlvbnMoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7VHJhbnNsYXRpb25zfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9pMThuL3RyYW5zbGF0aW9ucy5tanMnO1xuICogaW1wb3J0IHtwYXJzZUxvY2FsZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvaTE4bi9sb2NhbGUubWpzJztcbiAqXG4gKiBjb25zdCB0cmFuc2xhdGlvbiA9IG5ldyBUcmFuc2xhdGlvbnMocGFyc2VMb2NhbGUoJ2VuLUdCJykpO1xuICpcbiAqIHRyYW5zbGF0aW9uLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gKiAgICAgICAgICAgdGV4dDE6IFwiY2xpY2tcIixcbiAqICAgICAgICAgICB0ZXh0Mjoge1xuICogICAgICAgICAgICAgJ29uZSc6ICdjbGljayBvbmNlJyxcbiAqICAgICAgICAgICAgICdvdGhlcic6ICdjbGljayBuIHRpbWVzJ1xuICogICAgICAgICAgIH1cbiAqICAgICAgICB9KTtcbiAqXG4gKiBjb25zb2xlLmxvZyh0cmFuc2xhdGlvbi5nZXRUZXh0KCd0ZXh0MScpKTtcbiAqIC8vIFx1MjFBNiBjbGlja1xuICpcbiAqIGNvbnNvbGUubG9nKHRyYW5zbGF0aW9uLmdldFBsdXJhbFJ1bGVUZXh0KCd0ZXh0MicsMSkpO1xuICogLy8gLT4gY2xpY2sgb25jZVxuICogY29uc29sZS5sb2codHJhbnNsYXRpb24uZ2V0UGx1cmFsUnVsZVRleHQoJ3RleHQyJywyKSk7XG4gKiAvLyAtPiBjbGljayBuIHRpbWVzXG4gKlxuICogQHNpbmNlIDEuMTMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkkxOG5cbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzMDY2XG4gKi9cbmNsYXNzIFRyYW5zbGF0aW9ucyBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xvY2FsZX0gbG9jYWxlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobG9jYWxlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgaWYgKGlzU3RyaW5nKGxvY2FsZSkpIHtcbiAgICAgICAgICAgIGxvY2FsZSA9IHBhcnNlTG9jYWxlKGxvY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvY2FsZSA9IHZhbGlkYXRlSW5zdGFuY2UobG9jYWxlLCBMb2NhbGUpO1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSBuZXcgTWFwKCk7XG5cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgYSB0ZXh0IHVzaW5nIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqIElmIG5vIHN1aXRhYmxlIGtleSBpcyBmb3VuZCwgYGRlZmF1bHRUZXh0YCBpcyB0YWtlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGRlZmF1bHRUZXh0XG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBrZXkgbm90IGZvdW5kXG4gICAgICovXG4gICAgZ2V0VGV4dChrZXksIGRlZmF1bHRUZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yYWdlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdFRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5ICcgKyBrZXkgKyAnIG5vdCBmb3VuZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTdHJpbmcoZGVmYXVsdFRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHIgPSB0aGlzLnN0b3JhZ2UuZ2V0KGtleSk7XG4gICAgICAgIGlmIChpc09iamVjdChyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGx1cmFsUnVsZVRleHQoa2V5LCAnb3RoZXInLCBkZWZhdWx0VGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbnVtYmVyIGBjb3VudGAgY2FuIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4gSW4gYWRkaXRpb24gdG8gYSBudW1iZXIsIG9uZSBvZiB0aGUga2V5d29yZHMgY2FuIGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5LlxuICAgICAqIFwiemVyb1wiLCBcIm9uZVwiLCBcInR3b1wiLCBcImZld1wiLCBcIm1hbnlcIiBhbmQgXCJvdGhlclwiLiBSZW1lbWJlcjogbm90IGV2ZXJ5IGxhbmd1YWdlIGhhcyBhbGwgcnVsZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYXBwcm9wcmlhdGUgdGV4dCBmb3IgdGhpcyBudW1iZXIgaXMgdGhlbiBzZWxlY3RlZC4gSWYgbm8gc3VpdGFibGUga2V5IGlzIGZvdW5kLCBgZGVmYXVsdFRleHRgIGlzIHRha2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7aW50ZWdlcnxjb3VudH0gY291bnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGRlZmF1bHRUZXh0XG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldFBsdXJhbFJ1bGVUZXh0KGtleSwgY291bnQsIGRlZmF1bHRUZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yYWdlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTdHJpbmcoZGVmYXVsdFRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHIgPSB2YWxpZGF0ZU9iamVjdCh0aGlzLnN0b3JhZ2UuZ2V0KGtleSkpO1xuXG4gICAgICAgIGxldCBrZXl3b3JkO1xuICAgICAgICBpZiAoaXNTdHJpbmcoY291bnQpKSB7XG4gICAgICAgICAgICBrZXl3b3JkID0gY291bnQudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvdW50ID0gdmFsaWRhdGVJbnRlZ2VyKGNvdW50KTtcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpZyBmb3IgemVybyBjb3VudFxuICAgICAgICAgICAgICAgIGlmIChyLmhhc093blByb3BlcnR5KCd6ZXJvJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKHJbJ3plcm8nXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBrZXl3b3JkID0gbmV3IEludGwuUGx1cmFsUnVsZXModGhpcy5sb2NhbGUudG9TdHJpbmcoKSkuc2VsZWN0KHZhbGlkYXRlSW50ZWdlcihjb3VudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHIuaGFzT3duUHJvcGVydHkoa2V5d29yZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVN0cmluZyhyW2tleXdvcmRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyLmhhc093blByb3BlcnR5KERFRkFVTFRfS0VZKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKHJbREVGQVVMVF9LRVldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZVN0cmluZyhkZWZhdWx0VGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGEgdGV4dCBmb3IgYSBrZXlcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIHRyYW5zbGF0aW9ucy5zZXRUZXh0KFwidGV4dDFcIjogXCJNYWtlIG15IGRheSFcIik7XG4gICAgICogLy8gcGx1cmFsIHJ1bGVzXG4gICAgICogdHJhbnNsYXRpb25zLnNldFRleHQoXCJ0ZXh0NlwiOiB7XG4gICAgICogICAgIFwiemVyb1wiOiBcIlRoZXJlIGFyZSBubyBmaWxlcyBvbiBEaXNrLlwiLFxuICAgICAqICAgICBcIm9uZVwiOiBcIlRoZXJlIGlzIG9uZSBmaWxlIG9uIERpc2suXCIsXG4gICAgICogICAgIFwib3RoZXJcIjogXCJUaGVyZSBhcmUgZmlsZXMgb24gRGlzay5cIlxuICAgICAqICAgICBcImRlZmF1bHRcIjogXCJUaGVyZSBhcmUgZmlsZXMgb24gRGlzay5cIlxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gdGV4dFxuICAgICAqIEByZXR1cm4ge1RyYW5zbGF0aW9uc31cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZyBvciBvYmplY3RcbiAgICAgKi9cbiAgICBzZXRUZXh0KGtleSwgdGV4dCkge1xuXG4gICAgICAgIGlmIChpc1N0cmluZyh0ZXh0KSB8fCBpc09iamVjdCh0ZXh0KSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldCh2YWxpZGF0ZVN0cmluZyhrZXkpLCB0ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yIG9iamVjdCcpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gdHJhbnNmZXIgb3ZlcmxheXMgZnJvbSBhbiBvYmplY3QuIFRoZSBrZXlzIGFyZSB0cmFuc2ZlcnJlZCBhbmQgdGhlIHZhbHVlcyBhcmUgZW50ZXJlZCBhcyB0ZXh0LlxuICAgICAqXG4gICAgICogVGhlIHZhbHVlcyBjYW4gZWl0aGVyIGJlIGNoYXJhY3RlciBzdHJpbmdzIG9yLCBpbiB0aGUgY2FzZSBvZiB0ZXh0cyB3aXRoIHBsdXJhbCBmb3Jtcywgb2JqZWN0cy4gVGhlIHBsdXJhbCBmb3JtcyBtdXN0IGJlIHN0b3JlZCBhcyB0ZXh0IHZpYSBhIHN0YW5kYXJkIGtleSBcInplcm9cIiwgXCJvbmVcIiwgXCJ0d29cIiwgXCJmZXdcIiwgXCJtYW55XCIgYW5kIFwib3RoZXJcIi5cbiAgICAgKlxuICAgICAqIEFkZGl0aW9uYWxseSwgdGhlIGtleSBkZWZhdWx0IGNhbiBiZSBzcGVjaWZpZWQsIHdoaWNoIHdpbGwgYmUgdXNlZCBpZiBubyBvdGhlciBrZXkgZml0cy5cbiAgICAgKlxuICAgICAqIEluIHNvbWUgbGFuZ3VhZ2VzLCBsaWtlIGZvciBleGFtcGxlIGluIGdlcm1hbiwgdGhlcmUgaXMgbm8gb3duIG1vcmUgbnVtYmVyIGF0IHRoZSB2YWx1ZSAwLiBJbiB0aGVzZSBsYW5ndWFnZXMgdGhlIGZ1bmN0aW9uIGFwcGxpZXMgYWRkaXRpb25hbGx5IHplcm8uXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiB0cmFuc2xhdGlvbnMuYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgKiAgIFwidGV4dDFcIjogXCJNYWtlIG15IGRheSFcIixcbiAgICAgKiAgIFwidGV4dDJcIjogXCJJJ2xsIGJlIGJhY2shXCIsXG4gICAgICogICBcInRleHQ2XCI6IHtcbiAgICAgKiAgICAgXCJ6ZXJvXCI6IFwiVGhlcmUgYXJlIG5vIGZpbGVzIG9uIERpc2suXCIsXG4gICAgICogICAgIFwib25lXCI6IFwiVGhlcmUgaXMgb25lIGZpbGUgb24gRGlzay5cIixcbiAgICAgKiAgICAgXCJvdGhlclwiOiBcIlRoZXJlIGFyZSBmaWxlcyBvbiBEaXNrLlwiXG4gICAgICogICAgIFwiZGVmYXVsdFwiOiBcIlRoZXJlIGFyZSBmaWxlcyBvbiBEaXNrLlwiXG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdHJhbnNsYXRpb25zXG4gICAgICogQHJldHVybiB7VHJhbnNsYXRpb25zfVxuICAgICAqL1xuICAgIGFzc2lnblRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3QodHJhbnNsYXRpb25zKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0cmFuc2xhdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRleHQoaywgdik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIH1cblxufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge3BhcnNlTG9jYWxlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vbG9jYWxlLm1qc1wiO1xuaW1wb3J0IHtUcmFuc2xhdGlvbnN9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzXCI7XG5cbmRlc2NyaWJlKCdUcmFuc2xhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnSW5zdGFuY2UgYW5kIEluaXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IHRyYW5zbGF0aW9uO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgdHJhbnNsYXRpb24gPSBuZXcgVHJhbnNsYXRpb25zKHBhcnNlTG9jYWxlKCdlbi1HQicpKTtcblxuICAgICAgICAgICAgdHJhbnNsYXRpb24uYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICB0ZXN0MTogXCJhYmNcIixcbiAgICAgICAgICAgICAgICB0ZXN0MjogeydvdGhlcic6ICd4eXonfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2NyZWF0ZSBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgVHJhbnNsYXRpb25zKHBhcnNlTG9jYWxlKCdlbi1HQicpKSkuaXMuaW5zdGFuY2VvZihUcmFuc2xhdGlvbnMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnaW5pdCB0cmFuc2xhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QodHJhbnNsYXRpb24uYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICB0ZXN0MTogXCJhYmNcIixcbiAgICAgICAgICAgICAgICB0ZXN0MjogeydvdGhlcic6ICd4eXonfVxuICAgICAgICAgICAgfSkpLmlzLmluc3RhbmNlb2YoVHJhbnNsYXRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRUZXh0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCB0cmFuc2xhdGlvbjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gbmV3IFRyYW5zbGF0aW9ucyhwYXJzZUxvY2FsZSgnZW4tR0InKSk7XG5cbiAgICAgICAgICAgIHRyYW5zbGF0aW9uLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gICAgICAgICAgICAgICAgdGVzdDE6IFwiYWJjXCIsXG4gICAgICAgICAgICAgICAgdGVzdDI6IHsnb3RoZXInOiAneHl6J31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdjcmVhdGUsIHNldCBhbmQgZ2V0IGVuLUdCJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHRyYW5zbGF0aW9uLmdldFRleHQoJ3Rlc3QxJykpLmlzLmVxdWFsKCdhYmMnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2NyZWF0ZSwgc2V0IGFuZCBnZXQgIGVuLUdCIHdpdGggcGx1cmFscnVsZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QodHJhbnNsYXRpb24uZ2V0VGV4dCgndGVzdDInKSkuaXMuZXF1YWwoJ3h5eicpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIlxuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtwYXJzZUxvY2FsZSwgTG9jYWxlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vbG9jYWxlLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdMb2NhbGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIC8vIGxhbmd1YWdlLCByZWdpb24sIHNjcmlwdCwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2VcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM1NjQ2Lmh0bWxcbiAgICAgICAgICAgIFsnemgnLCB1bmRlZmluZWQsICdIYW50JywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3poLUhhbnQnXSwgLy8gemgtSGFudCAoQ2hpbmVzZSB3cml0dGVuIHVzaW5nIHRoZSBUcmFkaXRpb25hbCBDaGluZXNlIHNjcmlwdClcbiAgICAgICAgICAgIFsnZGUnLCAnQ0gnLCB1bmRlZmluZWQsICcxOTAxJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdkZS1DSC0xOTAxJ10sICAvLyBkZS1DSC0xOTAxIChHZXJtYW4gYXMgdXNlZCBpbiBTd2l0emVybGFuZCB1c2luZyB0aGUgMTkwMSB2YXJpYW50IFtvcnRob2dyYXBoeV0pXG4gICAgICAgICAgICBbJ3NsJywgJ0lUJywgdW5kZWZpbmVkLCAnbmVkaXMnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3NsLUlULW5lZGlzJ10sICAvLyBzbC1JVC1uZWRpcyAoU2xvdmVuaWFuIGFzIHVzZWQgaW4gSXRhbHksIE5hZGl6YSBkaWFsZWN0KVxuICAgICAgICAgICAgWydoeScsICdJVCcsICdMYXRuJywgJ2FyZXZlbGEnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ2h5LUxhdG4tSVQtYXJldmVsYSddLCAvLyBoeS1MYXRuLUlULWFyZXZlbGEgKEVhc3Rlcm4gQXJtZW5pYW4gd3JpdHRlbiBpbiBMYXRpbiBzY3JpcHQsIGFzIHVzZWQgaW4gSXRhbHkpXG4gICAgICAgICAgICBbJ3poJywgJ0NOJywgJ0hhbnMnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAnemgtSGFucy1DTiddLCAvLyB6aC1IYW5zLUNOIChDaGluZXNlIHdyaXR0ZW4gdXNpbmcgdGhlIFNpbXBsaWZpZWQgc2NyaXB0IGFzIHVzZWQgaW4gIG1haW5sYW5kIENoaW5hKVxuICAgICAgICAgICAgWydzcicsICdSUycsICdMYXRuJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3NyLUxhdG4tUlMnXSwgLy8gc3ItTGF0bi1SUyAoU2VyYmlhbiB3cml0dGVuIHVzaW5nIHRoZSBMYXRpbiBzY3JpcHQgYXMgdXNlZCBpbiBTZXJiaWEpXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBkID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGYgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBnID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCduZXcgTG9jYWxlKCcgKyBhICsgJywnICsgYiArICcsJyArIGMgKyAnLCcgKyBkICsgJywnICsgZSArICcsJyArIGYgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IExvY2FsZShhLCBiLCBjLCBkLCBlLCBmKS50b1N0cmluZygpKS5pcy5lcXVhbChnKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncGFyc2VMb2NhbGUoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG5cbiAgICAgICAgICAgIC8vIGxhbmd1YWdlLCByZWdpb24sIHNjcmlwdCwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2VcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM1NjQ2Lmh0bWxcbiAgICAgICAgICAgIFsnemgnLCB1bmRlZmluZWQsICdIYW50JywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3poLUhhbnQnXSwgLy8gemgtSGFudCAoQ2hpbmVzZSB3cml0dGVuIHVzaW5nIHRoZSBUcmFkaXRpb25hbCBDaGluZXNlIHNjcmlwdClcbiAgICAgICAgICAgIFsnZGUnLCAnQ0gnLCB1bmRlZmluZWQsICcxOTAxJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdkZS1DSC0xOTAxJ10sICAvLyBkZS1DSC0xOTAxIChHZXJtYW4gYXMgdXNlZCBpbiBTd2l0emVybGFuZCB1c2luZyB0aGUgMTkwMSB2YXJpYW50IFtvcnRob2dyYXBoeV0pXG4gICAgICAgICAgICBbJ3NsJywgJ0lUJywgdW5kZWZpbmVkLCAnbmVkaXMnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3NsLUlULW5lZGlzJ10sICAvLyBzbC1JVC1uZWRpcyAoU2xvdmVuaWFuIGFzIHVzZWQgaW4gSXRhbHksIE5hZGl6YSBkaWFsZWN0KVxuICAgICAgICAgICAgWydoeScsICdJVCcsICdMYXRuJywgJ2FyZXZlbGEnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ2h5LUxhdG4tSVQtYXJldmVsYSddLCAvLyBoeS1MYXRuLUlULWFyZXZlbGEgKEVhc3Rlcm4gQXJtZW5pYW4gd3JpdHRlbiBpbiBMYXRpbiBzY3JpcHQsIGFzIHVzZWQgaW4gSXRhbHkpXG4gICAgICAgICAgICBbJ3poJywgJ0NOJywgJ0hhbnMnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAnemgtSGFucy1DTiddLCAvLyB6aC1IYW5zLUNOIChDaGluZXNlIHdyaXR0ZW4gdXNpbmcgdGhlIFNpbXBsaWZpZWQgc2NyaXB0IGFzIHVzZWQgaW4gIG1haW5sYW5kIENoaW5hKVxuICAgICAgICAgICAgWydzcicsICdSUycsICdMYXRuJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3NyLUxhdG4tUlMnXSwgLy8gc3ItTGF0bi1SUyAoU2VyYmlhbiB3cml0dGVuIHVzaW5nIHRoZSBMYXRpbiBzY3JpcHQgYXMgdXNlZCBpbiBTZXJiaWEpXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBkID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGYgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBnID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCduZXcgTG9jYWxlKCcgKyBhICsgJywnICsgYiArICcsJyArIGMgKyAnLCcgKyBkICsgJywnICsgZSArICcsJyArIGYgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbGUgPSBwYXJzZUxvY2FsZShnKVxuICAgICAgICAgICAgICAgIGV4cGVjdChsb2NhbGUubG9jYWxlU3RyaW5nKS50by5iZS5lcXVhbChnKTtcbiAgICAgICAgICAgICAgICBleHBlY3QobG9jYWxlLmxhbmd1YWdlKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICBleHBlY3QobG9jYWxlLnJlZ2lvbikudG8uYmUuZXF1YWwoYik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxvY2FsZS5zY3JpcHQpLnRvLmJlLmVxdWFsKGMpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChsb2NhbGUudmFyaWFudHMpLnRvLmJlLmVxdWFsKGQpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChsb2NhbGUuZXh0bGFuZykudG8uYmUuZXF1YWwoZSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxvY2FsZS5wcml2YXRlVXNlKS50by5iZS5lcXVhbChmKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgTG9jYWxlKGEsIGIsIGMsIGQsIGUsIGYpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKGcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuLi9kYXRhL2V4dGVuZC5tanNcIjtcblxuaW1wb3J0IHtGb3JtYXR0ZXIgYXMgVGV4dEZvcm1hdHRlcn0gZnJvbSBcIi4uL3RleHQvZm9ybWF0dGVyLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtUcmFuc2xhdGlvbnN9IGZyb20gXCIuL3RyYW5zbGF0aW9ucy5tanNcIjtcblxuZXhwb3J0IHtGb3JtYXR0ZXJ9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGludGVybmFsVHJhbnNsYXRpb25TeW1ib2wgPSBTeW1ib2woJ2ludGVybmFsVHJhbnNsYXRpb24nKVxuXG4vKipcbiAqIFRoZSBGb3JtYXR0ZXIgZXh0ZW5kcyB0aGUgVGV4dC5Gb3JtYXR0ZXIgd2l0aCB0aGUgcG9zc2liaWxpdHkgdG8gcmVwbGFjZSB0aGUga2V5IGJ5IGEgdHJhbnNsYXRpb24uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Rm9ybWF0dGVyfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9pMThuL2Zvcm1hdHRlci5tanMnO1xuICogbmV3IEZvcm1hdHRlcigpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2kxOG4vZm9ybWF0dGVyLm1qcyc7XG4gKiBpbXBvcnQge1RyYW5zbGF0aW9uc30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzJztcbiAqXG4gKiBjb25zdCB0cmFuc2xhdGlvbnMgPSBuZXcgVHJhbnNsYXRpb25zKCdlbicpXG4gKiAgICAgLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gKiAgICAgICAgIHRoZWtleTogXCIke2FuaW1hbH0gaGFzIGVhdGVuIHRoZSAke2Zvb2R9IVwiXG4gKiAgICAgfSk7XG4gKlxuICogbmV3IEZvcm1hdHRlcih7fSwgdHJhbnNsYXRpb25zKS5mb3JtYXQoXCJ0aGVrZXk6YW5pbWFsPWRvZzo6Zm9vZD1jYWtlXCIpXG4gKiAvLyBcdTIxQTYgZG9nIGhhcyBlYXRlbiB0aGUgY2FrZSFcbiAqXG4gKiBAc2luY2UgMS4yNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuSTE4blxuICovXG5jbGFzcyBGb3JtYXR0ZXIgZXh0ZW5kcyBUZXh0Rm9ybWF0dGVyIHtcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIGZvciB0aGUgbWFya2VycyBhcmUgYCR7YCBhbmQgYH1gXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvYmplY3QsIHRyYW5zbGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9iamVjdCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxUcmFuc2xhdGlvblN5bWJvbF0gPSB2YWxpZGF0ZUluc3RhbmNlKHRyYW5zbGF0aW9uLCBUcmFuc2xhdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBtYXJrZXJcbiAgICAgKiBAcHJvcGVydHkge2FycmF5fSBtYXJrZXIub3Blbj1bXCJpMThue1wiLFwiJHtcIl1cbiAgICAgKiBAcHJvcGVydHkge2FycmF5fSBtYXJrZXIuY2xvc2U9W1wiJHtcIl1cbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gcGFyYW1ldGVyXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlci5kZWxpbWl0ZXI9XCI6OlwiXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlci5hc3NpZ25tZW50PVwiPVwiXG4gICAgICogQHByb3BlcnR5IHtvYmplY3R9IGNhbGxiYWNrc1xuICAgICAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGNhbGxiYWNrcy5pMThuPSgpPT57fVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgICAgICBpMThuOiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZbaW50ZXJuYWxUcmFuc2xhdGlvblN5bWJvbF0uZ2V0VGV4dCh2YWxpZGF0ZVN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXJrZXI6IHtcbiAgICAgICAgICAgICAgICBvcGVuOiBbJ2kxOG57JywgJyR7J10sXG4gICAgICAgICAgICAgICAgY2xvc2U6IFsnfSddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRvbyBkZWVwIG5lc3RpbmdcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0ga2V5IG5vdCBmb3VuZFxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgY2xvc2luZyBtYXJrZXIgaXMgbWlzc2luZ1xuICAgICAqL1xuICAgIGZvcm1hdCh0ZXh0KSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHRleHQpXG5cbiAgICAgICAgY29uc3Qgb3Blbk1hcmtlciA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdWydtYXJrZXInXVsnb3BlbiddPy5bMF07XG4gICAgICAgIGNvbnN0IGNsb3NlTWFya2VyID0gdGhpc1tpbnRlcm5hbFN5bWJvbF1bJ21hcmtlciddWydjbG9zZSddPy5bMF07XG5cbiAgICAgICAgaWYgKHRleHQuaW5kZXhPZihvcGVuTWFya2VyKSA9PT0gMCkge1xuICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKG9wZW5NYXJrZXIubGVuZ3RoKTtcblxuICAgICAgICAgICAgaWYgKHRleHQuaW5kZXhPZihjbG9zZU1hcmtlcikgPT09IHRleHQubGVuZ3RoIC0gY2xvc2VNYXJrZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoIC0gY2xvc2VNYXJrZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIGNsb3NpbmcgbWFya2VyIGlzIG1pc3NpbmdcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgcGFydHMgPSB2YWxpZGF0ZVN0cmluZyh0ZXh0KS5zcGxpdCgnOjonKVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbktleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpOyAvLyBrZXkgdmFsdWUgZGVsaW1pdGVyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHBhcnRzLmpvaW4oJzo6JykudHJpbSgpO1xuXG5cbiAgICAgICAgbGV0IGFzc2VtYmxlZFRleHQgPSBvcGVuTWFya2VyICsgJ3N0YXRpYzonICsgdHJhbnNsYXRpb25LZXkgKyAnIHwgY2FsbDppMThuJztcbiAgICAgICAgaWYgKHBhcmFtZXRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhc3NlbWJsZWRUZXh0ICs9ICc6OicgKyBwYXJhbWV0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZW1ibGVkVGV4dCArPSBjbG9zZU1hcmtlcjtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmZvcm1hdChhc3NlbWJsZWRUZXh0KTtcbiAgICB9XG5cblxufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0Zvcm1hdHRlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9pMThuL2Zvcm1hdHRlci5tanNcIjtcbmltcG9ydCB7VHJhbnNsYXRpb25zfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vdHJhbnNsYXRpb25zLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdGb3JtYXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnZXhhbXBsZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biB3aXRoIG1hcmtlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gbmV3IFRyYW5zbGF0aW9ucygnZW4nKVxuICAgICAgICAgICAgICAgIC5hc3NpZ25UcmFuc2xhdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICB0aGVrZXk6IFwiJHthbmltYWx9IGhhcyBlYXRlbiB0aGUgJHtmb29kfSFcIlxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBmID0gbmV3IEZvcm1hdHRlcih7fSwgdHJhbnNsYXRpb25zKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZXhwZWN0KGYuZm9ybWF0KFwiaTE4bnt0aGVrZXk6OmFuaW1hbD1kb2c6OmZvb2Q9Y2FrZX1cIikpLnRvLmJlLmVxdWFsKCdkb2cgaGFzIGVhdGVuIHRoZSBjYWtlIScpO1xuICAgICAgICAgICAgLy8gXHUyMUE2IGRvZyBoYXMgZWF0ZW4gdGhlIGNha2UhICAgICAgICAgICAgICAgIFxuXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaXQoJ3Nob3VsZCBydW4gd2l0aG91dCBtYXJrZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG5ldyBUcmFuc2xhdGlvbnMoJ2VuJylcbiAgICAgICAgICAgICAgICAuYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgdGhla2V5OiBcIiR7YW5pbWFsfSBoYXMgZWF0ZW4gdGhlICR7Zm9vZH0hXCJcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gbWlzc2luZyBtYXJrZXJcbiAgICAgICAgICAgIGV4cGVjdChuZXcgRm9ybWF0dGVyKHt9LCB0cmFuc2xhdGlvbnMpLmZvcm1hdChcInRoZWtleTo6YW5pbWFsPWRvZzo6Zm9vZD1jYWtlXCIpKS50by5iZS5lcXVhbCgnZG9nIGhhcyBlYXRlbiB0aGUgY2FrZSEnKTtcbiAgICAgICAgICAgIC8vIFx1MjFBNiBkb2cgaGFzIGVhdGVuIHRoZSBjYWtlISAgICAgICAgICAgICAgICBcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ2Zvcm1hdCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ2kxOG57dHJhbnNsYXRpb25rZXk6OmE9Mzo6Yj01fScsICd0ZXN0IGlzIDMgYW5kIDUnXSxcblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdmb3JtYXQgJyArIGEgKyAnIHNob3VsZCAnICsgYiwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gbmV3IFRyYW5zbGF0aW9ucygnZGUnKS5hc3NpZ25UcmFuc2xhdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbmtleTogXCJ0ZXN0IGlzICR7YX0gYW5kICR7Yn1cIlxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBleHBlY3QoXG4gICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtYXR0ZXIoe30sIHRyYW5zbGF0aW9ucykuZm9ybWF0KGEpXG4gICAgICAgICAgICAgICAgKS50by5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG5cbn0pXG47IiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gXCIuLi8uLi90ZXh0L2Zvcm1hdHRlci5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsRnVuY3Rpb259IGZyb20gXCIuLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2lzSW5zdGFuY2UsIGlzU3RyaW5nfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlT2JqZWN0LCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uLy4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtwYXJzZUxvY2FsZX0gZnJvbSBcIi4uL2xvY2FsZS5tanNcIjtcbmltcG9ydCB7UHJvdmlkZXJ9IGZyb20gXCIuLi9wcm92aWRlci5tanNcIjtcbmltcG9ydCB7VHJhbnNsYXRpb25zfSBmcm9tIFwiLi4vdHJhbnNsYXRpb25zLm1qc1wiO1xuXG5leHBvcnQge0ZldGNofVxuXG4vKipcbiAqIFRoZSBmZXRjaCBwcm92aWRlciByZXRyaWV2ZXMgYSBKU09OIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCByZXR1cm5zIGEgdHJhbnNsYXRpb24gb2JqZWN0LlxuICogXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtGZXRjaH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvaTE4bi9wcm92aWRlcnMvZmV0Y2gubWpzJztcbiAqIG5ldyBGZXRjaCgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5kYXMgaXN0IGVpbiB0ZXN0PC9jYXB0aW9uPlxuICogXG4gKiBpbXBvcnQge0ZldGNofSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9pMThuL3Byb3ZpZGVycy9mZXRjaC5tanMnO1xuICogXG4gKiAvLyBmZXRjaCBmcm9tIEFQSVxuICogY29uc3QgdHJhbnNsYXRpb24gPSBuZXcgRmV0Y2goJ2h0dHBzOi8vZXhhbXBsZS5jb20vJHtsYW5ndWFnZX0uanNvbicpLmdldFRyYW5zbGF0aW9uKCdlbi1HQicpO1xuICogLy8gXHUyMUE2IGh0dHBzOi8vZXhhbXBsZS5jb20vZW4uanNvblxuICpcbiAqIEBzaW5jZSAxLjEzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5JMThuLlByb3ZpZGVyc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzMDY2fVxuICogQHR1dG9yaWFsIGkxOG4tbG9jYWxlLWFuZC1mb3JtYXR0ZXJcbiAqL1xuIGNsYXNzIEZldGNoIGV4dGVuZHMgUHJvdmlkZXIge1xuXG4gICAgLyoqXG4gICAgICogQXMgb3B0aW9ucyB0aGUga2V5IGBmZXRjaGAgY2FuIGJlIHBhc3NlZC4gVGhpcyBjb25maWcgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgZmV0Y2ggbWV0aG9kIGFzIGluaXQuXG4gICAgICogXG4gICAgICogVGhlIHVybCBtYXkgY29udGFpbiBwbGFjZWhvbGRlcnMgKGxhbmd1YWdlLCBzY3JpcHQsIHJlZ2lvbiwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2UpLCBzbyB5b3UgY2FuIHNwZWNpZnkgb25lIHVybCBmb3IgYWxsIHRyYW5zbGF0aW9ucy5cbiAgICAgKiBcbiAgICAgKiBgYGBcbiAgICAgKiBuZXcgRmV0Y2goJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2Fzc2V0cy8ke2xhbmd1YWdlfS5qc29uJylcbiAgICAgKiBgYGBcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHNlZSB7QGxpbmsgTW9uc3Rlci5JMThuLlByb3ZpZGVycy5GZXRjaCNkZWZhdWx0c31cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvZmV0Y2h9XG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChpc0luc3RhbmNlKHVybCwgVVJMKSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZVN0cmluZyh1cmwpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJvcGVydHkge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB0aGlzLmRlZmF1bHRzLCB2YWxpZGF0ZU9iamVjdChvcHRpb25zKSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0c1xuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLm1ldGhvZD1HRVRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gubW9kZT1jb3JzXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLmNhY2hlPW5vLWNhY2hlXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLmNyZWRlbnRpYWxzPW9taXRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gucmVkaXJlY3Q9Zm9sbG93XG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLnJlZmVycmVyUG9saWN5PW5vLXJlZmVycmVyXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJfVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLCAvLyAqR0VULCBQT1NULCBQVVQsIERFTEVURSwgZXRjLlxuICAgICAgICAgICAgICAgIG1vZGU6ICdjb3JzJywgLy8gbm8tY29ycywgKmNvcnMsIHNhbWUtb3JpZ2luXG4gICAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScsIC8vICpkZWZhdWx0LCBuby1jYWNoZSwgcmVsb2FkLCBmb3JjZS1jYWNoZSwgb25seS1pZi1jYWNoZWRcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ29taXQnLCAvLyBpbmNsdWRlLCAqc2FtZS1vcmlnaW4sIG9taXRcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIG1hbnVhbCwgKmZvbGxvdywgZXJyb3JcbiAgICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJywgLy8gbm8tcmVmZXJyZXIsICpuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSwgb3JpZ2luLCBvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4sIHNhbWUtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luLCB1bnNhZmUtdXJsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMb2NhbGV8c3RyaW5nfSBsb2NhbGVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGdldFRyYW5zbGF0aW9ucyhsb2NhbGUpIHtcblxuICAgICAgICBpZiAoaXNTdHJpbmcobG9jYWxlKSkge1xuICAgICAgICAgICAgbG9jYWxlID0gcGFyc2VMb2NhbGUobG9jYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKGxvY2FsZS5nZXRNYXAoKSlcblxuICAgICAgICByZXR1cm4gZ2V0R2xvYmFsRnVuY3Rpb24oJ2ZldGNoJykoZm9ybWF0dGVyLmZvcm1hdCh0aGlzLnVybCksIHRoaXMuZ2V0T3B0aW9uKCdmZXRjaCcsIHt9KSlcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNsYXRpb25zKGxvY2FsZSkuYXNzaWduVHJhbnNsYXRpb25zKGRhdGEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICB9XG5cblxufVxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtCYXNlV2l0aE9wdGlvbnN9IGZyb20gXCIuLi90eXBlcy9iYXNld2l0aG9wdGlvbnMubWpzXCI7XG5pbXBvcnQge0xvY2FsZX0gZnJvbSBcIi4vbG9jYWxlLm1qc1wiXG5pbXBvcnQge1RyYW5zbGF0aW9uc30gZnJvbSBcIi4vdHJhbnNsYXRpb25zLm1qc1wiXG5cbmV4cG9ydCB7UHJvdmlkZXJ9XG5cbi8qKlxuICogQSBwcm92aWRlciBtYWtlcyBhIHRyYW5zbGF0aW9uIG9iamVjdCBhdmFpbGFibGUuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7UHJvdmlkZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2kxOG4vcHJvdmlkZXIubWpzJztcbiAqIG5ldyBQcm92aWRlcigpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjEzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5JMThuXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzMwNjZ9XG4gKi9cbmNsYXNzIFByb3ZpZGVyIGV4dGVuZHMgQmFzZVdpdGhPcHRpb25zIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TG9jYWxlfHN0cmluZ30gbG9jYWxlXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBnZXRUcmFuc2xhdGlvbnMobG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFRyYW5zbGF0aW9ucyhsb2NhbGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuXG5pbXBvcnQge0ZldGNofSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vcHJvdmlkZXJzL2ZldGNoLm1qc1wiO1xuaW1wb3J0IHtUcmFuc2xhdGlvbnN9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5cblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5sZXQgZmV0Y2hSZWZlcmVuY2U7XG5cblxuZGVzY3JpYmUoJ1RyYW5zbGF0aW9uIFByb3ZpZGVyIEZldGNoJywgZnVuY3Rpb24gKCkge1xuXG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmZXRjaFJlZmVyZW5jZTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgIGZldGNoUmVmZXJlbmNlID0gZ2xvYmFsWydmZXRjaCddO1xuICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBqc29uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZmV0Y2ggbW9jayBkYXRhIGFuZCBjcmVhdGUgdHJhbnNsYXRpb24nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2ZldGNoJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IHAgPSAobmV3IEZldGNoKG5ldyBVUkwoJ2h0dHA6Ly9leGFtcGxlLmNvbScpKSkuZ2V0VHJhbnNsYXRpb25zKCdlbicpO1xuXG4gICAgICAgICAgICBleHBlY3QocCkuaXMuaW5zdGFuY2VvZihQcm9taXNlKTtcblxuICAgICAgICAgICAgcC50aGVuKHIgPT4ge1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIpLmlzLmluc3RhbmNlb2YoVHJhbnNsYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShlKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi9wcm92aWRlci5tanNcIjtcblxuZGVzY3JpYmUoJ1Byb3ZpZGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ0luc3RhbmNlIGFuZCBJbml0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdjcmVhdGUgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKG5ldyBQcm92aWRlcigpKS5nZXRUcmFuc2xhdGlvbnMoJ2VuJykpLmlzLmluc3RhbmNlb2YoUHJvbWlzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7TWVkaWFUeXBlLCBwYXJzZU1lZGlhVHlwZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9tZWRpYXR5cGUubWpzXCI7XG5cbmRlc2NyaWJlKCdEYXRhdXJsJywgZnVuY3Rpb24gKCkge1xuXG4gICAgW1xuICAgICAgICBbXCIqLypcIixcIipcIiwnKiddLFxuICAgICAgICBbXCJ0ZXh0LypcIixcInRleHRcIiwnKiddLFxuICAgICAgICBbXCIqL3Rlc3RcIixcIipcIiwndGVzdCddLFxuICAgICAgICBbXCJpbWFnZS9wbmdcIiwgXCJpbWFnZVwiLCBcInBuZ1wiXSxcbiAgICAgICAgW1wiYXVkaW8vbXAzXCIsIFwiYXVkaW9cIiwgXCJtcDNcIl0sXG4gICAgICAgIFtcInZpZGVvL21wZWdcIiwgXCJ2aWRlb1wiLCBcIm1wZWdcIl0sXG4gICAgICAgIFtcInRleHQvcGxhaW5cIiwgXCJ0ZXh0XCIsIFwicGxhaW5cIl0sXG4gICAgICAgIFtcInRleHQvaHRtbFwiLCBcInRleHRcIiwgXCJodG1sXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWw7Y2hhcnNldD1VUy1BU0NJSVwiLCBcInRleHRcIiwgXCJodG1sXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWw7Y2hhcnNldD1cXFwiVVMtQVNDSUlcXFwiXCIsIFwidGV4dFwiLCBcImh0bWxcIl0sXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgaXQoJ3BhcnNlTWVkaWFUeXBlKCcgKyBhICsgJyknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGQgPSBwYXJzZU1lZGlhVHlwZShhKTtcblxuICAgICAgICAgICAgZXhwZWN0KGQpLmlzLmluc3RhbmNlb2YoTWVkaWFUeXBlKTtcbiAgICAgICAgICAgIGV4cGVjdChkLnRvU3RyaW5nKCkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgZXhwZWN0KGQudHlwZSkudG8uYmUuZXF1YWwoYik7XG4gICAgICAgICAgICBleHBlY3QoZC5zdWJ0eXBlKS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgIGV4cGVjdChkLnBhcmFtZXRlcikuaXMuaW5zdGFuY2VvZihNYXApXG4gICAgICAgIH0pXG5cbiAgICB9KTtcblxuICAgIFtcbiAgICAgICAgW1widmlkZW8vXCJdLFxuICAgICAgICBbXCJ0ZXh0XCJdLFxuICAgICAgICBbXCIvbXAzXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWw7Y2hhcnNldFVTLUFTQ0lJXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWw7Y2hhcnNldFxcXCJVUy1BU0NJSVxcXCJcIl0sXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgIGl0KCcnICsgYSArICcgc2hvdWxkIHRocm93IGV4Y2VwdGlvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgZXhwZWN0KCgpPT57cGFyc2VNZWRpYVR5cGUoYSl9KS50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgXG4gICAgICAgIH0pXG5cbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtTdGFja30gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9zdGFjay5tanNcIjtcbmltcG9ydCB7XG4gICAgdHlwZU9mXG59IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdHlwZW9mLm1qc1wiXG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCd0eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLnR5cGVPZigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFt0cnVlLCAnYm9vbGVhbiddLFxuICAgICAgICAgICAgW251bGwsICdudWxsJ10sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCAndW5kZWZpbmVkJ10sXG4gICAgICAgICAgICBbUHJvbWlzZS5yZXNvbHZlKCksICdwcm9taXNlJ10sXG4gICAgICAgICAgICBbbmV3IFdlYWtNYXAoKSwgJ3dlYWttYXAnXSxcbiAgICAgICAgICAgIFtuZXcgTWFwKCksICdtYXAnXSxcbiAgICAgICAgICAgIFtOYU4sICdudW1iZXInXSxcbiAgICAgICAgICAgIFtmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgfSwgJ2dlbmVyYXRvcmZ1bmN0aW9uJ10sXG4gICAgICAgICAgICBbNSwgJ251bWJlciddLFxuICAgICAgICAgICAgW2Z1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIH0sICdmdW5jdGlvbiddLFxuICAgICAgICAgICAgWy9hLywgJ3JlZ2V4cCddLFxuICAgICAgICAgICAgW25ldyBEYXRlKCksICdkYXRlJ10sXG4gICAgICAgICAgICBbe30sICdvYmplY3QnXSxcbiAgICAgICAgICAgIFtbXSwgJ2FycmF5J10sXG4gICAgICAgICAgICBbJycsICdzdHJpbmcnXSxcbiAgICAgICAgICAgIFtuZXcgRXJyb3IsICdlcnJvciddLFxuICAgICAgICAgICAgW25ldyBTdGFjaywgJ3N0YWNrJ11cblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuICcgKyBiICsgJyB3aGVuIHRoZSB2YWx1ZSAnICsgdHlwZU9mKGEpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVPZihhKSkudG8uYmUuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTtcblxuIiwgImltcG9ydCB7T2JzZXJ2ZXJMaXN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL29ic2VydmVybGlzdC5tanNcIjtcbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnT2JzZXJ2ZXJMaXN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5hdHRhY2goKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIE9ic2VydmVyTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvYnNlcnZlckxpc3QgPSBuZXcgT2JzZXJ2ZXJMaXN0KClcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBvYnNlcnZlckxpc3QuYXR0YWNoKG5ldyBPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmJlLmluc3RhbmNlT2YoT2JzZXJ2ZXJMaXN0KVxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmRldGFjaCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgT2JzZXJ2ZXJMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG9ic2VydmVyTGlzdCA9IG5ldyBPYnNlcnZlckxpc3QoKVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG9ic2VydmVyTGlzdC5kZXRhY2gobmV3IE9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uYmUuaW5zdGFuY2VPZihPYnNlcnZlckxpc3QpXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcubm90aWZ5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBcIlllcyFcIjtcbiAgICAgICAgbGV0IG87XG4gICAgICAgIGxldCBvYnNlcnZlckxpc3Q7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBvID0gbmV3IE9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0VmFsdWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBvYnNlcnZlckxpc3QgPSBuZXcgT2JzZXJ2ZXJMaXN0KClcbiAgICAgICAgICAgIG9ic2VydmVyTGlzdC5hdHRhY2gobylcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGluc3RhbmNlb2YgUHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3Qubm90aWZ5KHt9KSkudG8uYmUuaW5zdGFuY2VPZihQcm9taXNlKVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiAnICsgcmVzdWx0VmFsdWUsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7fVxuXG4gICAgICAgICAgICBvYnNlcnZlckxpc3Qubm90aWZ5KG9iaikudGhlbihyID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QocikudG8uYmUuYW4oJ2FycmF5JykudGhhdC5pbmNsdWRlcyhyZXN1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuY29udGFpbnMoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbzEgPSBuZXcgT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IG8yID0gbmV3IE9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBub3QgY29udGFpbiBvMSBhbmQgbzInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXJMaXN0ID0gbmV3IE9ic2VydmVyTGlzdCgpXG5cbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzEpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzIpKS50by5iZS5mYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjb250YWluIG8yIGFuZCBub3QgbzEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXJMaXN0ID0gbmV3IE9ic2VydmVyTGlzdCgpXG4gICAgICAgICAgICBvYnNlcnZlckxpc3QuYXR0YWNoKG8yKVxuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMikpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgY29udGFpbiBvMSBhbmQgbm90IG8yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG9ic2VydmVyTGlzdCA9IG5ldyBPYnNlcnZlckxpc3QoKVxuICAgICAgICAgICAgb2JzZXJ2ZXJMaXN0LmF0dGFjaChvMSlcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzEpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMikpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGl0KCdzaG91bGQgY29udGFpbiBvMiBhbmQgbzEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXJMaXN0ID0gbmV3IE9ic2VydmVyTGlzdCgpXG4gICAgICAgICAgICBvYnNlcnZlckxpc3QuYXR0YWNoKG8yKS5hdHRhY2gobzEpXG4gICAgICAgICAgICBleHBlY3Qob2JzZXJ2ZXJMaXN0LmNvbnRhaW5zKG8xKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzIpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnUmFuZG9tSUQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBjbGFzcyBSYW5kb21JRCB7fVxuICAgIFxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIGlmKCFnbG9iYWxUaGlzWydjcnlwdG8nXSkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpc1snY3J5cHRvJ10gPSBuZXcgbS5DcnlwdG8oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcmFuZG9taWQubWpzXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICBSYW5kb21JRCA9IG0uUmFuZG9tSUQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkpXG5cbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7ICAgIFxuICAgIFxuICAgIGRlc2NyaWJlKCcudG9TdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGlkID0gbmV3IFJhbmRvbUlEKClcbiAgICAgICAgbGV0IHJlc3VsdCA9IGlkLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS5pcy5hKCdzdHJpbmcnKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdVVUlEJywgZnVuY3Rpb24gKCkge1xuXG4gICAgY2xhc3MgVVVJRCB7fVxuICAgIFxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIFxuICAgICAgICBpZighZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3V1aWQubWpzXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICBVVUlEID0gbS5VVUlEO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pKVxuICAgICAgICBcbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7ICAgIFxuICAgIFxuICAgIGRlc2NyaWJlKCcudG9TdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdXVpZCA9IG5ldyBVVUlEKClcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB1dWlkLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLmlzLmEoJ3N0cmluZycpXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0Lmxlbmd0aCkuaXMuZXF1YWwoMzYpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd0ZXN0IGZvcm1hdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgdXVpZCA9IG5ldyBVVUlEKClcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB1dWlkLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4RXhwID0gL15bQS1GXFxkXXs4fS1bQS1GXFxkXXs0fS00W0EtRlxcZF17M30tWzg5QUJdW0EtRlxcZF17M30tW0EtRlxcZF17MTJ9JC9pO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwMDA7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVVJRCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHJlZ2V4RXhwLnRlc3QodSk7XG5cbiAgICAgICAgICAgICAgICBpZiAociAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lKCdubyB1dWlkICcgKyB1ICsgJyA9PiAnICsgcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5cblxuZGVzY3JpYmUoJ09ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG5cbiAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIoY2FsbGJhY2spXG5cbiAgICBkZXNjcmliZSgnLmFkZFRhZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnXSxcbiAgICAgICAgICAgIFsndGVzdDInXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdhZGRUYWcoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgT2JzZXJ2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyLmFkZFRhZyhhKSkuaXMuaW5zdGFuY2VPZihPYnNlcnZlcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5yZW1vdmVUYWcoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJ10sXG4gICAgICAgICAgICBbJ3Rlc3QyJ10sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgncmVtb3ZlVGFnKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIE9ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlci5yZW1vdmVUYWcoYSkpLmlzLmluc3RhbmNlT2YoT2JzZXJ2ZXIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaGFzVGFnKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIHRydWVdLFxuICAgICAgICAgICAgWyd0ZXN0MicsIHRydWVdLFxuICAgICAgICAgICAgWyd0ZXN0MycsIGZhbHNlXSxcbiAgICAgICAgICAgIFsndGVzdDQnLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGNhbGxiYWNrKVxuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ29ic2VydmVyLmhhc3RUYWcoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoYiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIuYWRkVGFnKGEpXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuaGFzVGFnKGEpKS5pcy5iZS50cnVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRlbXBPYnNlcnZlci5oYXNUYWcoYSkpLmlzLmJlLmZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnVwZGF0ZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBvYmogPSB7fVxuICAgICAgICBpdCgnb2JzZXJ2ZXIudXBkYXRlKCcgKyBvYmogKyAnKSBpcyAnICsgMSArIDMgKyA2LCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiICsgY1xuICAgICAgICAgICAgfSwgMSwgMywgNilcblxuXG4gICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIudXBkYXRlKG9iaikudGhlbihhID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QoYSkuaXMuZXF1YWwoMSArIDMgKyA2KVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3J1biBmdW5jdGlvbiAudXBkYXRlKCkgc2V2ZXJhbCB0aW1lcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgb2JqID0ge31cbiAgICAgICAgaXQoJ29ic2VydmVyLnVwZGF0ZSgnICsgb2JqICsgJykgaXMgJyArIDEgKyAzICsgNiwgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgbGV0IHRlbXBPYnNlcnZlciA9IG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKS50aGVuKF8gPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZ2V0VGFncygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtbJ3Rlc3QxJywgJ3Rlc3QyJywgJ3Rlc3QzJywgJ3Rlc3Q0J10sIDRdLFxuICAgICAgICAgICAgW1sndGVzdDEnLCAndGVzdDEnLCAndGVzdDMnLCAndGVzdDQnXSwgM10sIC8vIGRvdWJsZSB0ZXN0MSAoc2V0IGlzIHVuaXF1ZXVlKVxuICAgICAgICAgICAgW1sndGVzdDEnLCAndGVzdDEnLCAndGVzdDEnLCAndGVzdDQnXSwgMl0sIC8vIG11bHRpcGxlIHRlc3QxIChzZXQgaXMgdW5pcXVldWUpXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGNhbGxiYWNrKVxuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGEubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIuYWRkVGFnKGFbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdCgnb2JzZXJ2ZXIuZ2V0VGFncygnICsgYSArICcpIGlzIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuZ2V0VGFncygpKS50by5iZS5hbignYXJyYXknKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdvYnNlcnZlci5nZXRUYWdzKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiArIFwiIHRhZ3NcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuZ2V0VGFncygpLmxlbmd0aCkuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtUb2tlbkxpc3R9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdG9rZW5saXN0Lm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdUb2tlbkxpc3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLnRvU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCB0b2tlbkxpc3QgPSBuZXcgVG9rZW5MaXN0KClcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRva2VuTGlzdC50b1N0cmluZygpO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uYmUuYSgnc3RyaW5nJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzZXQgYW5kIHJlbW92ZSByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnaW5pdCB3aXRoIHN0cmluZyBpdGVyYWJsZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgnICsgdHlwZW9mIGEgKyAnKSB0aHJvdyBUeXBlRXJyb3IgJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgdG9rZW5zID0gW1wiYWJjXCIsIFwiZGVmXCIsIFwiZ2hpXCJdXG4gICAgICAgICAgICBsZXQgbGlzdCA9IG5ldyBUb2tlbkxpc3QodG9rZW5zKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwiYWJjIGRlZiBnaGlcIik7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaW5pdCB3aXRoIGl0ZXJhYmxlIHdpdGhvdXQgc3RyaW5nIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgnICsgdHlwZW9mIGEgKyAnKSB0aHJvdyBUeXBlRXJyb3IgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHRva2VucyA9IFtcImFiY1wiLCA0LCBcImdoaVwiXVxuICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBUb2tlbkxpc3QodG9rZW5zKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdpbml0IHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICAvLyBjdXJyZW50LCBleHBlY3RlZCwgdHlwZXJyb3JcbiAgICAgICAgICAgIFsndGVzdDEnLCBcInRlc3QxXCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFsndGVzdDEgdGVzdDInLCBcInRlc3QxIHRlc3QyXCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIFwiXCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgdW5kZWZpbmVkLCB0cnVlXSwgLy8gTmFOXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCB0cnVlXSxcbiAgICAgICAgICAgIFsyLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW2ZhbHNlLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbNC41LCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW3t9LCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW1tcIjFcIiwgXCIyXCIsIFwiM1wiXSwgJzEgMiAzJywgZmFsc2VdLCAvLyBpdGVyYWJsZSBzdHJpbmdzXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2UsIHRydWVdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpZiAoYyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KCcgKyB0eXBlb2YgYSArICcpIHRocm93IFR5cGVFcnJvciAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgVG9rZW5MaXN0KGEpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgVG9rZW5MaXN0KGEpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2l0ZXJhdG9yIHByb3RvY29sJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBsaXN0O1xuICAgICAgICBpdCgnLmFkZCgnICsgXCJzZWNvbmRcIiArICcpIHNob3VsZCByZXR1cm4gVG9rZW5MaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmdldEl0ZXJhdG9yKCkpLnRvLmJlLmFuKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJy5hZGQoJyArIFwic2Vjb25kXCIgKyAnKSBzaG91bGQgcmV0dXJuIFRva2VuTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KFsuLi5saXN0XSkudG8uYmUuYW4oJ2FycmF5Jyk7XG4gICAgICAgICAgICBleHBlY3QoWy4uLmxpc3RdKS50by5iZS5hbignYXJyYXknKS50by5pbmNsdWRlKCdzdGFydCcpLnRvLmluY2x1ZGUoJ2VuZCcpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmVudHJpZXMoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbGlzdDtcbiAgICAgICAgaXQoJy5lbnRyaWVzKCkgc2hvdWxkIHJldHVybiBBcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5lbnRyaWVzKCkpLnRvLmJlLmFuKCdhcnJheScpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnLmVudHJpZXMoKSBzaG91bGQgcmV0dXJuIEFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBlbmRcIikuZW50cmllcygpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QpLnRvLmJlLmFuKCdhcnJheScpLnRvLmluY2x1ZGUoJ3N0YXJ0JykudG8uaW5jbHVkZSgnZW5kJyk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZm9yRWFjaCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBsaXN0O1xuICAgICAgICBpdCgnLmZvckVhY2goKSBzaG91bGQgaXRlcmF0ZSBvdmVyIHRva2VubGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwiYWFhIGJiYiBjY2MgZGRkIGVlZSBmZmZcIik7XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBcIlwiXG4gICAgICAgICAgICBsaXN0LmZvckVhY2goKGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIhXCIgKyBhICsgXCIhXCI7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGEpLnRvLmJlLmFuKCdzdHJpbmcnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkuaXMuZXF1YWwoXCIhYWFhISFiYmIhIWNjYyEhZGRkISFlZWUhIWZmZiFcIilcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJy5lbnRyaWVzKCkgc2hvdWxkIHJldHVybiBBcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgZW5kXCIpLmVudHJpZXMoKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0KS50by5iZS5hbignYXJyYXknKS50by5pbmNsdWRlKCdzdGFydCcpLnRvLmluY2x1ZGUoJ2VuZCcpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY29udGFpbnMgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbGlzdFxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChzdGFydCwgbWlkZGxlIGVuZCkgc2hvdWxkIGNvbnRhaW4gbWlkZGxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBtaWRkbGUgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMoJ3N0YXJ0JykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucygnbWlkZGxlJykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucygnZW5kJykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucyhbJ2VuZCcsICdzdGFydCcsICdtaWRkbGUnXSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KHN0YXJ0LCBtaWRkbGUgZW5kKSBzaG91bGQgbm90IGNvbnRhaW4geHl6JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBtaWRkbGUgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMoJ3h5eicpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmNvbnRhaW5zKFsnZW5kJywgJ3N0YXJ0JywgJ21pZGRsZScsICd4eXonXSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChzdGFydCwgbWlkZGxlIGVuZCkgc2hvdWxkIG5vdCBjb250YWluIHVuZGVmaW5lZCBudWxsIE5hTicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgbWlkZGxlIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmNvbnRhaW5zKHVuZGVmaW5lZCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMocGFyc2VJbnQoXCJhXCIpKSkudG8uYmUuZmFsc2U7IC8vIE5hTlxuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMobnVsbCkpLnRvLmJlLmZhbHNlOyAvLyBOYU5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCd0b2dnbGUgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbGlzdFxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChzdGFydCBtaWRkbGUgZW5kKS50b2dnbGUobmV3LXZhbHVlKSBzaG91bGQgY29udGFpbiBuZXctdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IG1pZGRsZSBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b2dnbGUoJ25ldy12YWx1ZScpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgbWlkZGxlIGVuZCBuZXctdmFsdWVcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KHN0YXJ0IG1pZGRsZSBlbmQpLnRvZ2dsZShtaWRkbGUpIHNob3VsZCBub3QgY29udGFpbiBtaWRkbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IG1pZGRsZSBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b2dnbGUoJ21pZGRsZScpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgZW5kXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgpLnRvZ2dsZSgpIHNob3VsZCAuLi4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRva2VuTGlzdChcImFiYyBkZWYgZ2hpXCIpLnRvZ2dsZShcImRlZiB4eXpcIikudG9TdHJpbmcoKSkudG8uZXF1YWwoXCJhYmMgZ2hpIHh5elwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoKS50b2dnbGUoKSBzaG91bGQgLi4uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBUb2tlbkxpc3QoXCJhYmMgZGVmIGdoaVwiKS50b2dnbGUoW1wiYWJjXCIsIFwieHl6XCJdKS50b1N0cmluZygpKS50by5lcXVhbChcImRlZiBnaGkgeHl6XCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgpLnRvZ2dsZSgpIHNob3VsZCAuLi4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRva2VuTGlzdChcImFiYyBkZWYgZ2hpXCIpLnRvZ2dsZSh1bmRlZmluZWQpLnRvU3RyaW5nKCkpLnRvLmVxdWFsKFwiYWJjIGRlZiBnaGlcIik7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdtYW5pcHVsYXRlIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbGlzdFxuXG4gICAgICAgIGl0KCdyZXN1bHQgVG9rZW5MaXN0KFwiJyArIFwic3RhcnRcIiArICdcIikgc2hvdWxkIGJlIFwiJyArIFwic3RhcnRcIiArICdcIicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0XCIpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcuYWRkKCcgKyBcInNlY29uZFwiICsgJykgc2hvdWxkIHJldHVybiBUb2tlbkxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuYWRkKFwic2Vjb25kXCIpKS50by5iZS5hbi5pbnN0YW5jZW9mKFRva2VuTGlzdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcuYWRkKCcgKyBcInNlY29uZFwiICsgJykudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgc2Vjb25kXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmFkZChcInNlY29uZFwiKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IHNlY29uZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJy5hZGQoJyArIFwic2Vjb25kIHRoaXJkXCIgKyAnKS50b1N0cmluZygpIHNob3VsZCByZXR1cm4gXCJzdGFydCBzZWNvbmQgdGhpcmRcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuYWRkKFwic2Vjb25kIHRoaXJkXCIpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgc2Vjb25kIHRoaXJkXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnLmFkZCgnICsgXCJbc2Vjb25kLHRoaXJkXVwiICsgJykudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgc2Vjb25kIHRoaXJkXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmFkZChbXCJzZWNvbmRcIiwgXCJ0aGlyZFwiXSkudG9TdHJpbmcoKSkuaXMuZXF1YWwoXCJzdGFydCBzZWNvbmQgdGhpcmRcIik7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgaXQoJy5jbGVhcigpLnRvU3RyaW5nKCkgc2hvdWxkIFwiXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmFkZChbXCJzZWNvbmRcIiwgXCJ0aGlyZFwiXSkuY2xlYXIoKS50b1N0cmluZygpKS5pcy5lcXVhbChcIlwiKTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIikucmVtb3ZlKCcgKyBcInNlY29uZFwiICsgJykgc2hvdWxkIHJldHVybiBUb2tlbkxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5yZW1vdmUoXCJzZWNvbmRcIikpLnRvLmJlLmFuLmluc3RhbmNlb2YoVG9rZW5MaXN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlbW92ZSgnICsgXCJzZWNvbmRcIiArICcpLnRvU3RyaW5nKCkgc2hvdWxkIHJldHVybiBcInN0YXJ0IHRoaXJkIGVuZFwiICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnJlbW92ZShcInNlY29uZFwiKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IHRoaXJkIGVuZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlbW92ZSgnICsgXCJzZWNvbmQgdGhpcmRcIiArICcpLnRvU3RyaW5nKCkgc2hvdWxkIHJldHVybiBcInN0YXJ0IGVuZFwiICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnJlbW92ZShcInNlY29uZCB0aGlyZFwiKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IGVuZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlbW92ZSgnICsgXCJbc2Vjb25kLHRoaXJkXVwiICsgJykudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgZW5kXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QucmVtb3ZlKFtcInNlY29uZFwiLCBcInRoaXJkXCJdKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IGVuZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlcGxhY2Uoc2Vjb25kLCB4eXopLnRvU3RyaW5nKCkgc2hvdWxkIHJldHVybiBcInN0YXJ0IHh5eiB0aGlyZCBlbmRcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5yZXBsYWNlKFwic2Vjb25kXCIsIFwieHl6XCIpKS50by5iZS5pbnN0YW5jZU9mKFRva2VuTGlzdCk7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IHh5eiB0aGlyZCBlbmRcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKS5yZXBsYWNlKGVuZCwgeHl6KS50b1N0cmluZygpIHNob3VsZCByZXR1cm4gXCJzdGFydCBzZWNvbmQgdGhpcmQgeHl6XCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QucmVwbGFjZShcImVuZFwiLCBcInh5elwiKSkudG8uYmUuaW5zdGFuY2VPZihUb2tlbkxpc3QpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QudG9TdHJpbmcoKSkuaXMuZXF1YWwoXCJzdGFydCBzZWNvbmQgdGhpcmQgeHl6XCIpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtRdWV1ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9xdWV1ZS5tanNcIjtcblxuZGVzY3JpYmUoJ1F1ZXVlJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBxdWV1ZTtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgcXVldWUgPSBuZXcgUXVldWU7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdpc0VtcHR5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2ZpcnN0IGl0IHNob3VsZCBlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdhZGQgc2VxdWVuY2UgcGVlayBhbmQgcG9sbCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgncmVzdWx0IGEsYSxhLGInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuYWRkKCdhJykpLnRvLmJlLmluc3RhbmNlT2YoUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuYWRkKCdiJykpLnRvLmJlLmluc3RhbmNlT2YoUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCgnYycpKS50by5iZS5pbnN0YW5jZU9mKFF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wZWVrKCkpLnRvLmJlLmVxdWFsKCdhJyk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucGVlaygpKS50by5iZS5lcXVhbCgnYScpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBvbGwoKSkudG8uYmUuZXF1YWwoJ2EnKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wZWVrKCkpLnRvLmJlLmVxdWFsKCdiJyk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuICAgIFxuICAgIGRlc2NyaWJlKCdhZGQgYW5kIGNsZWFyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCgnYScpKS50by5iZS5pbnN0YW5jZU9mKFF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmNsZWFyKCkpLnRvLmJlLmluc3RhbmNlT2YoUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxufSkiLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7U3RhY2t9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvc3RhY2subWpzXCI7XG5cblxuZGVzY3JpYmUoJ1N0YWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBzdGFjaztcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdpc0VtcHR5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2ZpcnN0IGl0IHNob3VsZCBlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdhZGQgc2VxdWVuY2UgcGVlayBhbmQgcHVsbCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgncmVzdWx0IGEsYSxhLGInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucHVzaCgnYScpKS50by5iZS5pbnN0YW5jZU9mKFN0YWNrKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLnB1c2goJ2InKSkudG8uYmUuaW5zdGFuY2VPZihTdGFjayk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucHVzaCgnYycpKS50by5iZS5pbnN0YW5jZU9mKFN0YWNrKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5wZWVrKCkpLnRvLmJlLmVxdWFsKCdjJyk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucGVlaygpKS50by5iZS5lcXVhbCgnYycpO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLnBvcCgpKS50by5iZS5lcXVhbCgnYycpO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLnBlZWsoKSkudG8uYmUuZXF1YWwoJ2InKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnYWRkIGFuZCBjbGVhcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5wdXNoKCdhJykpLnRvLmJlLmluc3RhbmNlT2YoU3RhY2spO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLmlzRW1wdHkoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2suY2xlYXIoKSkudG8uYmUuaW5zdGFuY2VPZihTdGFjayk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2suaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG59KSIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuaW1wb3J0IHt2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7dG9CaW5hcnksIGZyb21CaW5hcnl9XG5cbi8qKlxuICogWW91IGNhbiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLlR5cGVzLnRvQmluYXJ5KClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3RvQmluYXJ5fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9iaW5hcnkubWpzJztcbiAqIHRvQmluYXJ5KClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGJpbmFyeVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAc2luY2UgMS4xOC4wXG4gKi9cbmZ1bmN0aW9uIHRvQmluYXJ5KHN0cmluZykge1xuICAgIGNvbnN0IGNvZGVVbml0cyA9IG5ldyBVaW50MTZBcnJheSh2YWxpZGF0ZVN0cmluZyhzdHJpbmcpLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2RlVW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29kZVVuaXRzW2ldID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhckNvZGVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZVVuaXRzLmJ1ZmZlcik7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyQ29kZXMuYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2Rlc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIGZ1bmN0aW9uIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYE1vbnN0ZXIuVHlwZXMuZnJvbUJpbmFyeSgpYC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtmcm9tQmluYXJ5fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS90eXBlcy9iaW5hcnkubWpzJztcbiAqIGZyb21CaW5hcnkoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYmluYXJ5XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzaW5jZSAxLjE4LjBcbiAqL1xuZnVuY3Rpb24gZnJvbUJpbmFyeShiaW5hcnkpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHZhbGlkYXRlU3RyaW5nKGJpbmFyeSkubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJ5dGVzW2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIGNvbnN0IGNoYXJDb2RlcyA9IG5ldyBVaW50MTZBcnJheShieXRlcy5idWZmZXIpO1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJDb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtmcm9tQmluYXJ5LCB0b0JpbmFyeX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9iaW5hcnkubWpzXCI7XG5cbmRlc2NyaWJlKCdCaW5hcnknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBbXG4gICAgICAgIFsnYScsICdhXFx1MDAwMCddLFxuICAgICAgICBbJ1x1MjYzOScsICc5JiddLFxuICAgICAgICBbJ0lcdTAwRjF0XHUwMEVCcm5cdTAwRTJ0aVx1MDBGNG5cdTAwRTBsaXpcdTAwRTZ0aVx1MDBGOG4nLCAnSVxcdTAwMDBcdTAwRjFcXHUwMDAwdFxcdTAwMDBcdTAwRUJcXHUwMDAwclxcdTAwMDBuXFx1MDAwMFx1MDBFMlxcdTAwMDB0XFx1MDAwMGlcXHUwMDAwXHUwMEY0XFx1MDAwMG5cXHUwMDAwXHUwMEUwXFx1MDAwMGxcXHUwMDAwaVxcdTAwMDB6XFx1MDAwMFx1MDBFNlxcdTAwMDB0XFx1MDAwMGlcXHUwMDAwXHUwMEY4XFx1MDAwMG5cXHUwMDAwJ11cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgaXQoJ2Zyb21CaW5hcnkodG9CaW5hcnkoJyArIGEgKyAnKSkgc2hvdWxkIHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgciA9IHRvQmluYXJ5KGEpO1xuICAgICAgICAgICAgZXhwZWN0KHIpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICAgICAgZXhwZWN0KGZyb21CaW5hcnkocikpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICB9KVxuXG4gICAgfSk7XG5cblxufSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtCYXNlV2l0aE9wdGlvbnN9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdCYXNlV2l0aE9wdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IEJhc2VXaXRoT3B0aW9ucycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnaXMgaW5zdGFuY2Ugb2YgQmFzZVdpdGhPcHRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBCYXNlV2l0aE9wdGlvbnMpLnRvLmJlLmluc3RhbmNlT2YoQmFzZVdpdGhPcHRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2lzIGluc3RhbmNlIG9mIE9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQmFzZVdpdGhPcHRpb25zKS50by5iZS5pbnN0YW5jZU9mKE9iamVjdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdnZXQgb3B0aW9uIGlzIHRydWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2VXaXRoT3B0aW9ucyh7YTogdHJ1ZX0pLmdldE9wdGlvbignYScpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbn0pIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge2VzY2FwZVN0cmluZ31cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHByZWZpeGVzIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCBtYXkgYXBwZWFyIGluIGEgcmVnZXggd2l0aCBhIHNsYXNoLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2VzY2FwZVN0cmluZ30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGVzY2FwZVN0cmluZygpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHNpbmNlIDEuMjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVTdHJpbmcodmFsdWUpXG4gICAgICAgIC5yZXBsYWNlKC9bfFxcXFx7fSgpW1xcXV4kKyo/Ll0vZywgJ1xcXFwkJicpXG4gICAgICAgIC5yZXBsYWNlKC8tL2csICdcXFxceDJkJyk7XG59XG4iLCAiXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtlc2NhcGVTdHJpbmd9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcmVnZXgubWpzXCJcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuXG5kZXNjcmliZSgnZXNjYXBlU3RyaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgbGV0IHByb21pc2VzID0gW11cbiAgICAgICAgcHJvbWlzZXMucHVzaChpbml0SlNET00oKSk7XG4gICAgICAgIGlmKCFnbG9iYWxUaGlzWydjcnlwdG8nXSkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpc1snY3J5cHRvJ10gPSBuZXcgbS5DcnlwdG8oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICB9XG5cblxuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbiAgICBcbiAgICBbXG4gICAgICAgIFsndGVzdDEnLCAndGVzdDEnXSxcbiAgICAgICAgWyckeycsICdcXFxcJFxcXFx7J10sXG4gICAgICAgIFsnaTE4bnsnLCAnaTE4blxcXFx7J10sXG4gICAgICAgIFsnLy8nLCAnLy8nXSxcbiAgICAgICAgWydcXFxcJywgJ1xcXFxcXFxcJ10sXG4gICAgICAgXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICBpdCgnZXNjYXBlU3RyaW5nKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGVzY2FwZVN0cmluZyhhKSkuaXMuZXF1YWwoYilcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge2lzT2JqZWN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9vYnNlcnZlci5tanNcIjtcblxuaW1wb3J0IHtQcm94eU9ic2VydmVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3Byb3h5b2JzZXJ2ZXIubWpzXCI7XG5cbmRlc2NyaWJlKCdQcm94eU9ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBQcm94eU9ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG8gPSBuZXcgUHJveHlPYnNlcnZlcih7fSk7XG4gICAgICAgICAgICBleHRlbmQoby5nZXRTdWJqZWN0KCksIHthOiA0fSk7XG4gICAgICAgICAgICBleHBlY3Qoby5nZXRSZWFsU3ViamVjdCgpKS5pcy5lcWwoe2E6IDR9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2V0U3ViamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBydW4gb2JzZXJ2ZXInLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IG8gPSBuZXcgUHJveHlPYnNlcnZlcih7YTogMX0pO1xuICAgICAgICAgICAgZXhwZWN0KG8uZ2V0UmVhbFN1YmplY3QoKSkuaXMuZXFsKHthOiAxfSk7XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICBvLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHRoaXMpICYmIHRoaXMgaW5zdGFuY2VvZiBQcm94eU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBvbmUgY2hhbmdlIGFzIG5vdGlmeSBydW5zIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZG9uZShcImNhbGxlZCBmb3IgZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihcInRoaXMgaXMgbm90IFByb3h5T2JzZXJ2ZXJcIikpXG4gICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgby5nZXRTdWJqZWN0KCkuYyA9IDQ7XG4gICAgICAgICAgICBleHBlY3Qoby5nZXRSZWFsU3ViamVjdCgpKS5pcy5lcWwoe2E6IDEsIGM6IDR9KTtcblxuICAgICAgICAgICAgby5zZXRTdWJqZWN0KHtiOiAyfSk7XG4gICAgICAgICAgICBleHBlY3Qoby5nZXRSZWFsU3ViamVjdCgpKS5pcy5lcWwoe2I6IDJ9KTtcblxuICAgICAgICAgICAgby5nZXRTdWJqZWN0KCkuZCA9IDU7XG4gICAgICAgICAgICBleHBlY3Qoby5nZXRSZWFsU3ViamVjdCgpKS5pcy5lcWwoe2I6IDIsIGQ6IDV9KTtcblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBQcm94eU9ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG8gPSBuZXcgUHJveHlPYnNlcnZlcih7fSk7XG4gICAgICAgICAgICBleHBlY3QobykuaXMuaW5zdGFuY2VPZihQcm94eU9ic2VydmVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncHJveHkgb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ1Byb3h5IG9iamVjdHMgc2hvdWxkIG5vdCBiZSByZWNvbW1pdHRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvID0gbmV3IFByb3h5T2JzZXJ2ZXIoe2E6IHtiOiB0cnVlfX0pO1xuICAgICAgICAgICAgby5nZXRTdWJqZWN0KCkuYS5iID0gby5nZXRTdWJqZWN0KCk7XG4gICAgICAgICAgICBvLmdldFN1YmplY3QoKS5hLmIuYS5iID0gZmFsc2U7XG4gICAgICAgICAgICAvL2V4cGVjdChvLmdldFN1YmplY3QoKT09PXAuZ2V0U3ViamVjdCgpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdub3RpZnkgb2JzZXJ2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgaW5mb3JtIG9ic2VydmVyJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgICAgIC8vIHRoZSBtZXRob2QgaXMgY2FsbGVkIHR3aWNlLCBvbmNlIGZvciBkZWZpbmVQcm9wZXJ0eSBhbmQgZm9yIHNldCB0cmFwXG4gICAgICAgICAgICBsZXQgbyA9IG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoYSkge1xuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdCh0aGlzKSAmJiB0aGlzIGluc3RhbmNlb2YgUHJveHlPYnNlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKFwidGhpcyBpcyBub3QgUHJveHlPYnNlcnZlclwiKSlcbiAgICAgICAgICAgIH0sIHRydWUpXG5cbiAgICAgICAgICAgIGxldCByZWFsU3ViamVjdCA9IHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZDogNVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHAgPSBuZXcgUHJveHlPYnNlcnZlcihyZWFsU3ViamVjdCk7XG4gICAgICAgICAgICBleHBlY3QocCkuaXMuaW5zdGFuY2VPZihQcm94eU9ic2VydmVyKTtcbiAgICAgICAgICAgIGV4cGVjdChwLmF0dGFjaE9ic2VydmVyKG8pKS5pcy5pbnN0YW5jZU9mKFByb3h5T2JzZXJ2ZXIpO1xuXG4gICAgICAgICAgICBsZXQgcyA9IHAuZ2V0U3ViamVjdCgpO1xuICAgICAgICAgICAgbGV0IHIgPSBwLmdldFJlYWxTdWJqZWN0KCk7XG5cbiAgICAgICAgICAgIHMuYS5kID0gZmFsc2U7XG4gICAgICAgICAgICBzLmEuYi5kID0gMjtcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRsYWIuc2NodWthaS5jb20vb3NzL2xpYnJhcmllcy9qYXZhc2NyaXB0L21vbnN0ZXIvLS9pc3N1ZXMvNDNcbiAgICAgKi9cbiAgICBkZXNjcmliZSgnUmVmbGVjdCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnY2hlY2sgUmVmbGVjdC5zZXQoKSB3aXRoIFN1YmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgcjtcblxuICAgICAgICAgICAgY29uc3Qgb2JqID0gKG5ldyBQcm94eU9ic2VydmVyKHt9KSkuZ2V0U3ViamVjdCgpO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgXCJ5ZXMhXCIsXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFwibm9cIlxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9ialsnZGF0YSddID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9KS50by5ub3QudGhyb3coKTtcbiAgICAgICAgICAgICAgICAvL3IgPSBSZWZsZWN0LnNldChvYmosICdkYXRhJywgdmFsdWUpXG4gICAgICAgICAgICAgICAgLy9leHBlY3QocikudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICB9KTtcblxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGhhdCcsIHt0aGF0OiAnY2hlY2tlZDEnfV0sXG4gICAgICAgICAgICBbJ3RoYXQnLCBuZXcgUHJveHkoe3RoYXQ6ICdjaGVja2VkMid9LCB7fSldLFxuICAgICAgICAgICAgWyd0aGF0JywgKG5ldyBQcm94eU9ic2VydmVyKHt0aGF0OiAnY2hlY2tlZDMnfSkpLmdldFJlYWxTdWJqZWN0KCldLFxuICAgICAgICAgICAgWyd0aGF0JywgKG5ldyBQcm94eU9ic2VydmVyKHt0aGF0OiAnY2hlY2tlZDQnfSkpLmdldFN1YmplY3QoKV1cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBrZXkgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2NoZWNrIFJlZmxlY3Quc2V0KCcgKyBrZXkgKyAnLCcgKyBKU09OLnN0cmluZ2lmeSh0YXJnZXQpICsgJykgc2hvdWxkIHdyaXRhYmxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIGtleSlbJ3dyaXRhYmxlJ10sICd3cml0YWJsZSBmb3IgJyArIHZhbHVlICsgJyBzaG91bGQgcmV0dXJuIHRydWUnKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUpLCAnc2V0IGZvciAnICsgdmFsdWUgKyAnIHNob3VsZCByZXR1cm4gdHJ1ZScpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBrZXkpWyd3cml0YWJsZSddLCAnd3JpdGFibGUgZm9yICcgKyB2YWx1ZSArICcgc2hvdWxkIHJldHVybiB0cnVlJykudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbm90aWZ5IG9ic2VydmVyIHdpdGggY2hhbmdlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgb3JpZ2luYWwsIG9ic2VydmVyLCBwcm94eTtcblxuICAgICAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb3JpZ2luYWwgPSB7fTtcbiAgICAgICAgICAgIHByb3h5ID0gbmV3IFByb3h5T2JzZXJ2ZXIob3JpZ2luYWwpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnYScsIDQsIEpTT04uc3RyaW5naWZ5KHthOiA0fSldLFxuICAgICAgICAgICAgWydiJywgOSwgSlNPTi5zdHJpbmdpZnkoe2E6IDQsIGI6IDl9KV1cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3NldCBrZXkgJyArIGEgKyAnIHZhbHVlICcgKyBiICsgJyBleHBlY3QgJyArIGMsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeSh0aGlzLmdldFJlYWxTdWJqZWN0KCkpKS5pcy5lcXVhbChjKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHByb3h5LmF0dGFjaE9ic2VydmVyKG9ic2VydmVyKVxuICAgICAgICAgICAgICAgIGxldCBzdWJqZWN0ID0gcHJveHkuZ2V0U3ViamVjdCgpXG5cbiAgICAgICAgICAgICAgICBzdWJqZWN0W2FdID0gYjtcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnbm90aWZ5IG9ic2VydmVyICcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBwcm9taXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHByb3h5ID0gbmV3IFByb3h5T2JzZXJ2ZXIoe30pO1xuICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBwcm94eS5hdHRhY2hPYnNlcnZlcihvYnNlcnZlcilcbiAgICAgICAgICAgIGV4cGVjdChwcm94eS5ub3RpZnlPYnNlcnZlcnMoKSkuaXMuaW5zdGFuY2VPZihQcm9taXNlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn0pXG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4vYmFzZS5tanMnO1xuaW1wb3J0IHtpc1ByaW1pdGl2ZX0gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tICcuL25vZGVsaXN0Lm1qcyc7XG5pbXBvcnQge3ZhbGlkYXRlSW5zdGFuY2V9IGZyb20gJy4vdmFsaWRhdGUubWpzJztcblxuZXhwb3J0IHtOb2RlfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbFZhbHVlU3ltYm9sID0gU3ltYm9sKCdpbnRlcm5hbERhdGEnKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgdHJlZVN0cnVjdHVyZVN5bWJvbCA9IFN5bWJvbCgndHJlZVN0cnVjdHVyZScpO1xuXG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgdGhlIGluc3RhbmNlIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLk5vZGUoKWAuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Tm9kZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvbm9kZS5tanMnO1xuICogbmV3IE5vZGUoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMS4yNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzdW1tYXJ5IEEgTm9kZSBDbGFzc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9JdGVyYXRpb25fcHJvdG9jb2xzXG4gKi9cbmNsYXNzIE5vZGUgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF0gPSB2YWx1ZTtcblxuICAgICAgICB0aGlzW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdID0ge1xuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgY2hpbGROb2RlczogbmV3IE5vZGVMaXN0LFxuICAgICAgICAgICAgbGV2ZWw6IDBcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHsqfVxuICAgICAqL1xuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHsqfVxuICAgICAqL1xuICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzW2ludGVybmFsVmFsdWVTeW1ib2xdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtNb25zdGVyLlR5cGVzLk5vZGV8bnVsbH1cbiAgICAgKi9cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtpbnRlZ2VyfVxuICAgICAqL1xuICAgIGdldCBsZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdHJlZVN0cnVjdHVyZVN5bWJvbF0ubGV2ZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge05vZGVMaXN0fVxuICAgICAqL1xuICAgIGdldCBjaGlsZE5vZGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtOb2RlTGlzdH1cbiAgICAgKi9cbiAgICBzZXQgY2hpbGROb2RlcyhjaGlsZE5vZGVzKSB7XG4gICAgICAgIHRoaXNbdHJlZVN0cnVjdHVyZVN5bWJvbF0uY2hpbGROb2RlcyA9IHZhbGlkYXRlSW5zdGFuY2UoY2hpbGROb2RlcywgTm9kZUxpc3QpO1xuICAgICAgICBzZXRDaGlsZExldmVsQW5kUGFyZW50LmNhbGwodGhpcywgdGhpcywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlfVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqL1xuICAgIGFwcGVuZENoaWxkKG5vZGUpIHtcbiAgICAgICAgdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzLmFkZCh2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpKTtcbiAgICAgICAgbm9kZVt0cmVlU3RydWN0dXJlU3ltYm9sXS5wYXJlbnQgPSB0aGlzO1xuXG4gICAgICAgIG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0ubGV2ZWwgPSB0aGlzLmxldmVsICsgMTtcbiAgICAgICAgc2V0Q2hpbGRMZXZlbEFuZFBhcmVudC5jYWxsKHRoaXMsIG5vZGUsIDEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLlR5cGVzLk5vZGV9XG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAgICovXG4gICAgcmVtb3ZlQ2hpbGQobm9kZSkge1xuICAgICAgICB0aGlzW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLmNoaWxkTm9kZXMucmVtb3ZlKHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSkpO1xuICAgICAgICBub2RlW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLnBhcmVudCA9IG51bGw7XG5cbiAgICAgICAgbm9kZVt0cmVlU3RydWN0dXJlU3ltYm9sXS5sZXZlbCA9IDA7XG4gICAgICAgIHNldENoaWxkTGV2ZWxBbmRQYXJlbnQuY2FsbCh0aGlzLCBub2RlLCAtMSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNDaGlsZE5vZGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlfVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqL1xuICAgIGhhc0NoaWxkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdHJlZVN0cnVjdHVyZVN5bWJvbF0uY2hpbGROb2Rlcy5oYXModmFsaWRhdGVJbnN0YW5jZShub2RlLCBOb2RlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHNpbmNlIDEuMjguMFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcblxuICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF0pIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF07XG4gICAgICAgICAgICBpZiAoIWlzUHJpbWl0aXZlKGxhYmVsKSkgbGFiZWwgPSBKU09OLnN0cmluZ2lmeSh0aGlzW2ludGVybmFsVmFsdWVTeW1ib2xdKVxuXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGxhYmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5jaGlsZE5vZGVzLmxlbmd0aCxcbiAgICAgICAgICAgIGNvdW50ZXIgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IChjb3VudCA9PT0gY291bnRlciA/ICdcdTI1MTQnIDogJ1x1MjUxQycpLnBhZFN0YXJ0KDIgKiBub2RlLmxldmVsLCAnIHwnKTtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gocHJlZml4ICsgbm9kZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXCIpO1xuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEBwYXJhbSB7aW50fSBvcGVyYW5kXG4gKiBAcmV0dXJuIHtzZXRDaGlsZExldmVsQW5kUGFyZW50fVxuICovXG5mdW5jdGlvbiBzZXRDaGlsZExldmVsQW5kUGFyZW50KG5vZGUsIG9wZXJhbmQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmIChub2RlICE9PSB0aGlzKSB7XG4gICAgICAgIG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0ucGFyZW50ID0gdGhpc1xuICAgIH1cblxuICAgIG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0uY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZFt0cmVlU3RydWN0dXJlU3ltYm9sXS5wYXJlbnQgPSBub2RlO1xuICAgICAgICBjaGlsZFt0cmVlU3RydWN0dXJlU3ltYm9sXS5sZXZlbCA9IG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0ubGV2ZWwgKyBvcGVyYW5kO1xuICAgICAgICBzZXRDaGlsZExldmVsQW5kUGFyZW50LmNhbGwoc2VsZiwgY2hpbGQsIG9wZXJhbmQpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7aXNBcnJheSwgaXNJbnN0YW5jZX0gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQge05vZGV9IGZyb20gXCIuL25vZGUubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlSW5zdGFuY2V9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge05vZGVMaXN0fVxuXG4vKipcbiAqIFlvdSBjYW4gY3JlYXRlIHRoZSBpbnN0YW5jZSB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBuZXcgTW9uc3Rlci5UeXBlcy5Ob2RlTGlzdCgpYC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtOb2RlTGlzdH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvbm9kZWxpc3QubWpzJztcbiAqIG5ldyBOb2RlTGlzdCgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjI2LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHN1bW1hcnkgQSBOb2RlTGlzdCBjbGFzc1xuICovXG5jbGFzcyBOb2RlTGlzdCBleHRlbmRzIFNldCB7XG5cbiAgICAvKipcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaW52YWxpZCB2YWx1ZSB0eXBlXG4gICAgICogQHBhcmFtIHtOb2RlTGlzdHxOb2RlfEFycmF5PE5vZGU+fXZhbHVlc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlcykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzXG5cbiAgICAgICAgaWYgKHZhbHVlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICAgICAgdmFsdWVzLmZvckVhY2godmFsdWUgPT4gc2VsZi5hZGQodmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0luc3RhbmNlKHZhbHVlcywgTm9kZUxpc3QpKSB7XG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiBzZWxmLmFkZCh2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSW5zdGFuY2UodmFsdWVzLCBOb2RlKSkge1xuICAgICAgICAgICAgc2VsZi5hZGQodmFsdWVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWx1ZSB0eXBlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuVHlwZXMuTm9kZUxpc3R9XG4gICAgICovXG4gICAgYWRkKG5vZGUpIHtcbiAgICAgICAgc3VwZXIuYWRkKHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9XG4gICAgICovXG4gICAgcmVtb3ZlKG5vZGUpIHtcbiAgICAgICAgc3VwZXIuZGVsZXRlKHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXMobm9kZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuaGFzKHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSkpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICBzdXBlci5jbGVhcigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9XG4gICAgICovXG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH1cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMudG9BcnJheSgpKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG5vZGUudG9TdHJpbmcoKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXCIpO1xuICAgIH1cblxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5zaXplO1xuICAgIH1cbn1cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7Tm9kZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9ub2RlLm1qc1wiO1xuaW1wb3J0IHtOb2RlTGlzdH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9ub2RlbGlzdC5tanNcIjtcblxuZGVzY3JpYmUoJ05vZGVMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCcjY29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgY3JlYXRlIGFuIGVtcHR5IE5vZGVMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0KCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChub2RlTGlzdC5zaXplKS50by5lcXVhbCgwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgYSBOb2RlTGlzdCBmcm9tIGFuIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0KFtcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JyksXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpLFxuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKVxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChub2RlTGlzdC5zaXplKS50by5lcXVhbCgzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgYSBOb2RlTGlzdCBmcm9tIGEgTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoW1xuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JyksXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgbGV0IG5vZGVMaXN0MiA9IG5ldyBOb2RlTGlzdChub2RlTGlzdCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChub2RlTGlzdDIuc2l6ZSkudG8uZXF1YWwoMyk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICB9KTtcbiAgICBcbiAgICAgXG4gICAgaXQoJ2NyZWF0ZSBOb2RlTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpKS5pcy5pbnN0YW5jZW9mKE5vZGVMaXN0KTtcbiAgICB9KVxuXG4gICAgaXQoJ2FkZCBOb2RlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVMaXN0KCkuYWRkKG5ldyBOb2RlKCkpKS50by5iZS5pbnN0YW5jZW9mKE5vZGVMaXN0KTtcbiAgICB9KVxuXG4gICAgaXQoJ3JlbW92ZSBOb2RlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVMaXN0KCkucmVtb3ZlKG5ldyBOb2RlKCkpKS50by5iZS5pbnN0YW5jZW9mKE5vZGVMaXN0KTtcbiAgICB9KVxuXG4gICAgaXQoJ2hhcyB1bmtub3duIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5oYXMobmV3IE5vZGUpKS50by5iZS5mYWxzZTtcbiAgICB9KVxuXG4gICAgaXQoJ2hhcyBhZGRlZCBOb2RlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBuID0gbmV3IE5vZGU7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5hZGQobikuaGFzKG4pKS50by5iZS50cnVlO1xuICAgIH0pXG4gICAgXG4gICAgaXQoJ3RvU3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBuID0gbmV3IE5vZGU7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5hZGQobmV3IE5vZGUoJ2EnKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnYicpKSkudG9TdHJpbmcoKSkudG8uYmUuZXF1YWwoJ2FcXG4gXHUyNTE0YicpO1xuICAgIH0pXG5cbiAgICBpdCgndGhyb3cgZXhjZXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QoKCkgPT4gbmV3IE5vZGVMaXN0KCkuYWRkKDEpKS50by50aHJvdyhFcnJvcik7XG4gICAgfSlcblxuXG59KTsiLCAiaW1wb3J0IHtcbiAgICBWZXJzaW9uXG59IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdmVyc2lvbi5tanNcIlxuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnVmVyc2lvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCcuY29tcGFyZVRvKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWycxLjIuMycsICcxLjIuMycsIDBdLFxuICAgICAgICAgICAgWycxLjIuMicsICcxLjIuMycsIC0xXSxcbiAgICAgICAgICAgIFsnMicsICcyLjAuMCcsIDBdLFxuICAgICAgICAgICAgWycxLjIuNCcsICcxLjIuMycsIDFdXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuICcgKyBjICsgJyB3aGVuIHRoZSB2YWx1ZSAnICsgYSArICcgaXMgJyArIGIgKyAnJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgVmVyc2lvbihhKS5jb21wYXJlVG8oYikpLnRvLmJlLmVxdWFsKGMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnRvU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWycxLjEuMScsICcyLjMnLCAzLCAnMS4yLjMnXSxcbiAgICAgICAgICAgIFsnMS4yLjQnLCAnMS4yLjMnLCA1LCAnMS4xLjUnXVxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGQgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gJyArIGQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFZlcnNpb24oYSwgYiwgYykudG9TdHJpbmcoKSkudG8uYmUuZXF1YWwoZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSlcblxufSk7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4vYmFzZS5tanMnO1xuaW1wb3J0IHtpc0luc3RhbmNlfSBmcm9tIFwiLi9pcy5tanNcIjtcbmltcG9ydCB7Tm9kZX0gZnJvbSBcIi4vbm9kZS5tanNcIjtcbmltcG9ydCB7Tm9kZUxpc3R9IGZyb20gXCIuL25vZGVsaXN0Lm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlfSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtOb2RlUmVjdXJzaXZlSXRlcmF0b3J9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGlzTm9kZUxpc3RTeW1ib2wgPSBTeW1ib2woJ2lzTm9kZUxpc3QnKTtcblxuLyoqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGUgaW5zdGFuY2UgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgbmV3IE1vbnN0ZXIuVHlwZXMuTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge05vZGVSZWN1cnNpdmVJdGVyYXRvcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvbm9kZXJlY3Vyc2l2ZWl0ZXJhdG9yLm1qcyc7XG4gKiBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7Tm9kZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdHlwZXMvbm9kZS5tanMnO1xuICogaW1wb3J0IHtOb2RlUmVjdXJzaXZlSXRlcmF0b3J9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3R5cGVzL25vZGVyZWN1cnNpdmVpdGVyYXRvci5tanMnO1xuICpcbiAqIGNvbnN0IG5vZGUgPW5ldyBOb2RlKCcxJylcbiAqXG4gKiAvLyAxXG4gKiAvLyAyXG4gKiAvLyBcdTI1MUMgMi4xXG4gKiAvLyBcdTI1MUMgMi4yXG4gKiAvLyBcdTI1MTQgMi4zXG4gKiAvLyAzXG4gKiAvLyA0XG4gKiAvLyBcdTI1MUMgNC4xXG4gKiAvLyBcdTI1MTQgNC4yXG4gKiBub2RlLmFwcGVuZENoaWxkKFxuICogKG5ldyBOb2RlKCcyJykpXG4gKiAgICAgICAuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzIuMScpKVxuICogICAgICAgLmFwcGVuZENoaWxkKG5ldyBOb2RlKCcyLjInKSlcbiAqICAgICAgIC5hcHBlbmRDaGlsZChuZXcgTm9kZSgnMi4zJykpKVxuICogLmFwcGVuZENoaWxkKG5ldyBOb2RlKCczJykpXG4gKiAuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzQnKVxuICogICAgICAgLmFwcGVuZENoaWxkKG5ldyBOb2RlKCc0LjEnKSlcbiAqICAgICAgIC5hcHBlbmRDaGlsZChuZXcgTm9kZSgnNC4yJykpKTtcbiAqXG4gKiBjb25zdCBpdGVyYXRvciA9IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3Iobm9kZSk7XG4gKlxuICogY29uc3QgcmVzdWx0ID0gW107XG4gKiBmb3IgKGNvbnN0IG4gb2YgaXRlcmF0b3IpIHtcbiAqICAgICAgcmVzdWx0LnB1c2gobi52YWx1ZSk7XG4gKiB9XG4gKlxuICogLy8gXHUyMUE2IFsnMScsICcyJywgJzIuMScsICcyLjInLCAnMi4zJywgJzMnLCAnNCcsICc0LjEnLCAnNC4yJ11cbiAqXG4gKiBAc2luY2UgMS4yNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzdW1tYXJ5IEFuIGl0ZXJhdG9yIHRvIHJ1biByZWN1cnNpdmVseSB0aHJvdWdoIGEgdHJlZSBvZiBub2Rlc1xuICovXG4gY2xhc3MgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IFtkYXRhXVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW2lzTm9kZUxpc3RTeW1ib2xdID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaXRlcmF0b3IgaXMgYSBub2RlbGlzdFxuICAgICAgICBpZiAoaXNJbnN0YW5jZShub2RlLCBOb2RlTGlzdCkpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IG5vZGU7XG4gICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoKTtcbiAgICAgICAgICAgIG5vZGUuY2hpbGROb2RlcyA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgdGhpc1tpc05vZGVMaXN0U3ltYm9sXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXSA9IHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy95aWVsZFxuICAgICAqL1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24qICgpIHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGVuZCBvZiB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGlzIHJlYWNoZWQuIEluIHRoaXMgY2FzZSwgZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3JcbiAgICAgICAgICogZW5kcyBhbmQgYW4gSXRlcmF0b3JSZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBpbiB3aGljaCB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZCBkb25lIGlzIHRydWUuXG4gICAgICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3lpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBpdGVyYXRvciBpcyBhIG5vZGVsaXN0IGFuZCB0aGUgbWFpbiBub2RlIGlzIG9ubHkgYSBwbGFjZWhvbGRlclxuICAgICAgICBpZiAodGhpc1tpc05vZGVMaXN0U3ltYm9sXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgeWllbGQgdGhpc1tpbnRlcm5hbFN5bWJvbF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF0uaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGROb2RlcyA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdLmNoaWxkTm9kZXM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG5vZGUgb2YgY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgICAgIHlpZWxkKiBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlUmVjdXJzaXZlSXRlcmF0b3J9XG4gICAgICovXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykge1xuICAgICAgICAgICAgY2FsbGJhY2sobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtOb2RlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qc1wiO1xuaW1wb3J0IHtOb2RlUmVjdXJzaXZlSXRlcmF0b3J9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvbm9kZXJlY3Vyc2l2ZWl0ZXJhdG9yLm1qc1wiO1xuXG5kZXNjcmliZSgnTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJyNjb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0LnNpemUpLnRvLmVxdWFsKDApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIE5vZGVMaXN0IGZyb20gYW4gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoW1xuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JyksXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0LnNpemUpLnRvLmVxdWFsKDMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIE5vZGVMaXN0IGZyb20gYSBOb2RlTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBub2RlTGlzdCA9IG5ldyBOb2RlTGlzdChbXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpLFxuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JylcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QyID0gbmV3IE5vZGVMaXN0KG5vZGVMaXN0KTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0Mi5zaXplKS50by5lcXVhbCgzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlIE5vZGVMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVMaXN0KCkpLmlzLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgnYWRkIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5hZGQobmV3IE5vZGUoKSkpLnRvLmJlLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgncmVtb3ZlIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5yZW1vdmUobmV3IE5vZGUoKSkpLnRvLmJlLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgnaGFzIHVua25vd24gTm9kZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmhhcyhuZXcgTm9kZSkpLnRvLmJlLmZhbHNlO1xuICAgIH0pXG5cbiAgICBpdCgnaGFzIGFkZGVkIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTm9kZTtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmFkZChuKS5oYXMobikpLnRvLmJlLnRydWU7XG4gICAgfSlcblxuICAgIGl0KCd0aHJvdyBleGNlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgTm9kZUxpc3QoKS5hZGQoMSkpLnRvLnRocm93KEVycm9yKTtcbiAgICB9KVxuXG4gICAgaXQoJ2NoZWNrIGxldmVsJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IHJvb3QgPSBuZXcgTm9kZSgncm9vdCcpO1xuXG4gICAgICAgIGNvbnN0IG4xID0gbmV3IE5vZGUoJ24xJyk7XG4gICAgICAgIGNvbnN0IG4yID0gbmV3IE5vZGUoJ24yJyk7XG4gICAgICAgIGNvbnN0IG4zID0gbmV3IE5vZGUoJ24zJyk7XG4gICAgICAgIGNvbnN0IG40ID0gbmV3IE5vZGUoJ240Jyk7XG5cbiAgICAgICAgY29uc3QgbjExID0gbmV3IE5vZGUoJ24xMScpO1xuICAgICAgICBjb25zdCBuMTIgPSBuZXcgTm9kZSgnbjEyJyk7XG4gICAgICAgIGNvbnN0IG4xMyA9IG5ldyBOb2RlKCduMTMnKTtcblxuICAgICAgICBjb25zdCBuMjEgPSBuZXcgTm9kZSgnbjIxJyk7XG4gICAgICAgIGNvbnN0IG4yMiA9IG5ldyBOb2RlKCduMjInKTtcbiAgICAgICAgY29uc3QgbjIzID0gbmV3IE5vZGUoJ24yMycpO1xuXG4gICAgICAgIGNvbnN0IG40MSA9IG5ldyBOb2RlKCduNDEnKTtcbiAgICAgICAgY29uc3QgbjQyID0gbmV3IE5vZGUoJ240MicpO1xuXG4gICAgICAgIGNvbnN0IG40MTEgPSBuZXcgTm9kZSgnbjQxMScpO1xuICAgICAgICBjb25zdCBuNDEyID0gbmV3IE5vZGUoJ240MTInKTtcbiAgICAgICAgY29uc3QgbjQxMyA9IG5ldyBOb2RlKCduNDEzJyk7XG5cbiAgICAgICAgY29uc3QgbjQxMjEgPSBuZXcgTm9kZSgnbjQxMjEnKTtcblxuICAgICAgICByb290LmFwcGVuZENoaWxkKG4xKS5hcHBlbmRDaGlsZChuMikuYXBwZW5kQ2hpbGQobjMpLmFwcGVuZENoaWxkKG40KTtcbiAgICAgICAgbjEuYXBwZW5kQ2hpbGQobjExKS5hcHBlbmRDaGlsZChuMTIpLmFwcGVuZENoaWxkKG4xMyk7XG4gICAgICAgIG4yLmFwcGVuZENoaWxkKG4yMSkuYXBwZW5kQ2hpbGQobjIyKS5hcHBlbmRDaGlsZChuMjMpO1xuICAgICAgICBuNC5hcHBlbmRDaGlsZChuNDEpLmFwcGVuZENoaWxkKG40Mik7XG4gICAgICAgIG40MS5hcHBlbmRDaGlsZChuNDExKS5hcHBlbmRDaGlsZChuNDEyKS5hcHBlbmRDaGlsZChuNDEzKTtcbiAgICAgICAgbjQxMi5hcHBlbmRDaGlsZChuNDEyMSk7XG5cbiAgICAgICAgbGV0IGl0ZXJhdG9yID0gbmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihyb290KTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBpdGVyYXRvcikge1xuICAgICAgICAgICAgZXhwZWN0KG4pLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuLnZhbHVlICsgXCI6XCIgKyBuLmxldmVsKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbXG4gICAgICAgICAgICAncm9vdDowJyxcbiAgICAgICAgICAgICduMToxJyxcbiAgICAgICAgICAgICduMTE6MicsXG4gICAgICAgICAgICAnbjEyOjInLFxuICAgICAgICAgICAgJ24xMzoyJyxcbiAgICAgICAgICAgICduMjoxJyxcbiAgICAgICAgICAgICduMjE6MicsXG4gICAgICAgICAgICAnbjIyOjInLFxuICAgICAgICAgICAgJ24yMzoyJyxcbiAgICAgICAgICAgICduMzoxJyxcbiAgICAgICAgICAgICduNDoxJyxcbiAgICAgICAgICAgICduNDE6MicsXG4gICAgICAgICAgICAnbjQxMTozJyxcbiAgICAgICAgICAgICduNDEyOjMnLFxuICAgICAgICAgICAgJ240MTIxOjQnLFxuICAgICAgICAgICAgJ240MTM6MycsXG4gICAgICAgICAgICAnbjQyOjInXG5cbiAgICAgICAgXSk7XG5cbiAgICAgICAgbjQxMjEuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJ240MTIxMScpKTtcblxuICAgICAgICBpdGVyYXRvciA9IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3Iocm9vdCk7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGV4cGVjdChuKS50by5iZS5hbi5pbnN0YW5jZW9mKE5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobi52YWx1ZSArIFwiOlwiICsgbi5sZXZlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFtcbiAgICAgICAgICAgICdyb290OjAnLFxuICAgICAgICAgICAgJ24xOjEnLFxuICAgICAgICAgICAgJ24xMToyJyxcbiAgICAgICAgICAgICduMTI6MicsXG4gICAgICAgICAgICAnbjEzOjInLFxuICAgICAgICAgICAgJ24yOjEnLFxuICAgICAgICAgICAgJ24yMToyJyxcbiAgICAgICAgICAgICduMjI6MicsXG4gICAgICAgICAgICAnbjIzOjInLFxuICAgICAgICAgICAgJ24zOjEnLFxuICAgICAgICAgICAgJ240OjEnLFxuICAgICAgICAgICAgJ240MToyJyxcbiAgICAgICAgICAgICduNDExOjMnLFxuICAgICAgICAgICAgJ240MTI6MycsXG4gICAgICAgICAgICAnbjQxMjE6NCcsXG4gICAgICAgICAgICAnbjQxMjExOjUnLFxuICAgICAgICAgICAgJ240MTM6MycsXG4gICAgICAgICAgICAnbjQyOjInXG5cbiAgICAgICAgXSk7XG5cblxuICAgICAgICBjb25zdCBiYiA9IG5ldyBOb2RlKCdiYicpIC8vIGJpZyBiYW5nXG5cbiAgICAgICAgYmIuYXBwZW5kQ2hpbGQocm9vdCk7XG4gICAgICAgIGl0ZXJhdG9yID0gbmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihiYik7XG5cbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBpdGVyYXRvcikge1xuICAgICAgICAgICAgZXhwZWN0KG4pLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuLnZhbHVlICsgXCI6XCIgKyBuLmxldmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoW1xuICAgICAgICAgICAgJ2JiOjAnLFxuICAgICAgICAgICAgJ3Jvb3Q6MScsXG4gICAgICAgICAgICAnbjE6MicsXG4gICAgICAgICAgICAnbjExOjMnLFxuICAgICAgICAgICAgJ24xMjozJyxcbiAgICAgICAgICAgICduMTM6MycsXG4gICAgICAgICAgICAnbjI6MicsXG4gICAgICAgICAgICAnbjIxOjMnLFxuICAgICAgICAgICAgJ24yMjozJyxcbiAgICAgICAgICAgICduMjM6MycsXG4gICAgICAgICAgICAnbjM6MicsXG4gICAgICAgICAgICAnbjQ6MicsXG4gICAgICAgICAgICAnbjQxOjMnLFxuICAgICAgICAgICAgJ240MTE6NCcsXG4gICAgICAgICAgICAnbjQxMjo0JyxcbiAgICAgICAgICAgICduNDEyMTo1JyxcbiAgICAgICAgICAgICduNDEyMTE6NicsXG4gICAgICAgICAgICAnbjQxMzo0JyxcbiAgICAgICAgICAgICduNDI6MydcblxuICAgICAgICBdKTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnTGV2ZWxzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCduMiBzaG91bGQgbGV2ZWwgMicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgY29uc3QgbjAgPSBuZXcgTm9kZSgnYWJjJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG4xID0gbmV3IE5vZGUoJ2RlZicpO1xuICAgICAgICAgICAgbjAuYXBwZW5kQ2hpbGQobjEpXG5cbiAgICAgICAgICAgIGNvbnN0IG4yID0gbmV3IE5vZGUoJ2doaScpO1xuICAgICAgICAgICAgbjEuYXBwZW5kQ2hpbGQobjIpO1xuXG4gICAgICAgICAgICBjb25zdCBuMyA9IG5ldyBOb2RlKCdqa2wnKTtcbiAgICAgICAgICAgIG4yLmFwcGVuZENoaWxkKG4zKTtcblxuICAgICAgICAgICAgZXhwZWN0KG4wLmxldmVsKS50by5iZS5lcXVhbCgwKTtcbiAgICAgICAgICAgIGV4cGVjdChuMS5sZXZlbCkudG8uYmUuZXF1YWwoMSk7XG4gICAgICAgICAgICBleHBlY3QobjIubGV2ZWwpLnRvLmJlLmVxdWFsKDIpO1xuICAgICAgICAgICAgZXhwZWN0KG4zLmxldmVsKS50by5iZS5lcXVhbCgzKTtcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ3RvU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBvdXRwdXQgZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBOb2RlKCk7XG4gICAgICAgICAgICBleHBlY3Qobm9kZS50b1N0cmluZygpKS5pcy5lcXVhbCgnJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgb3V0cHV0IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG4wID0gbmV3IE5vZGUoJ2FiYycpO1xuXG4gICAgICAgICAgICBjb25zdCBuMSA9IG5ldyBOb2RlKCdkZWYnKTtcbiAgICAgICAgICAgIG4wLmFwcGVuZENoaWxkKG4xKVxuXG4gICAgICAgICAgICBjb25zdCBuMTEgPSBuZXcgTm9kZSgnZ2hpJyk7XG4gICAgICAgICAgICBuMC5hcHBlbmRDaGlsZChuMTEpXG5cbiAgICAgICAgICAgIGNvbnN0IG4yID0gbmV3IE5vZGUoJ2prbCcpO1xuICAgICAgICAgICAgbjEuYXBwZW5kQ2hpbGQobjIpO1xuXG4gICAgICAgICAgICBjb25zdCBuMyA9IG5ldyBOb2RlKCdtbm8nKTtcbiAgICAgICAgICAgIG4xLmFwcGVuZENoaWxkKG4zKTtcblxuICAgICAgICAgICAgY29uc3QgbjQgPSBuZXcgTm9kZSgncHFyJyk7XG4gICAgICAgICAgICBuMi5hcHBlbmRDaGlsZChuNCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChuMi5sZXZlbCkudG8uYmUuZXF1YWwoMilcblxuICAgICAgICAgICAgY29uc29sZS5sb2cobjAudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAvLyBleHBlY3QobjAudG9TdHJpbmcoKSkuaXMuZXF1YWwoJycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtOb2RlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qc1wiO1xuaW1wb3J0IHtOb2RlUmVjdXJzaXZlSXRlcmF0b3J9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvbm9kZXJlY3Vyc2l2ZWl0ZXJhdG9yLm1qc1wiO1xuXG5kZXNjcmliZSgnTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yJywgZnVuY3Rpb24gKCkge1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBleGVwdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3IoKSkudG8udGhyb3coRXJyb3IpXG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBiZSBhIGZ1bmN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QoTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKS50by5iZS5hKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBhIGNvbnN0cnVjdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihuZXcgTm9kZSkpLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3lpZWxkXG4gICAgICovXG4gICAgaXQoJ3VuZGVmaW5lZCBzaG91bGQgbm90IHJlc3VsdCBpbiB1bmRlZmluZWQgbm9kZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKG5ldyBOb2RlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBleHBlY3QobikudG8uYmUuYW4uaW5zdGFuY2VvZihOb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG4udmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbdW5kZWZpbmVkXSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaXRlcmF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9XG4gICAgICAgICAgICBuZXcgTm9kZSgnMScpXG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICAobmV3IE5vZGUoJzInKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzIuMScpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnMi4yJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCcyLjMnKSkpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCczJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCc0JykuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzQuMScpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnNC4yJykpKTtcblxuICAgICAgICBjb25zdCBpdGVyYXRvciA9IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3Iobm9kZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBpdGVyYXRvcikge1xuICAgICAgICAgICAgZXhwZWN0KG4pLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoWycxJywgJzInLCAnMi4xJywgJzIuMicsICcyLjMnLCAnMycsICc0JywgJzQuMScsICc0LjInXSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaXRlcmF0ZSBub2RlbGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoKTtcblxuICAgICAgICBub2RlTGlzdC5hZGQoXG4gICAgICAgICAgICAobmV3IE5vZGUoJzInKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzIuMScpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnMi4yJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCcyLjMnKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzMnKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzQnKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnNC4xJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCc0LjInKSkpKTtcblxuICAgICAgICBub2RlTGlzdC5hZGQobmV3IE5vZGUoJ3gnKSk7XG5cbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKG5vZGVMaXN0KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBleHBlY3QobikudG8uYmUuYW4uaW5zdGFuY2VvZihOb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG4udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFsnMicsICcyLjEnLCAnMi4yJywgJzIuMycsICczJywgJzQnLCAnNC4xJywgJzQuMicsICd4J10pO1xuXG4gICAgfSk7XG5cbn0pOyIsICJpbXBvcnQge2dldEdsb2JhbCwgZ2V0R2xvYmFsT2JqZWN0LCBnZXRHbG9iYWxGdW5jdGlvbn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnR2xvYmFsJywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCdnZXRHbG9iYWwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZ2xvYmFsIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCB0ID0gdHlwZW9mIGdldEdsb2JhbCgpO1xuICAgICAgICAgICAgZXhwZWN0KHQpLnRvLmJlLmVxdWFsKCdvYmplY3QnKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdnZXRHbG9iYWxGdW5jdGlvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBnbG9iYWwgZnVuY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdCA9IHR5cGVvZiBnZXRHbG9iYWxGdW5jdGlvbigncGFyc2VJbnQnKTtcbiAgICAgICAgICAgIGV4cGVjdCh0KS50by5iZS5lcXVhbCgnZnVuY3Rpb24nKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdnZXRHbG9iYWxPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZ2xvYmFsIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCB0ID0gdHlwZW9mIGdldEdsb2JhbE9iamVjdCgnSlNPTicpO1xuICAgICAgICAgICAgZXhwZWN0KHQpLnRvLmJlLmVxdWFsKCdvYmplY3QnKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge3BhcnNlRGF0YVVSTH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qc1wiO1xuXG5kZXNjcmliZSgnRGF0YXVybCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIFtcbiAgICAgICAgW1wiIGRhdGE6dGV4dC9odG1sLCUzQ2gxJTNFSGVsbG8lMkMlMjBXb3JsZCElM0MlMkZoMSUzRVwiXSxcbiAgICAgICAgW1wiZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD1VUy1BU0NJSSwlM0NoMSUzRUhlbGxvISUzQyUyRmgxJTNFXCJdLFxuICAgICAgICBbXCJkYXRhOixBJTIwYnJpZWYlMjBub3RlXCIsICdkYXRhOnRleHQvcGxhaW47Y2hhcnNldD1VUy1BU0NJSSxBJTIwYnJpZWYlMjBub3RlJ10sXG4gICAgICAgIFtcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFRTUFBQUFsUFcwaUFBQUFCbEJNVkVVQUFBRC8vLytsMlovZEFBQUFNMGxFUVZSNG5HUDQvNS9oLzErRy81OFpEckF6M0QvTWNIOHl3ODNORERlTkdlNFVnOUM5end6M2dWTE1EQS9BNlA5L0FGR0dGeWpPWFp0UUFBQUFBRWxGVGtTdVFtQ0NcIl0sXG4gICAgICAgIFtcIiBkYXRhOixIZWxsbyUyQyUyMFdvcmxkIVwiLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUksSGVsbG8lMkMlMjBXb3JsZCEnXSxcbiAgICAgICAgW1wiICAgZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQkFNQUFBQTJJYU80QUFBQUZWQk1WRVhrNU9UbjUrZnQ3ZTMxOWZYMjl2YjUrZm4vLy8rK0dVbVZBQUFBTFVsRVFWUUlIV05JQ25ZTFpuQUxUZ3BtTUdZSUZXWUlaVEEyWkZBelRURmxTREZWTXdWeVFobUF3c1lNQUtEYUJ5MGF4WC9pQUFBQUFFbEZUa1N1UW1DQyAgIFwiXSxcbiAgICAgICAgW1wiIGRhdGE6LEhlbGxvIFdvcmxkIVwiLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUksSGVsbG8lMjBXb3JsZCEnXSxcbiAgICAgICAgW1wiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQkFNQUFBQTJJYU80QUFBQUZWQk1WRVhrNU9UbjUrZnQ3ZTMxOWZYMjl2YjUrZm4vLy8rK0dVbVZBQUFBTFVsRVFWUUlIV05JQ25ZTFpuQUxUZ3BtTUdZSUZXWUlaVEEyWkZBelRURmxTREZWTXdWeVFobUF3c1lNQUtEYUJ5MGF4WC9pQUFBQUFFbEZUa1N1UW1DQ1wiXSxcbiAgICAgICAgW1wiIGRhdGE6dGV4dC9wbGFpbjtiYXNlNjQsU0dWc2JHOHNJRmR2Y214a0lRJTNEJTNEXCJdXG5cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgaWYgKGIgPT09IHVuZGVmaW5lZCkgYiA9IGEudHJpbSgpO1xuXG5cbiAgICAgICAgaXQoJ3BhcnNlRGF0YVVSTCgnICsgYSArICcpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBleHBlY3QocGFyc2VEYXRhVVJMKGEpLnRvU3RyaW5nKCkpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICB9KVxuXG4gICAgfSk7XG5cbiAgICBbXG4gICAgICAgIFtcImRhdGF4YmFzZTY0XCJdLFxuICAgICAgICBbXCJkYXRhOkhlbGxvV29ybGRcIl0sXG4gICAgICAgIFtcImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9LCUzQ2gxJTNFSGVsbG8hJTNDJTJGaDElM0VcIl0sXG4gICAgICAgIFtcImRhdGE6dGV4dC9odG1sO2NoYXJzZXQsJTNDaDElM0VIZWxsbyElM0MlMkZoMSUzRVwiLCBcImRhdGE6YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQVFNQUFBQWxQVzBpQUFBQUJsQk1WRVVBQUFELy8vK2wyWi9kQUFBQU0wbEVRVlI0bkdQNC81L2gvMStHLzU4WkRyQXozRC9NY0g4eXc4M05ERGVOR2U0VWc5Qzl6d3ozZ1ZMTURBL0E2UDkvQUZHR0Z5ak9YWnRRQUFBQUFFbEZUa1N1UW1DQ1wiXSxcbiAgICAgICAgW1wiXCJdLFxuICAgICAgICBbXCJodHRwOi8vd2lraXBlZGlhLm9yZ1wiXSxcbiAgICAgICAgW1wiYmFzZTY0XCJdLFxuICAgICAgICBbXCJpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFRTUFBQUFsUFcwaUFBQUFCbEJNVkVVQUFBRC8vLytsMlovZEFBQUFNMGxFUVZSNG5HUDQvNS9oLzErRy81OFpEckF6M0QvTWNIOHl3ODNORERlTkdlNFVnOUM5end6M2dWTE1EQS9BNlA5L0FGR0dGeWpPWFp0UUFBQUFBRWxGVGtTdVFtQ0NcIl1cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGV4Y2VwdGlvbiBwYXJzZURhdGFVUkwoJyArIGEgKyAnKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHBhcnNlRGF0YVVSTChhKSkudGhyb3coVHlwZUVycm9yKVxuICAgICAgICB9KVxuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7XG4gICAgdmFsaWRhdGVQcmltaXRpdmUsXG4gICAgdmFsaWRhdGVCb29sZWFuLFxuICAgIHZhbGlkYXRlU3RyaW5nLFxuICAgIHZhbGlkYXRlT2JqZWN0LFxuICAgIHZhbGlkYXRlQXJyYXksXG4gICAgdmFsaWRhdGVGdW5jdGlvbixcbiAgICB2YWxpZGF0ZUludGVnZXIsXG4gICAgdmFsaWRhdGVJbnN0YW5jZSxcbiAgICB2YWxpZGF0ZUl0ZXJhYmxlLFxuICAgIHZhbGlkYXRlU3ltYm9sXG59IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzXCJcblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2Jhc2UubWpzXCJcbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaWQubWpzXCJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ3ZhbGlkYXRlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVByaW1pdGl2ZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW251bGwsIHRydWVdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCB0cnVlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNC41LCB0cnVlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlUHJpbWl0aXZlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB2YWxpZGF0ZVByaW1pdGl2ZShhKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlUHJpbWl0aXZlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVQcmltaXRpdmUoYSkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcudmFsaWRhdGVJbnRlZ2VyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHRydWVdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlSW50ZWdlcignICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVJbnRlZ2VyKGEpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVJbnRlZ2VyKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVJbnRlZ2VyKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG4gICAgXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVN5bWJvbCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIHRydWVdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN5bWJvbCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVTeW1ib2woYSkpLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN5bWJvbCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgbm90IHRocm93IFR5cGVFeGNlcHRpb24gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHZhbGlkYXRlU3ltYm9sKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlSXRlcmFibGUoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgdHJ1ZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIHRydWVdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUl0ZXJhYmxlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUl0ZXJhYmxlKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlSXRlcmFibGUoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUl0ZXJhYmxlKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlQm9vbGVhbigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHRydWVdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlQm9vbGVhbignICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVCb29sZWFuKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUJvb2xlYW4oJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUJvb2xlYW4oYSkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVN0cmluZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN0cmluZygnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoYSlcbiAgICAgICAgICAgICAgICAgICAgfSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVTdHJpbmcoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZVN0cmluZyhhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZU9iamVjdCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIHRydWVdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZU9iamVjdCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVPYmplY3QoYSlcbiAgICAgICAgICAgICAgICAgICAgfSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVPYmplY3QoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZU9iamVjdChhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZUluc3RhbmNlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIE9iamVjdF0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBPYmplY3RdLFxuICAgICAgICAgICAgW251bGwsIE9iamVjdF0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgT2JqZWN0XSxcbiAgICAgICAgICAgIFsyLCBPYmplY3RdLFxuICAgICAgICAgICAgW2ZhbHNlLCBPYmplY3RdLFxuICAgICAgICAgICAgW3RydWUsIE9iamVjdF0sXG4gICAgICAgICAgICBbNC41LCBPYmplY3RdLFxuICAgICAgICAgICAgW3t9LCBCYXNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIE9iamVjdF0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBPYmplY3RdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUluc3RhbmNlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJbnN0YW5jZShhLCBiKVxuICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZUluc3RhbmNlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW3t9LCBPYmplY3QsIHRydWVdLFxuICAgICAgICAgICAgW25ldyBCYXNlLCBCYXNlLCB0cnVlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnLnZhbGlkYXRlSW5zdGFuY2UoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHZhbGlkYXRlSW5zdGFuY2UoYSwgYikpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlQXJyYXkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCBmYWxzZV0sXG4gICAgICAgICAgICBbMiwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCB0cnVlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpZiAoYiA9PT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVBcnJheSgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBcnJheShhKVxuICAgICAgICAgICAgICAgICAgICB9KS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUFycmF5KCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVBcnJheShhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcudmFsaWRhdGVGdW5jdGlvbigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIHRydWVdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUZ1bmN0aW9uKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlRnVuY3Rpb24oJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUZ1bmN0aW9uKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1VuaXF1ZVF1ZXVlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3VuaXF1ZXF1ZXVlLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdVbmlxdWVRdWV1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcXVldWU7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHF1ZXVlID0gbmV3IFVuaXF1ZVF1ZXVlO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnaXNFbXB0eSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdmaXJzdCBpdCBzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnYWRkIHNlcXVlbmNlIHBlZWsgYW5kIHBvbGwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Jlc3VsdCBhLGEsYSxiJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCh7YTogMX0pKS50by5iZS5pbnN0YW5jZU9mKFVuaXF1ZVF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCh7YTogMn0pKS50by5iZS5pbnN0YW5jZU9mKFVuaXF1ZVF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5hZGQoe2E6IDN9KSkudG8uYmUuaW5zdGFuY2VPZihVbmlxdWVRdWV1ZSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucGVlaygpKS50by5kZWVwLmVxdWFsKHthOjF9KTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wZWVrKCkpLnRvLmRlZXAuZXF1YWwoe2E6MX0pO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBvbGwoKSkudG8uZGVlcC5lcXVhbCh7YToxfSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucG9sbCgpKS50by5kZWVwLmVxdWFsKHthOjJ9KTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBlZWsoKSkudG8uZGVlcC5lcXVhbCh7YTozfSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucG9sbCgpKS50by5kZWVwLmVxdWFsKHthOjN9KTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdhZGQgYW5kIGNsZWFyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCh7YTogMX0pKS50by5iZS5pbnN0YW5jZU9mKFVuaXF1ZVF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmNsZWFyKCkpLnRvLmJlLmluc3RhbmNlT2YoVW5pcXVlUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuICAgIFxuICAgIGRlc2NyaWJlKCdhZGQgbm8gb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpPT57cXVldWUuYWRkKFtdKX0pLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZCgxKX0pLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZCh0cnVlKX0pLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZCgpfSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICAgICAgZXhwZWN0KCgpPT57cXVldWUuYWRkKFN5bWJvbChcIjFcIikpfSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICAgICAgZXhwZWN0KCgpPT57cXVldWUuYWRkKGZ1bmN0aW9uKCl7fSl9KS50by50aHJvdyhUeXBlRXJyb3IpXG4gICAgICAgIH0pO1xuXG4gICAgfSlcbn0pIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2Jhc2UubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0Jhc2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IEJhc2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2lzIGluc3RhbmNlIG9mIEJhc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2UpLnRvLmJlLmluc3RhbmNlT2YoQmFzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdpcyBpbnN0YW5jZSBvZiBPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2UpLnRvLmJlLmluc3RhbmNlT2YoT2JqZWN0KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG59KSIsICJpbXBvcnQge1xuICAgIGlzUHJpbWl0aXZlLFxuICAgIGlzQm9vbGVhbixcbiAgICBpc1N0cmluZyxcbiAgICBpc09iamVjdCxcbiAgICBpc0FycmF5LFxuICAgIGlzSW5zdGFuY2UsXG4gICAgaXNGdW5jdGlvbixcbiAgICBpc0l0ZXJhYmxlLFxuICAgIGlzSW50ZWdlcixcbiAgICBpc1N5bWJvbFxufSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2lzLm1qc1wiO1xuXG5cbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaWQubWpzXCJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0lzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgbGV0IHByb21pc2VzID0gW11cbiAgICAgICAgaWYoIWdsb2JhbFRoaXNbJ2NyeXB0byddKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbihtID0+IHtcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzWydjcnlwdG8nXSA9IG5ldyBtLkNyeXB0bygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pOyAgICBcbiAgICBcbiAgICBkZXNjcmliZSgnLmlzUHJpbWl0aXZlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIHRydWVdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbbnVsbCwgdHJ1ZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHRydWVdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgdHJ1ZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHRydWVdLFxuICAgICAgICAgICAgWzQuNSwgdHJ1ZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIHRydWVdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdpcy5pc1ByaW1pdGl2ZSgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzUHJpbWl0aXZlKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcbiAgICBkZXNjcmliZSgnLmlzU3ltYm9sKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzU3ltYm9sKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNTeW1ib2woYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5pc0ludGVnZXIoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCBmYWxzZV0sXG4gICAgICAgICAgICBbMiwgdHJ1ZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNJbnRlZ2VyKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNJbnRlZ2VyKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNJdGVyYWJsZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgdHJ1ZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzSXRlcmFibGUoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpc0l0ZXJhYmxlKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNCb29sZWFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNCb29sZWFuKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNCb29sZWFuKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNTdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgdHJ1ZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNTdHJpbmcoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpc1N0cmluZyhhKSkuaXMuZXF1YWwoYilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmlzSW5zdGFuY2UoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbbmV3IElEKCksIElELCAgdHJ1ZV0sXG4gICAgICAgICAgICBbbmV3IElEKCksICgpPT57fSwgIGZhbHNlXSxcbiAgICAgICAgICAgIFsndGVzdDEnLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzSW5zdGFuY2UoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkIHJldHVybiAnICsgdHlwZW9mIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNJbnN0YW5jZShhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBcbiAgICBkZXNjcmliZSgnLmlzT2JqZWN0KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgdHJ1ZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzT2JqZWN0KCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNPYmplY3QoYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnLmlzQXJyYXkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCBmYWxzZV0sXG4gICAgICAgICAgICBbMiwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCB0cnVlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNBcnJheSgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzQXJyYXkoYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmlzRnVuY3Rpb24oKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCB0cnVlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNGdW5jdGlvbignICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzRnVuY3Rpb24oYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiaW1wb3J0IHtJRH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmRlc2NyaWJlKCdJRCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIGlmKCFnbG9iYWxUaGlzWydjcnlwdG8nXSkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpc1snY3J5cHRvJ10gPSBuZXcgbS5DcnlwdG8oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICB9XG5cblxuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG5cbiAgICB9KTsgICAgXG4gICAgXG4gICAgZGVzY3JpYmUoJy50b1N0cmluZygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgaWQgPSBuZXcgSUQoKVxuICAgICAgICBsZXQgcmVzdWx0ID0gaWQudG9TdHJpbmcoKTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLmlzLmEoJ3N0cmluZycpXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IElEKCd0ZXh0MTQyNWlkJykudG9TdHJpbmcoKSkuaXMuZXF1YWwoJ3RleHQxNDI1aWQxJylcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSUQoJ3RleHQxNDI1aWQnKS50b1N0cmluZygpKS5pcy5lcXVhbCgndGV4dDE0MjVpZDInKVxuICAgICAgICAgICAgZXhwZWN0KG5ldyBJRCgndGV4dDE0MjVpZCcpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKCd0ZXh0MTQyNWlkMycpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtpc09iamVjdH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtBYnN0cmFjdENvbnN0cmFpbnR9IGZyb20gXCIuL2Fic3RyYWN0Lm1qc1wiO1xuXG5leHBvcnQge0lzT2JqZWN0fVxuXG4vKipcbiAqIENvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgYnkgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogVGhlIHVuaWZvcm0gQVBJIG9mIHRoZSBjb25zdHJhaW50cyBhbGxvd3MgY2hhaW5zIHRvIGJlIGZvcm1lZC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtJc09iamVjdH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvY29uc3RyYWludHMvaXNvYmplY3QubWpzJztcbiAqIGNvbnNvbGUubG9nKG5ldyBJc09iamVjdCgpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7SXNPYmplY3R9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2NvbnN0cmFpbnRzL2lzb2JqZWN0Lm1qcyc7XG4gKlxuICogbmV3IElzT2JqZWN0KClcbiAqIC5pc1ZhbGlkKHt9KVxuICogLnRoZW4oKCk9PmNvbnNvbGUubG9nKHRydWUpKTtcbiAqIC8vIFx1MjFBNiB0cnVlXG4gKlxuICpcbiAqIG5ldyBJc09iamVjdCgpXG4gKiAuaXNWYWxpZCg5OSlcbiAqIC5jYXRjaChlPT5jb25zb2xlLmxvZyhlKSk7XG4gKiAvLyBcdTIxQTYgOTlcbiAqXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Db25zdHJhaW50c1xuICogQHN1bW1hcnkgQSBjb25zdHJhaW50IHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYW4gb2JqZWN0XG4gKi9cbmNsYXNzIElzT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybiBhIHByb21pc2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHZhbHVlKTtcbiAgICB9XG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi4vdHlwZXMvYmFzZS5tanMnO1xuXG5leHBvcnQge0Fic3RyYWN0Q29uc3RyYWludH1cblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKiBcbiAqIFRoZSBhYnN0cmFjdCBjb25zdHJhaW50IGRlZmluZXMgdGhlIGFwaSBmb3IgYWxsIGNvbnN0cmFpbnRzLiBtYWlubHkgdGhlIG1ldGhvZCBpc1ZhbGlkKCkgaXMgZGVmaW5lZC5cbiAqXG4gKiBkZXJpdmVkIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIG1ldGhvZCBpc1ZhbGlkKCkuXG4gKlxuICogQHNpbmNlIDEuMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuQ29uc3RyYWludHNcbiAqIEBzdW1tYXJ5IFRoZSBhYnN0cmFjdCBjb25zdHJhaW50XG4gKi9cbmNsYXNzIEFic3RyYWN0Q29uc3RyYWludCBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIHByb21pc2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SXNPYmplY3R9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvaXNvYmplY3QubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnSXNPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmlzVmFsaWQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGNvbnN0cmFpbnQgPSBuZXcgSXNPYmplY3QoKVxuXG4gICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSBwcm9taXNlJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuaXNWYWxpZCh7fSkudGhlbihyID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QocikuaXMuYSgnb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJzaG91bGQgbm90IHJlYWNoZWQ6IFwiICsgZSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Fic3RyYWN0Q29uc3RyYWludH0gZnJvbSBcIi4vYWJzdHJhY3QubWpzXCI7XG5cbmV4cG9ydCB7SW52YWxpZH1cblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKlxuICogVGhlIGludmFsaWQgY29uc3RyYWludCBhbGxvd3MgYW4gYWx3YXlzIGludmFsaWQgcXVlcnkgdG8gYmUgcGVyZm9ybWVkLiB0aGlzIGNvbnN0cmFpbnQgaXMgbWFpbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0ludmFsaWR9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzJztcbiAqIG5ldyBJbnZhbGlkKCk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtJbnZhbGlkfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9jb25zdHJhaW50cy9pbnZhbGlkLm1qcyc7XG4gKlxuICogbmV3IEludmFsaWQoKS5pc1ZhbGlkKClcbiAqIC50aGVuKCgpPT5jb25zb2xlLmxvZyh0cnVlKSlcbiAqIC5jYXRjaCgoKT0+Y29uc29sZS5sb2coZmFsc2UpKTtcbiAqIC8vIFx1MjFBNiBmYWxzZVxuICpcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkNvbnN0cmFpbnRzXG4gKiBAc3VtbWFyeSBBIGNvbnN0cmFpbnQgdGhhdCBhbHdheXMgaW52YWxpZFxuICovXG5jbGFzcyBJbnZhbGlkIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybiBhIHJlamVjdGVkIHByb21pc2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7XG4gICAgfVxuXG59XG4iLCAiaW1wb3J0IHtJbnZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnSW52YWxpZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCcuaXNWYWxpZCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgaXN2YWxpZCA9IG5ldyBJbnZhbGlkKClcblxuICAgICAgICBpdCgnc2hvdWxkIHJlc29sdmUgcHJvbWlzZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBpc3ZhbGlkLmlzVmFsaWQoKS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZSkudG8uYmUudW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Fic3RyYWN0Q29uc3RyYWludH0gZnJvbSBcIi4vYWJzdHJhY3QubWpzXCI7XG5cbmV4cG9ydCB7VmFsaWR9XG5cbi8qKlxuICogQ29uc3RyYWludHMgYXJlIHVzZWQgdG8gZGVmaW5lIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBieSB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS5cbiAqXG4gKiBUaGUgdW5pZm9ybSBBUEkgb2YgdGhlIGNvbnN0cmFpbnRzIGFsbG93cyBjaGFpbnMgdG8gYmUgZm9ybWVkLlxuICpcbiAqIFRoZSB2YWxpZCBjb25zdHJhaW50IGFsbG93cyBhbiBhbHdheXMgdmFsaWQgcXVlcnkgdG8gYmUgcGVyZm9ybWVkLiB0aGlzIGNvbnN0cmFpbnQgaXMgbWFpbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge1ZhbGlkfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9jb25zdHJhaW50cy92YWxpZC5tanMnO1xuICogbmV3IFZhbGlkKCk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtWYWxpZH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvY29uc3RyYWludHMvdmFsaWQubWpzJztcbiAqXG4gKiBuZXcgVmFsaWQoKS5pc1ZhbGlkKClcbiAqIC50aGVuKCgpPT5jb25zb2xlLmxvZyh0cnVlKSlcbiAqIC5jYXRjaCgoKT0+Y29uc29sZS5sb2coZmFsc2UpKTtcbiAqIC8vIFx1MjFBNiB0cnVlXG4gKlxuICogQHNpbmNlIDEuMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuQ29uc3RyYWludHNcbiAqIEBzdW1tYXJ5IEEgY29uc3RyYWludCB0aGF0IGFsd2F5cyB2YWxpZFxuICovXG5jbGFzcyBWYWxpZCBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm4gYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgaXNWYWxpZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTtcbiAgICB9XG5cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Fic3RyYWN0Q29uc3RyYWludH0gZnJvbSBcIi4vYWJzdHJhY3QubWpzXCI7XG5cbmV4cG9ydCB7QWJzdHJhY3RPcGVyYXRvcn1cblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKlxuICogT3BlcmF0b3JzIGFsbG93IHlvdSB0byBsaW5rIGNvbnN0cmFpbnRzIHRvZ2V0aGVyLiBmb3IgZXhhbXBsZSwgeW91IGNhbiBjaGVjayB3aGV0aGVyIGEgdmFsdWUgaXMgYW4gb2JqZWN0IG9yIGFuIGFycmF5LiBlYWNoIG9wZXJhdG9yIGhhcyB0d28gb3BlcmFuZHMgdGhhdCBhcmUgbGlua2VkIHRvZ2V0aGVyLlxuICpcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkNvbnN0cmFpbnRzXG4gKiBAc3VtbWFyeSBUaGUgYWJzdHJhY3Qgb3BlcmF0b3IgY29uc3RyYWludFxuICovXG5jbGFzcyBBYnN0cmFjdE9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBYnN0cmFjdENvbnN0cmFpbnR9IG9wZXJhbnRBXG4gICAgICogQHBhcmFtIHtBYnN0cmFjdENvbnN0cmFpbnR9IG9wZXJhbnRCXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSBcInBhcmFtZXRlcnMgbXVzdCBiZSBmcm9tIHR5cGUgQWJzdHJhY3RDb25zdHJhaW50XCJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcGVyYW50QSwgb3BlcmFudEIpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAoIShvcGVyYW50QSBpbnN0YW5jZW9mIEFic3RyYWN0Q29uc3RyYWludCkgfHwgIShvcGVyYW50QiBpbnN0YW5jZW9mIEFic3RyYWN0Q29uc3RyYWludCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJwYXJhbWV0ZXJzIG11c3QgYmUgZnJvbSB0eXBlIEFic3RyYWN0Q29uc3RyYWludFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcGVyYW50QSA9IG9wZXJhbnRBO1xuICAgICAgICB0aGlzLm9wZXJhbnRCID0gb3BlcmFudEI7XG5cbiAgICB9XG5cblxufVxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtBYnN0cmFjdE9wZXJhdG9yfSBmcm9tIFwiLi9hYnN0cmFjdG9wZXJhdG9yLm1qc1wiO1xuXG5leHBvcnQge0FuZE9wZXJhdG9yfVxuXG4vKipcbiAqIENvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgYnkgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogVGhlIHVuaWZvcm0gQVBJIG9mIHRoZSBjb25zdHJhaW50cyBhbGxvd3MgY2hhaW5zIHRvIGJlIGZvcm1lZC5cbiAqXG4gKiBUaGUgQW5kT3BlcmF0b3IgaXMgdXNlZCB0byBsaW5rIHNldmVyYWwgY29udHJhaW50cy4gVGhlIGNvbnN0cmFpbnQgaXMgZnVsZmlsbGVkIGlmIGFsbCBjb25zdHJhaW50cyBvZiB0aGUgb3BlcmF0b3JzIGFyZSBmdWxmaWxsZWQuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7QW5kT3BlcmF0b3J9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2NvbnN0cmFpbnRzL2FuZG9wZXJhdG9yLm1qcyc7XG4gKiBuZXcgQW5kT3BlcmF0b3IoKTtcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQge1ZhbGlkfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9jb25zdHJhaW50cy92YWxpZC5tanMnO1xuICogaW1wb3J0IHtJbnZhbGlkfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9jb25zdHJhaW50cy9pbnZhbGlkLm1qcyc7XG4gKiBpbXBvcnQge0FuZE9wZXJhdG9yfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9jb25zdHJhaW50cy9hbmRvcGVyYXRvci5tanMnO1xuICpcbiAqIG5ldyBBbmRPcGVyYXRvcihcbiAqIG5ldyBWYWxpZCgpLCBuZXcgVmFsaWQoKSkuaXNWYWxpZCgpXG4gKiAudGhlbigoKT0+Y29uc29sZS5sb2codHJ1ZSkpXG4gKiAuY2F0Y2goKCk9PmNvbnNvbGUubG9nKGZhbHNlKSk7XG4gKiAvLyBcdTIxQTYgdHJ1ZVxuICpcbiAqIG5ldyBBbmRPcGVyYXRvcihcbiAqIG5ldyBJbnZhbGlkKCksIG5ldyBWYWxpZCgpKS5pc1ZhbGlkKClcbiAqIC50aGVuKCgpPT5jb25zb2xlLmxvZyh0cnVlKSlcbiAqIC5jYXRjaCgoKT0+Y29uc29sZS5sb2coZmFsc2UpKTtcbiAqIC8vIFx1MjFBNiBmYWxzZVxuICpcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkNvbnN0cmFpbnRzXG4gKiBAc3VtbWFyeSBBIGFuZCBvcGVyYXRvciBjb25zdHJhaW50XG4gKi9cbmNsYXNzIEFuZE9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRvciB7XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm4gYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgaXNWYWxpZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMub3BlcmFudEEuaXNWYWxpZCh2YWx1ZSksIHRoaXMub3BlcmFudEIuaXNWYWxpZCh2YWx1ZSldKTtcbiAgICB9XG5cbn1cbiIsICJpbXBvcnQge1ZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL3ZhbGlkLm1qc1wiO1xuaW1wb3J0IHtJbnZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzXCI7XG5pbXBvcnQge0FuZE9wZXJhdG9yfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2FuZG9wZXJhdG9yLm1qc1wiO1xuXG5kZXNjcmliZSgnQW5kT3BlcmF0b3InLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmlzVmFsaWQoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbbmV3IFZhbGlkKCksIG5ldyBWYWxpZCgpLCB0cnVlXSxcbiAgICAgICAgICAgIFtuZXcgVmFsaWQoKSwgbmV3IEludmFsaWQoKSwgZmFsc2VdLFxuICAgICAgICAgICAgW25ldyBJbnZhbGlkKCksIG5ldyBWYWxpZCgpLCBmYWxzZV0sXG4gICAgICAgICAgICBbbmV3IEludmFsaWQoKSwgbmV3IEludmFsaWQoKSwgZmFsc2VdXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdjb25zdHJhaW50LmlzVmFsaWQoKSBzaG91bGQgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGNvbnN0cmFpbnQgPSBuZXcgQW5kT3BlcmF0b3IoYSwgYik7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludC5pc1ZhbGlkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMgPT09IHRydWUgPyBkb25lKCkgOiBkb25lKG5ldyBFcnJvcigpKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMgPT09IHRydWUgPyBkb25lKG5ldyBFcnJvcigpKSA6IGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Fic3RyYWN0T3BlcmF0b3J9IGZyb20gXCIuL2Fic3RyYWN0b3BlcmF0b3IubWpzXCI7XG5cbmV4cG9ydCB7T3JPcGVyYXRvcn1cblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKlxuICogVGhlIE9yT3BlcmF0b3IgaXMgdXNlZCB0byBsaW5rIHNldmVyYWwgY29uc3RyYWludHMuIFRoZSBjb25zdHJhaW50IGlzIGZ1bGZpbGxlZCBpZiBvbmUgb2YgdGhlIGNvbnN0cmFpbnRzIGlzIGZ1bGZpbGxlZC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtPck9wZXJhdG9yfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9jb25zdHJhaW50L29yb3BlcmF0b3IubWpzJztcbiAqIG5ldyBPck9wZXJhdG9yKCk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtWYWxpZH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvY29uc3RyYWludHMvdmFsaWQubWpzJztcbiAqIGltcG9ydCB7SW52YWxpZH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvY29uc3RyYWludHMvaW52YWxpZC5tanMnO1xuICogaW1wb3J0IHtPck9wZXJhdG9yfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9jb25zdHJhaW50cy9vcm9wZXJhdG9yLm1qcyc7XG4gKlxuICogbmV3IE9yT3BlcmF0b3IoXG4gKiBuZXcgVmFsaWQoKSwgbmV3IEludmFsaWQoKSkuaXNWYWxpZCgpXG4gKiAudGhlbigoKT0+Y29uc29sZS5sb2codHJ1ZSkpXG4gKiAuY2F0Y2goKCk9PmNvbnNvbGUubG9nKGZhbHNlKSk7XG4gKiAvLyBcdTIxQTYgdHJ1ZVxuICpcbiAqIG5ldyBPck9wZXJhdG9yKFxuICogbmV3IEludmFsaWQoKSwgbmV3IEludmFsaWQoKSkuaXNWYWxpZCgpXG4gKiAudGhlbigoKT0+Y29uc29sZS5sb2codHJ1ZSkpXG4gKiAuY2F0Y2goKCk9PmNvbnNvbGUubG9nKGZhbHNlKSk7XG4gKiAvLyBcdTIxQTYgZmFsc2VcbiAqXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Db25zdHJhaW50c1xuICogQHN1bW1hcnkgQSBvciBvcGVyYXRvciBcbiAqL1xuY2xhc3MgT3JPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0T3BlcmF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJuIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGlzVmFsaWQodmFsdWUpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBsZXQgYSwgYjtcblxuICAgICAgICAgICAgc2VsZi5vcGVyYW50QS5pc1ZhbGlkKHZhbHVlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLyoqIGIgaGFzIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQgYW5kIHdhcyBub3QgdHJ1ZSAqL1xuICAgICAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2VsZi5vcGVyYW50Qi5pc1ZhbGlkKHZhbHVlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBiID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLyoqIGIgaGFzIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQgYW5kIHdhcyBub3QgdHJ1ZSAqL1xuICAgICAgICAgICAgICAgIGlmIChhID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbn1cbiIsICJpbXBvcnQge1ZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL3ZhbGlkLm1qc1wiO1xuaW1wb3J0IHtJbnZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzXCI7XG5pbXBvcnQge09yT3BlcmF0b3J9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvb3JvcGVyYXRvci5tanNcIjtcblxuZGVzY3JpYmUoJ09yT3BlcmF0b3InLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmlzVmFsaWQoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbbmV3IFZhbGlkKCksIG5ldyBWYWxpZCgpLCB0cnVlXSxcbiAgICAgICAgICAgIFtuZXcgVmFsaWQoKSwgbmV3IEludmFsaWQoKSwgdHJ1ZV0sXG4gICAgICAgICAgICBbbmV3IEludmFsaWQoKSwgbmV3IFZhbGlkKCksIHRydWVdLFxuICAgICAgICAgICAgW25ldyBJbnZhbGlkKCksIG5ldyBJbnZhbGlkKCksIGZhbHNlXVxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnY29uc3RyYWludC5pc1ZhbGlkKCkgc2hvdWxkIHJldHVybiAnICsgYywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBjb25zdHJhaW50ID0gbmV3IE9yT3BlcmF0b3IoYSwgYik7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludC5pc1ZhbGlkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMgPT09IHRydWUgPyBkb25lKCkgOiBkb25lKG5ldyBFcnJvcigpKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMgPT09IHRydWUgPyBkb25lKG5ldyBFcnJvcigpKSA6IGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2lzQXJyYXl9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7QWJzdHJhY3RDb25zdHJhaW50fSBmcm9tIFwiLi9hYnN0cmFjdC5tanNcIjtcblxuZXhwb3J0IHtJc0FycmF5fVxuXG4vKipcbiAqIENvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgYnkgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuXG4gKiBcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKiBcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0lzQXJyYXl9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2NvbnN0cmFpbnRzL2lzYXJyYXkubWpzJztcbiAqIGNvbnNvbGUubG9nKG5ldyBJc0FycmF5KCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHtJc0FycmF5fSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9jb25zdHJhaW50cy9pc2FycmF5Lm1qcyc7XG4gKlxuICogbmV3IElzQXJyYXkoKVxuICogLmlzVmFsaWQoW10pXG4gKiAudGhlbigoKT0+Y29uc29sZS5sb2codHJ1ZSkpO1xuICogLy8gXHUyMUE2IHRydWVcbiAqXG4gKiBuZXcgSXNBcnJheSgpXG4gKiAuaXNWYWxpZCg5OSlcbiAqIC5jYXRjaChlPT5jb25zb2xlLmxvZyhlKSk7XG4gKiAvLyBcdTIxQTYgOTlcbiAqXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Db25zdHJhaW50c1xuICogQHN1bW1hcnkgQSBjb25zdHJhaW50IHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYW4gYXJyYXlcbiAqL1xuY2xhc3MgSXNBcnJheSBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm4gYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgaXNWYWxpZCh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHZhbHVlKTtcbiAgICB9XG5cbn1cbiIsICJpbXBvcnQge0lzQXJyYXl9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvaXNhcnJheS5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdJc0FycmF5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5pc1ZhbGlkKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBjb25zdHJhaW50ID0gbmV3IElzQXJyYXkoKVxuXG4gICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSBwcm9taXNlJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuaXNWYWxpZChbMSwyLDNdKS50aGVuKHIgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChyKS5pcy5hKCdhcnJheScpO1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKFwic2hvdWxkIG5vdCByZWFjaGVkOiBcIiArIGUpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiaW1wb3J0IHtWYWxpZH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9jb25zdHJhaW50cy92YWxpZC5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdWYWxpZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCcuaXNWYWxpZCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgY29uc3RyYWludCA9IG5ldyBWYWxpZCgpXG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXNvbHZlIHByb21pc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3RyYWludC5pc1ZhbGlkKHt9KS50aGVuKHIgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKFwic2hvdWxkIG5vdCByZWFjaGVkOiBcIiArIGUpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7dHJpbVNwYWNlc30gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL3RyaW1zcGFjZXMubWpzXCI7XG5cblxuZGVzY3JpYmUoJ3RyaW1TcGFjZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgW1xuICAgICAgICAvLyBvbmUgc3Ryb2tlIGlzIGVzY3BlZCBieSB0aGUgamF2YXNjcmlwdCBpbnRlcnByZXRlciwgdGhlIHNlY29uZCBzdHJva2UgZXNjYXBlcyB0aGUgc3Ryb2tlXG4gICAgICAgIFsnIHZhbHVlICcsICd2YWx1ZSddLFxuICAgICAgICBbJyB2YWx1ZVxcXFwgJywgJ3ZhbHVlXFxcXCAnXSxcbiAgICAgICAgWydcXFxcIHZhbHVlXFxcXCAnLCAnXFxcXCB2YWx1ZVxcXFwgJ10sXG4gICAgICAgIFsnXFwgdmFsdWVcXCAnLCAndmFsdWUnXSwgICBcbiAgICAgICAgW1wiICAgdmFsdWUgXFwgXCIsICd2YWx1ZSddLCBcblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgaXQoJ3RyaW1TcGFjZXMoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkIHJldHVybiAnICsgSlNPTi5zdHJpbmdpZnkoYiksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCh0cmltU3BhY2VzKGEpKS50by5iZS5lcXVhbChiKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiAgICAiLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7aXNJbnRlZ2VyfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlRnVuY3Rpb24sIHZhbGlkYXRlSW50ZWdlcn0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge0RlYWRNYW5zU3dpdGNofVxuXG4vKipcbiAqIFRoZSBkZWFkIG1hbidzIHN3aXRjaCBhbGxvd3MgdG8gc2V0IGEgdGltZXIgd2hpY2ggY2FuIGJlIHJlc2V0IGFnYWluIGFuZCBhZ2FpbiB3aXRoaW4gYSBkZWZpbmVkIHBlcmlvZCBvZiB0aW1lLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0RlYWRNYW5zU3dpdGNofSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS91dGlsL2RlYWRtYW5zc3dpdGNoLm1qcyc7XG4gKiBuZXcgRGVhZE1hbnNTd2l0Y2goKTtcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7RGVhZE1hbnNTd2l0Y2h9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL3V0aWwvZGVhZG1hbnNzd2l0Y2gubWpzJztcbiAqXG4gKiBjb25zdCBkZWFkbWFuc3N3aXRjaCA9IG5ldyBEZWFkTWFuc1N3aXRjaCgxMDAsICgpPT57XG4gKiAgIGNvbnNvbGUubG9nKCd5ZWFoIScpXG4gKiAgIC8vIFx1MjFBNiBcInllYWghXCJcbiAqIH0pXG4gKlxuICogZGVhZG1hbnNzd2l0Y2gudG91Y2goKTsgLy8gZnJvbSBoZXJlIHdhaXQgYWdhaW4gMTAwIG1zXG4gKiBkZWFkbWFuc3N3aXRjaC50b3VjaCgyMDApOyAvLyBmcm9tIGhlcmUgd2FpdCAyMDAgbXNcbiAqXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQHNpbmNlIDEuMjkuMFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVXRpbFxuICogQHN1bW1hcnkgQ2xhc3MgdG8gYmUgYWJsZSB0byBleGVjdXRlIGZ1bmN0aW9uIGNoYWluc1xuICovXG4gY2xhc3MgRGVhZE1hbnNTd2l0Y2ggZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBuZXcgZGVhZCBtYW4ncyBzd2l0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gZGVsYXlcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEB0aHJvdyB7VHlwZUVycm9yfSB0aGUgYXJndW1lbnRzIG11c3QgYmUgZWl0aGVyIGludGVnZXIgb3IgZnVuY3Rpb25zXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRlbGF5LCBjYWxsYmFjaykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGluaXQuY2FsbCh0aGlzLCB2YWxpZGF0ZUludGVnZXIoZGVsYXkpLCB2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ8dW5kZWZpbmVkfSBbZGVsYXldXG4gICAgICovXG4gICAgdG91Y2goZGVsYXkpIHtcblxuICAgICAgICBpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF1bJ2lzQWxyZWFkeVJ1biddID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhcyBhbHJlYWR5IHJ1bicpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNJbnRlZ2VyKGRlbGF5KSkge1xuICAgICAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF1bJ2RlbGF5J10gPSBkZWxheVxuICAgICAgICB9IGVsc2UgaWYgKGRlbGF5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgYXJndW1lbnQnKVxuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXNbaW50ZXJuYWxTeW1ib2xdWyd0aW1lciddKTtcblxuICAgICAgICBpbml0Q2FsbGJhY2suY2FsbCh0aGlzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdENhbGxiYWNrKCkge1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBzZWxmW2ludGVybmFsU3ltYm9sXVsndGltZXInXSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZWxmW2ludGVybmFsU3ltYm9sXVsnaXNBbHJlYWR5UnVuJ10gPSB0cnVlO1xuICAgICAgICBzZWxmW2ludGVybmFsU3ltYm9sXVsnY2FsbGJhY2snXSgpO1xuICAgIH0sIHNlbGZbaW50ZXJuYWxTeW1ib2xdWydkZWxheSddKVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGRlbGF5XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5mdW5jdGlvbiBpbml0KGRlbGF5LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgc2VsZltpbnRlcm5hbFN5bWJvbF0gPSB7XG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgICBkZWxheSxcbiAgICAgICAgaXNBbHJlYWR5UnVuOiBmYWxzZSxcbiAgICAgICAgdGltZXI6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICBpbml0Q2FsbGJhY2suY2FsbChzZWxmKTtcblxufVxuXG5cblxuIiwgImltcG9ydCB7RGVhZE1hbnNTd2l0Y2h9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9kZWFkbWFuc3N3aXRjaC5tanNcIjtcblxuXG5kZXNjcmliZSgnRGVhZE1hbnNTd2l0Y2gnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgncnVuIGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgY29uc3QgbXMxID0gIERhdGUubm93KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlYWRtYW5zc3dpdGNoID0gbmV3IERlYWRNYW5zU3dpdGNoKDEwMCwgKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbXMyID0gIERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gbXMyIC0gbXMxO1xuICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoJ3RvIHNob3J0ICcgKyBkaWZmKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncnVuIGluc3RhbmNlIGFuZCB0b3VjaCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1bicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IG1zMSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlYWRtYW5zc3dpdGNoID0gbmV3IERlYWRNYW5zU3dpdGNoKDEwMCwgKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbXMyID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBtczIgLSBtczE7XG5cbiAgICAgICAgICAgICAgICBpZiAobXMxID4gbXMyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoJ3RpbWluZyBlcnJvcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRpZmYgPCA2MDApIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgndG8gc2hvcnQgJyArIGRpZmYpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIC8vICAgMCBtczogaW5pdCgpIC0+IHdhaXQgMTAwIG1zIFxuICAgICAgICAgICAgLy8gIDUwIG1zOiB0b3VjaCgpIC0+IHdhaXQgMTAwIG1zXG4gICAgICAgICAgICAvLyAgICAgICAgICAtPiB3YWl0IDEwMFxuICAgICAgICAgICAgLy8gMTAwIG1zOiB0b3VjaCg1MDApIC0+IHdhaXQgNTAwIG1zXG4gICAgICAgICAgICAvLyAgICAgICAgICAtPiB3YWl0IDUwMFxuICAgICAgICAgICAgLy8gNjAwIG1zOiBleGVjdXRlIGNhbGxiYWNrXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBkZWFkbWFuc3N3aXRjaC50b3VjaCgpXG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVhZG1hbnNzd2l0Y2gudG91Y2goNTAwKVxuICAgICAgICAgICAgICAgIH0sIDUwKVxuXG4gICAgICAgICAgICB9LCA1MClcblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSAnLi4vdHlwZXMvdmFsaWRhdGUubWpzJztcblxuZXhwb3J0IHtkZWVwRnJlZXplfVxuXG4vKipcbiAqIERlZXAgZnJlZXplIGEgb2JqZWN0XG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7ZGVlcEZyZWV6ZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdXRpbC9mcmVlemUubWpzJztcbiAqIGRlZXBGcmVlemUoe30pXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3Qgb2JqZWN0IHRvIGJlIGZyZWV6ZVxuICogQHNpbmNlIDEuMC4wXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICogQG1lbWJlck9mIE1vbnN0ZXIuVXRpbFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gKi9cbiBmdW5jdGlvbiBkZWVwRnJlZXplKG9iamVjdCkge1xuXG4gICAgdmFsaWRhdGVPYmplY3Qob2JqZWN0KVxuXG4gICAgLy8gUmV0cmlldmUgdGhlIGRlZmluZWQgcHJvcGVydHkgbmFtZXMgb2YgdGhlIG9iamVjdFxuICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmplY3QpO1xuXG4gICAgLy8gRnJlZXplIHByb3BlcnRpZXMgYmVmb3JlIGZyZWV6aW5nIHlvdXJzZWxmXG4gICAgZm9yIChsZXQgbmFtZSBvZiBwcm9wTmFtZXMpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gb2JqZWN0W25hbWVdO1xuXG4gICAgICAgIG9iamVjdFtuYW1lXSA9ICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpID9cbiAgICAgICAgICAgIGRlZXBGcmVlemUodmFsdWUpIDogdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUob2JqZWN0KTtcbn1cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtkZWVwRnJlZXplfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3V0aWwvZnJlZXplLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdkZWVwRnJlZXplJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ2RlZXBGcmVlemUgYW4gb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZnJlZXplIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IG9iajEgPSB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjOjFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBvYmoyID0ge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYzoyXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBleHBlY3Qob2JqMikudG8ubm90LmVxbChvYmoxKVxuICAgICAgICAgICAgb2JqMS5hLmIuYyA9IDI7XG4gICAgICAgICAgICBleHBlY3Qob2JqMikudG8uZXFsKG9iajEpO1xuXG4gICAgICAgICAgICBjb25zdCBvYmoxRnJlZXplZCA9IGRlZXBGcmVlemUob2JqMSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChvYmoyKS50by5lcWwob2JqMUZyZWV6ZWQpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RlL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9mcmVlemVcbiAgICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UgdG8gdGhlIG9iamVjdCwgZXhjZXB0aW9uIGRlcGVuZHMgb24gbW9kZSAoc3RyaWN0IEVTIDIwMTUsIGV0YylcbiAgICAgICAgICAgICAgICBvYmoxRnJlZXplZC5hLmIuYyA9IDMgICAgXG4gICAgICAgICAgICB9IGNhdGNoIChfKSB7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhwZWN0KG9iajIpLnRvLmVxbChvYmoxRnJlZXplZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pOyIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcbmltcG9ydCB7aXNGdW5jdGlvbn0gZnJvbSAnLi4vdHlwZXMvaXMubWpzJztcblxuZXhwb3J0IHtDb21wYXJhdG9yfVxuXG4vKipcbiAqIFRoZSBjb21wYXJhdG9yIGFsbG93cyBhIGNvbXBhcmlzb24gZnVuY3Rpb24gdG8gYmUgYWJzdHJhY3RlZC5cbiAqIFxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Q29tcGFyYXRvcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdXRpbC9jb21wYXJhdG9yLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhuZXcgQ29tcGFyYXRvcigpKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGFyZSBzb21lIGV4YW1wbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgY2xhc3MuXG4gKlxuICogYGBgXG4gKiBuZXcgQ29tcGFyYXRvcigpLmxlc3NUaGFuT3JFcXVhbCgyLCA1KSAvLyBcdTIxQTYgdHJ1ZVxuICogbmV3IENvbXBhcmF0b3IoKS5ncmVhdGVyVGhhbig0LCAyKSAvLyBcdTIxQTYgdHJ1ZVxuICogbmV3IENvbXBhcmF0b3IoKS5lcXVhbCg0LCA0KSAvLyBcdTIxQTYgdHJ1ZVxuICogbmV3IENvbXBhcmF0b3IoKS5lcXVhbCg0LCA1KSAvLyBcdTIxQTYgZmFsc2VcbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gYWxzbyBwYXNzIHlvdXIgb3duIGNvbXBhcmlzb24gZnVuY3Rpb24sIGFuZCB0aHVzIGRlZmluZSB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBgYGBcbiAqIG5ldyBDb21wYXJhdG9yKGZ1bmN0aW9uIChhLCBiKSB7XG4gKiAgICAgIGlmIChhLnYgPT09IGIudikgcmV0dXJuIDA7XG4gKiAgICAgICAgIHJldHVybiBhLnYgPCBiLnYgPyAtMSA6IDE7XG4gKiAgICAgIH0pLmVxdWFsKHt2OiAyfSwge3Y6IDJ9KTsgIC8vIFx1MjFBNiB0cnVlXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7Q29tcGFyYXRvcn0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdXRpbC9jb21wYXJhdG9yLm1qcyc7XG4gKlxuICogY29uc29sZS5sb2cobmV3IENvbXBhcmF0b3IoKS5sZXNzVGhhbk9yRXF1YWwoMiwgNSkpXG4gKiAvLyBcdTIxQTYgdHJ1ZVxuICogY29uc29sZS5sb2cobmV3IENvbXBhcmF0b3IoKS5ncmVhdGVyVGhhbig0LCAyKSlcbiAqIC8vIFx1MjFBNiB0cnVlXG4gKiBjb25zb2xlLmxvZyhuZXcgQ29tcGFyYXRvcigpLmVxdWFsKDQsIDQpKVxuICogLy8gXHUyMUE2IHRydWVcbiAqIGNvbnNvbGUubG9nKG5ldyBDb21wYXJhdG9yKCkuZXF1YWwoNCwgNSkpXG4gKiAvLyBcdTIxQTYgZmFsc2VcbiAqXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlV0aWxcbiAqL1xuY2xhc3MgQ29tcGFyYXRvciBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogY3JlYXRlIG5ldyBjb21wYXJhdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge01vbnN0ZXIuVXRpbH5leGFtcGxlQ2FsbGJhY2t9IFtjYWxsYmFja10gQ29tcGFyYXRvciBjYWxsYmFja1xuICAgICAqIEB0aHJvdyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gICAgICogQHRocm93IHtUeXBlRXJyb3J9IGltcHJhY3RpY2FsIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgdGhpcy5jb21wYXJlID0gY2FsbGJhY2tcbiAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgdHlwZVwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCBjb21wYXJlIGZ1bmN0aW9uXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Kn0gYVxuICAgICAgICAgICAgICogQHBhcmFtIHsqfSBiXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSAtMSwgMCBvciAxXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuY29tcGFyZSA9IGZ1bmN0aW9uIChhLCBiKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJpbXByYWN0aWNhbCBjb21wYXJpc29uXCIsIFwidHlwZXMvY29tcGFyYXRvci5tanNcIilcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiAxO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY2hhbmdlcyB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdG9yc1xuICAgICAqXG4gICAgICogQHJldHVybiB7Q29tcGFyYXRvcn1cbiAgICAgKi9cbiAgICByZXZlcnNlKCkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMuY29tcGFyZTtcbiAgICAgICAgdGhpcy5jb21wYXJlID0gKGEsIGIpID0+IG9yaWdpbmFsKGIsIGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdHdvIHZhcmlhYmxlcyBhcmUgZXF1YWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFcbiAgICAgKiBAcGFyYW0geyp9IGJcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgZXF1YWwoYSwgYikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKGEsIGIpID09PSAwO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZhcmlhYmxlIGBhYCBpcyBncmVhdGVyIHRoYW4gYGJgXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFcbiAgICAgKiBAcGFyYW0geyp9IGJcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ3JlYXRlclRoYW4oYSwgYikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKGEsIGIpID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdmFyaWFibGUgYGFgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgYmBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYVxuICAgICAqIEBwYXJhbSB7Kn0gYlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBncmVhdGVyVGhhbk9yRXF1YWwoYSwgYikge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmVhdGVyVGhhbihhLCBiKSB8fCB0aGlzLmVxdWFsKGEsIGIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB2YXJpYWJsZSBgYWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBiYFxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSBhXG4gICAgICogQHBhcmFtIHsqfSBiXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGxlc3NUaGFuT3JFcXVhbChhLCBiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlc3NUaGFuKGEsIGIpIHx8IHRoaXMuZXF1YWwoYSwgYik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZhcmlhYmxlIGEgaXMgbGVzcyB0aGFuIGJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYVxuICAgICAqIEBwYXJhbSB7Kn0gYlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBsZXNzVGhhbihhLCBiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUoYSwgYikgPCAwO1xuICAgIH1cblxuXG59XG5cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIG9wZXJhdG9yXG4gKlxuICogYGBgXG4gKiBuZXcgQ29tcGFyYXRvcihmdW5jdGlvbiAoYSwgYikge1xuICogICAgICBpZiAoYS52ID09PSBiLnYpIHJldHVybiAwO1xuICogICAgICAgICByZXR1cm4gYS52IDwgYi52ID8gLTEgOiAxO1xuICogICAgICB9KS5lcXVhbCh7djogMn0sIHt2OiAyfSk7ICAvLyBcdTIxQTYgdHJ1ZVxuICogYGBgXG4gKlxuICogQGNhbGxiYWNrIE1vbnN0ZXIuVXRpbH5leGFtcGxlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtpbnRlZ2VyfSAtMSwgMCBvciAxXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5VdGlsXG4gKiBAc2VlIE1vbnN0ZXIuVXRpbC5Db21wYXJhdG9yXG4gKi9cblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0NvbXBhcmF0b3J9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9jb21wYXJhdG9yLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdDb21wYXJhdG9yJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZSBuZXcgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBjb21wYXJhdG9yIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpKS50by5iZS5hKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBjb21wYXJhdG9yIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB9KSkudG8uYmUuYSgnb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgVHlwZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBDb21wYXJhdG9yKHRydWUpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgQ29tcGFyYXRvcihcInRlc3RcIikpLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdlcXVhbCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBcInRlc3RcIiwgZmFsc2VdLFxuICAgICAgICAgICAgWzUuMSwgNSwgZmFsc2VdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCB0cnVlXSxcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbLTQsIC00LCB0cnVlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmVxdWFsKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZXF1YWwoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgdHJ1ZV0sXG4gICAgICAgICAgICBbJ3Rlc3QxJywgNV0sXG4gICAgICAgICAgICBbJ3Rlc3QxJywgbnVsbF0sXG4gICAgICAgICAgICBbJ3Rlc3QxJywgcGFyc2VJbnQoXCJhXCIpXSxcbiAgICAgICAgICAgIFtmYWxzZSwgNV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBudWxsXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGNvbXBhcmUgJyArIGEgKyAnIGFuZCAnICsgYiArICcgdGhyb3cgVHlwZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgQ29tcGFyYXRvcigpLmVxdWFsKGEsIGIpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ3JlYXRlclRoYW4oKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgXCJ0ZXN0XCIsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNS4xLCA1LjEsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFstNCwgLTQsIGZhbHNlXSxcbiAgICAgICAgICAgIFstNCwgNCwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGNvbXBhcmUgJyArIGEgKyAnIGFuZCAnICsgYiArICcgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkuZ3JlYXRlclRoYW4oYSwgYikpLmlzLmVxdWFsKGMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdyZXZlcnNlKCkuZ3JlYXRlclRoYW4oKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgXCJ0ZXN0XCIsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNS4xLCA1LjEsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFstNCwgLTQsIGZhbHNlXSxcbiAgICAgICAgICAgIFstNCwgNCwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGNvbXBhcmUgJyArIGEgKyAnIGFuZCAnICsgYiArICcgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkucmV2ZXJzZSgpLmdyZWF0ZXJUaGFuKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ3JlYXRlclRoYW5PckVxdWFsKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCB0cnVlXSxcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbLTQsIC00LCB0cnVlXSxcbiAgICAgICAgICAgIFstNCwgNCwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGNvbXBhcmUgJyArIGEgKyAnIGFuZCAnICsgYiArICcgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkuZ3JlYXRlclRoYW5PckVxdWFsKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbGVzc1RoYW4oKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgXCJ0ZXN0XCIsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNS4xLCA1LjEsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFstNCwgLTQsIGZhbHNlXSxcbiAgICAgICAgICAgIFstNCwgNCwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGNvbXBhcmUgJyArIGEgKyAnIGFuZCAnICsgYiArICcgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkubGVzc1RoYW4oYSwgYikpLmlzLmVxdWFsKGMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdkb2N1bWVudGF0aW9ucycsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIC4uLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmxlc3NUaGFuT3JFcXVhbCgyLCA1KSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmdyZWF0ZXJUaGFuKDQsIDIpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkuZXF1YWwoNCwgNCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKS5lcXVhbCg0LCA1KSkudG8uYmUuZmFsc2U7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBydW4gd2l0aCBvd24gZnVuY3Rpb24gLi4uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGEudiA9PT0gYi52KSByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS52IDwgYi52ID8gLTEgOiAxO1xuICAgICAgICAgICAgfSkuZXF1YWwoe3Y6IDJ9LCB7djogMn0pKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdsZXNzVGhhbk9yRXF1YWwoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgXCJ0ZXN0XCIsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNS4xLCA1LjEsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHRydWUsIHRydWVdLFxuICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlLCB0cnVlXSxcbiAgICAgICAgICAgIFstNCwgLTQsIHRydWVdLFxuICAgICAgICAgICAgWy00LCA0LCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgY29tcGFyZSAnICsgYSArICcgYW5kICcgKyBiICsgJyByZXR1cm4gJyArIGMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKS5sZXNzVGhhbk9yRXF1YWwoYSwgYikpLmlzLmVxdWFsKGMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtjbG9uZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL2Nsb25lLm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ0Nsb25lJywgZnVuY3Rpb24gKCkge1xuXG4gICAgY2xhc3MgQSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGIpIHtcbiAgICAgICAgICAgIHRoaXMuYiA9IGJcbiAgICAgICAgfVxuXG4gICAgICAgIGEoKSB7XG5cbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjbGFzcyBCIHtcbiAgICAgICAgY29uc3RydWN0b3IoYikge1xuICAgICAgICAgICAgdGhpcy5iID0gYlxuICAgICAgICB9XG5cbiAgICAgICAgYSgpIHtcblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBnZXRDbG9uZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIkRPTkVcIlxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cblxuICAgIGRlc2NyaWJlKCcuY2xvbmUoQikgd2l0aCBnZXRDbG9uZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJy5jbG9uZShCKSBzaG91bGQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGIgPSBuZXcgQih7XG4gICAgICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICAgICAgICB5OiAxLCBkOiBuZXcgQSgxKSwgejogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgciA9IGNsb25lKGIpO1xuICAgICAgICAgICAgZXhwZWN0KGIpLnRvLmJlLmluc3RhbmNlT2YoQilcbiAgICAgICAgICAgIGV4cGVjdChyKS5ub3QuZXF1YWwoYik7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkocikpLmVxdWFsKEpTT04uc3RyaW5naWZ5KCdET05FJykpO1xuXG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgXG4gICAgZGVzY3JpYmUoJy5jbG9uZShBKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJy5jbG9uZShBKSBzaG91bGQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGEgPSBuZXcgQSh7XG4gICAgICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICAgICAgICB5OiAxLCBkOiBuZXcgQSgxKSwgejogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgYiA9IGNsb25lKGEpO1xuICAgICAgICAgICAgZXhwZWN0KGEpLnRvLmJlLmluc3RhbmNlT2YoQSlcbiAgICAgICAgICAgIGV4cGVjdChiKS50by5iZS5pbnN0YW5jZU9mKEEpXG4gICAgICAgICAgICBleHBlY3QoYikubm90LmVxdWFsKGEpO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGEpKS5lcXVhbChKU09OLnN0cmluZ2lmeShiKSk7XG5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIC8vIG5vZGVqcyBkb2VzIG5vdCBoYXZlIGEgRE9NXG4gICAgaWYgKHR5cGVvZiBEb2N1bWVudEZyYWdtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGRlc2NyaWJlKCcuY2xvbmUoRG9jdW1lbnRGcmFnbWVudCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnLmNsb25lKERvY3VtZW50RnJhZ21lbnQpIHNob3VsZCBzYW1lIERvY3VtZW50RnJhZ21lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICAgICAgbGV0IGIgPSBjbG9uZShhKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoYikuZXF1YWwoYSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBkZXNjcmliZSgnLmNsb25lKG51bGwpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB0eXBlb2YgbnVsbCByZXN1bHRzIGluICdvYmplY3QnLiAgaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTMvMTAvdHlwZW9mLW51bGwuaHRtbFxuICAgICAgICBpdCgnLmNsb25lKG51bGwpIHNob3VsZCAgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0gbnVsbFxuICAgICAgICAgICAgbGV0IGIgPSBjbG9uZShhKTtcbiAgICAgICAgICAgIGV4cGVjdChiKS5lcXVhbChhKTtcbiAgICAgICAgICAgIGV4cGVjdChiKS50by5iZS5udWxsO1xuICAgICAgICAgICAgZXhwZWN0KGEpLnRvLmJlLm51bGw7XG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnLmNsb25lKHVuZGVmaW5lZCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCcuY2xvbmUodW5kZWZpbmVkKSBzaG91bGQgIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBsZXQgYiA9IGNsb25lKGEpO1xuICAgICAgICAgICAgZXhwZWN0KGEgPT09IGIpLnRvLmJlLnRydWVcbiAgICAgICAgICAgIGV4cGVjdCh0eXBlb2YgYiA9PT0gJ3VuZGVmaW5lZCcpLnRvLmJlLnRydWVcbiAgICAgICAgICAgIGV4cGVjdChhID09PSB1bmRlZmluZWQpLnRvLmJlLnRydWVcbiAgICAgICAgICAgIGV4cGVjdChiID09PSB1bmRlZmluZWQpLnRvLmJlLnRydWVcbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCcuY2xvbmUob2JqZWN0KScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnLmNsb25lKHt9KSBzaG91bGQgIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0ge31cbiAgICAgICAgICAgIGxldCBiID0gY2xvbmUoYSk7XG4gICAgICAgICAgICBleHBlY3QodHlwZW9mIGIgPT09ICdvYmplY3QnKS50by5iZS50cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcuY2xvbmUoe3g6MX0pIHNob3VsZCAgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGEgPSB7eDogMX1cbiAgICAgICAgICAgIGxldCBiID0gY2xvbmUoYSk7XG4gICAgICAgICAgICBleHBlY3QoYS54KS5pcy5lcXVhbChiLngpXG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgZGVzY3JpYmUoJy5jbG9uZShmdW5jdGlvbiknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJy5jbG9uZShmdW5jdGlvbikgc2hvdWxkICBmdW5jdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGIgPSBjbG9uZShhKTtcbiAgICAgICAgICAgIGV4cGVjdCh0eXBlb2YgYiA9PT0gJ2Z1bmN0aW9uJykudG8uYmUudHJ1ZVxuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnLmNsb25lKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsICdzdHJpbmcnXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsICd1bmRlZmluZWQnXSxcbiAgICAgICAgICAgIFtudWxsLCAnb2JqZWN0J10sIC8vIHR5cGVvZiBudWxsIHJlc3VsdHMgaW4gJ29iamVjdCcuICBodHRwczovLzJhbGl0eS5jb20vMjAxMy8xMC90eXBlb2YtbnVsbC5odG1sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgJ2Z1bmN0aW9uJ10sXG4gICAgICAgICAgICBbMiwgJ251bWJlciddLFxuICAgICAgICAgICAgW2ZhbHNlLCAnYm9vbGVhbiddLFxuICAgICAgICAgICAgW3RydWUsICdib29sZWFuJ10sXG4gICAgICAgICAgICBbNC41LCAnbnVtYmVyJ10sXG4gICAgICAgICAgICBbe30sICdvYmplY3QnXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sICdvYmplY3QnXSwgLy8gYXJyYXkgaXN0IGF1Y2ggdHlwZSBvYmplY3RcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksICdzeW1ib2wnXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgICAgIGl0KCcuY2xvbmUoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkICAnICsgYiArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBjID0gY2xvbmUoYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBjKS5pcy5lcXVhbChiKTtcbiAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG59KTtcblxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxGdW5jdGlvbn0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7aXNGdW5jdGlvbiwgaXNJbnRlZ2VyfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge1F1ZXVlfSBmcm9tIFwiLi4vdHlwZXMvcXVldWUubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlRnVuY3Rpb24sIHZhbGlkYXRlSW50ZWdlcn0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge1Byb2Nlc3Npbmd9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ2FsbGJhY2sge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSB7aW50fHVuZGVmaW5lZH0gdGltZVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZSkge1xuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXSA9IHtcbiAgICAgICAgICAgIGNhbGxiYWNrOiB2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrKSxcbiAgICAgICAgICAgIHRpbWU6IHZhbGlkYXRlSW50ZWdlcih0aW1lID8/IDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gIHsqfSBkYXRhXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBydW4oZGF0YSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgICAgICAgZ2V0R2xvYmFsRnVuY3Rpb24oJ3NldFRpbWVvdXQnKSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHNlbGZbaW50ZXJuYWxTeW1ib2xdLmNhbGxiYWNrKGRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGZbaW50ZXJuYWxTeW1ib2xdLnRpbWUpO1xuXG5cbiAgICAgICAgfSlcblxuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGFsbG93cyB0byBleGVjdXRlIHNldmVyYWwgZnVuY3Rpb25zIGluIG9yZGVyLlxuICpcbiAqIEZ1bmN0aW9ucyBhbmQgdGltZW91dHMgY2FuIGJlIHBhc3NlZC4gSWYgYSB0aW1lb3V0IGlzIHBhc3NlZCwgaXQgYXBwbGllcyB0byBhbGwgZnVydGhlciBmdW5jdGlvbnMuXG4gKiBJbiB0aGUgZXhhbXBsZVxuICpcbiAqIGB0aW1lb3V0MSwgZnVuY3Rpb24xLCBmdW5jdGlvbjIsIGZ1bmN0aW9uMywgdGltZW91dDIsIGZ1bmN0aW9uNGBcbiAqXG4gKiB0aGUgdGltZW91dDEgaXMgdmFsaWQgZm9yIHRoZSBmdW5jdGlvbnMgMSwgMiBhbmQgMyBhbmQgdGhlIHRpbWVvdXQyIGZvciB0aGUgZnVuY3Rpb240LlxuICpcbiAqIFNvIHRoZSBleGVjdXRpb24gdGltZSBpcyB0aW1lb3V0MSt0aW1lb3V0MSt0aW1lb3V0MSt0aW1lb3V0MlxuICpcbiAqIFRoZSByZXN1bHQgb2YgYHJ1bigpYCBpcyBhIHByb21pc2UuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7UHJvY2Vzc2luZ30gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvdXRpbC9wcm9jZXNzaW5nLm1qcyc7XG4gKiBuZXcgUHJvY2Vzc2luZygpO1xuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHtQcm9jZXNzaW5nfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS91dGlsL3Byb2Nlc3NpbmcubWpzJztcbiAqXG4gKiBsZXQgc3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gKlxuICogbmV3IFByb2Nlc3NpbmcoKHVybCk9PntcbiAqICAgcmV0dXJuIGZldGNoKHVybClcbiAqIH0sKHJlc3BvbnNlKT0+e1xuICogICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmVzcG9uc2VcbiAqICAgY29uc29sZS5sb2cocmVzcG9uc2Uuc3RhdHVzLCArbmV3IERhdGUoKS1zdGFydFRpbWUpXG4gKiB9LDIwMCwoKT0+e1xuICogICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAyMDAgc2Vjb25kcyBhZnRlciBmZXRjaCBpcyByZWNlaXZlZC5cbiAqICAgY29uc29sZS5sb2coJ2ZpbmlzaGVkJywgK25ldyBEYXRlKCktc3RhcnRUaW1lKVxuICogICByZXR1cm4gJ2RvbmUnXG4gKiB9KS5ydW4oJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvd29ybGQuanNvbicpLnRoZW4ocj0+e1xuICogICBjb25zb2xlLmxvZyhyKVxuICogICAvLyBcdTIxQTYgXCJkb25lXCJcbiAqIH0pXG4gKlxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBzaW5jZSAxLjIxLjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlV0aWxcbiAqIEBzdW1tYXJ5IENsYXNzIHRvIGJlIGFibGUgdG8gZXhlY3V0ZSBmdW5jdGlvbiBjaGFpbnNcbiAqL1xuY2xhc3MgUHJvY2Vzc2luZyBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG5ldyBQcm9jZXNzaW5nXG4gICAgICpcbiAgICAgKiBGdW5jdGlvbnMgYW5kIHRpbWVvdXRzIGNhbiBiZSBwYXNzZWQuIElmIGEgdGltZW91dCBpcyBwYXNzZWQsIGl0IGFwcGxpZXMgdG8gYWxsIGZ1cnRoZXIgZnVuY3Rpb25zLlxuICAgICAqIEluIHRoZSBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgdGltZW91dDEsIGZ1bmN0aW9uMSwgZnVuY3Rpb24yLCBmdW5jdGlvbjMsIHRpbWVvdXQyLCBmdW5jdGlvbjRgXG4gICAgICpcbiAgICAgKiB0aGUgdGltZW91dDEgaXMgdmFsaWQgZm9yIHRoZSBmdW5jdGlvbnMgMSwgMiBhbmQgMyBhbmQgdGhlIHRpbWVvdXQyIGZvciB0aGUgZnVuY3Rpb240LlxuICAgICAqXG4gICAgICogU28gdGhlIGV4ZWN1dGlvbiB0aW1lIGlzIHRpbWVvdXQxK3RpbWVvdXQxK3RpbWVvdXQxK3RpbWVvdXQyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ludH0gdGltZW91dCBUaW1lb3V0XG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICAgKiBAdGhyb3cge1R5cGVFcnJvcn0gdGhlIGFyZ3VtZW50cyBtdXN0IGJlIGVpdGhlciBpbnRlZ2VyIG9yIGZ1bmN0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdID0ge1xuICAgICAgICAgICAgcXVldWU6IG5ldyBRdWV1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCB0aW1lID0gMFxuXG4gICAgICAgIGZvciAoY29uc3QgWywgYXJnXSBvZiBPYmplY3QuZW50cmllcyhhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICBpZiAoaXNJbnRlZ2VyKGFyZykgJiYgYXJnID49IDApIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gYXJnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGFyZykpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5xdWV1ZS5hZGQobmV3IENhbGxiYWNrKGFyZywgdGltZSkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoZSBhcmd1bWVudHMgbXVzdCBiZSBlaXRoZXIgaW50ZWdlciBvciBmdW5jdGlvbnMnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmdW5jdGlvbiB3aXRoIHRoZSBkZXNpcmVkIHRpbWVvdXRcbiAgICAgKiBJZiBubyB0aW1lb3V0IGlzIHNwZWNpZmllZCwgdGhlIHRpbWVvdXQgb2YgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSB7aW50fHVuZGVmaW5lZH0gdGltZVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICovXG4gICAgYWRkKGNhbGxiYWNrLCB0aW1lKSB7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLnF1ZXVlLmFkZChuZXcgQ2FsbGJhY2soY2FsbGJhY2ssIHRpbWUpKVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBkZWZpbmVkIGZ1bmN0aW9ucyBpbiBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG4gICAgcnVuKGRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzW2ludGVybmFsU3ltYm9sXS5xdWV1ZS5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbFN5bWJvbF0ucXVldWUucG9sbCgpLnJ1bihkYXRhKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnJ1bihyZXN1bHQpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1Byb2Nlc3Npbmd9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9wcm9jZXNzaW5nLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdQcm9jZXNzaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ3J1biBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biBtYW55IGZ1bmN0aW9uJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgbGV0IHQgPSArbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgY29uc3QgZGVzaXJlZERlbGF5ID0gMjAwO1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0KGRlc2lyZWREZWxheSsxMDApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBkZWxheSAxMiBcbiAgICAgICAgICAgIG5ldyBQcm9jZXNzaW5nKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfSwgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB9LCBkZXNpcmVkRGVsYXksZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH0pLnJ1bigndGVzdCcpLnRoZW4oKHYpID0+IHtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChjb3VudGVyKS50by5iZS5lcXVhbCg0KTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHYgPT09ICd0ZXN0JykudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZGVsYXlcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCtuZXcgRGF0ZSgpID4gdCArIGRlc2lyZWREZWxheSsxKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIG9uZSBmdW5jdGlvbicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICAgICAgbmV3IFByb2Nlc3NpbmcoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSkucnVuKCd0ZXN0JykudGhlbigodikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2ID09PSAndGVzdCcpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biBubyBmdW5jdGlvbicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICAgICAgbmV3IFByb2Nlc3NpbmcoKS5ydW4oJ3Rlc3QnKS50aGVuKCh2KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodiA9PT0gJ3Rlc3QnKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZSBuZXcgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBQcm9jZXNzaW5nIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUHJvY2Vzc2luZygpKS50by5iZS5hKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBQcm9jZXNzaW5nIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUHJvY2Vzc2luZyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB9KSkudG8uYmUuYSgnb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgVHlwZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBQcm9jZXNzaW5nKHRydWUpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgUHJvY2Vzc2luZyhcInRlc3RcIikpLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxufSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmNsYXNzIE1vY2tGb3JFeHRlbmRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5cblxuZGVzY3JpYmUoJ2V4dGVuZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIFtcbiAgICAgICAgW1xuICAgICAgICAgICAne1widGhla2V5XCI6e319Jyx7fSx7dGhla2V5Om5ldyBNb2NrRm9yRXh0ZW5kc30gXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICd7XCJhXCI6e1wiYlwiOltcIjFcIixcIjJcIixcIjNcIl19fScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIzXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sICAgICAgICBbXG4gICAgICAgICAgICAne1wiYVwiOntcImJcIjoxLFwiZFwiOjF9fScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGQ6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgICd7XCJhXCI6e1wiYlwiOjEsXCJkXCI6e1wieFwiOltcImNhclwiXSxcImZcIjp0cnVlLFwiZ1wiOltdfX19JyxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjogMSxcbiAgICAgICAgICAgICAgICAgICAgZDoge3g6IFtcImNhclwiXX1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGc6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYSA9IGRhdGFcblxuICAgICAgICBpdCgnLmV4dGVuZCgnICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnKSBzaG91bGQgcmVzdWx0IGluICcgKyBkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgeCA9IGV4dGVuZC5hcHBseSh0aGlzLCBhKTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeSh4KSkuaXMuZXF1YWwoZCk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG4gICAgW1xuXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiAxLFxuICAgICAgICAgICAgICAgICAgICBkOiBbXCJjYXJcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGc6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgbGV0IGEgPSBkYXRhXG5cbiAgICAgICAgaXQoJy5leHRlbmQoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkIHRocm93IEVycm9yICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBleHRlbmQuYXBwbHkodGhpcywgYSkpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG59KSIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7UGlwZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL3BpcGUubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxuZGVzY3JpYmUoJ1BpcGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICBpZighZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pOyAgICBcbiAgICBcbiAgICBkZXNjcmliZSgncnVuIGRpZmZlcmVudCBwaXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgW1xuICAgICAgICAgICAgWydwYXRoOmIgfCBpZjp4OlxcXFwgJywge2E6dHJ1ZX0sICcgJ10sICAgLy8gJ1xcXFwgJy5sZW5ndGggXHUyMUE2IDJcbiAgICAgICAgICAgIFsncGF0aDphIHwgaWY6eDpcXFxcICcsIHthOnRydWV9LCAneCddLFxuICAgICAgICAgICAgWydub3AnLCAnYWJjZGVmZ2hpamtsbW5vcCcsICdhYmNkZWZnaGlqa2xtbm9wJ10sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ1BpcGUucnVuKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbmV3IFBpcGUoYSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdC5ydW4oYik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHIpLnRvLmJlLmVxbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCduZXcgUGlwZSBzaG91bGQgY3JlYXRlIG5ldyBJbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBJbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUGlwZSgnJykpLnRvLmJlLmluc3RhbmNlT2YoUGlwZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIEluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBQaXBlKCdpbmRleDphfHRvdXBwZXIgfHByZWZpeDphJykucnVuKHthOiBcInRlc3RcIn0pKS50by5iZS5lcXVhbCgnYVRFU1QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydpbmRleDphfHRvdXBwZXIgfHByZWZpeDphJywge2E6IFwidGVzdFwifSwgJ2FURVNUJ10sXG4gICAgICAgICAgICBbJ3BhdGg6YS5iLmMuZCB8IHRvdXBwZXIgfCBwcmVmaXg6SGVsbG9cXFxcICcsIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiBcIndvcmxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sICdIZWxsbyBXT1JMRCddLFxuICAgICAgICAgICAgWydwYXRoOmEuYi5jfGluZGV4OmR8dG91cHBlciB8c3VmZml4OngnLCB7YToge2I6IHtjOiB7ZDogXCJ0ZXN0XCJ9fX19LCAnVEVTVHgnXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ25ldyBQaXBlKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbmV3IFBpcGUoYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQucnVuKGIpKS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5cbmltcG9ydCB7aXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge2Nsb25lfSBmcm9tIFwiLi4vdXRpbC9jbG9uZS5tanNcIjtcbmltcG9ydCB7REVMSU1JVEVSLCBQYXRoZmluZGVyLCBXSUxEQ0FSRH0gZnJvbSBcIi4vcGF0aGZpbmRlci5tanNcIjtcblxuZXhwb3J0IHtidWlsZE1hcCwgUEFSRU5ULCBhc3NlbWJsZVBhcnRzfVxuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKi9cbmNvbnN0IFBBUkVOVCA9ICdeJztcblxuXG4vKipcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhlIGZ1bmN0aW9uIGBidWlsZE1hcCgpYCwgbWFwcyBjYW4gYmUgZWFzaWx5IGNyZWF0ZWQgZnJvbSBkYXRhIG9iamVjdHMuXG4gKlxuICogRWl0aGVyIGEgc2ltcGxlIGRlZmluaXRpb24gYGEuYi5jYCBvciBhIHRlbXBsYXRlIGAke2EuYi5jfWAgY2FuIGJlIHNwZWNpZmllZCBhcyB0aGUgcGF0aC5cbiAqIEtleSBhbmQgdmFsdWUgY2FuIGJlIGVpdGhlciBhIGRlZmluaXRpb24gb3IgYSB0ZW1wbGF0ZS4gVGhlIGtleSBkb2VzIG5vdCBoYXZlIHRvIGJlIGRlZmluZWQuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7YnVpbGRNYXB9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RhdGEvYnVpbGRtYXAubWpzJztcbiAqIGNvbnNvbGUubG9nKGJ1aWxkTWFwKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIFRoZSB0ZW1wbGF0ZXMgZGV0ZXJtaW5lIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBrZXlzIGFuZCB0aGUgdmFsdWUgb2YgdGhlIG1hcC4gRWl0aGVyIGEgc2luZ2xlIHZhbHVlIGBpZGAgY2FuIGJlIHRha2VuIG9yIGEgY29tcG9zaXRlIGtleSBgJHtpZH0gJHtuYW1lfWAgY2FuIGJlIHVzZWQuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gYWNjZXNzIHZhbHVlcyBvZiB0aGUgcGFyZW50IGRhdGEgc2V0LCB5b3UgaGF2ZSB0byB1c2UgdGhlIGBeYCBjaGFyYWN0ZXIgYCR7aWR9ICR7Xi5uYW1lfWAuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQge2J1aWxkTWFwfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kYXRhL2J1aWxkbWFwLm1qcyc7XG4gKiAvLyBhIHR5cGljYWwgZGF0YSBzdHJ1Y3R1cmUgYXMgcmVwb3J0ZWQgYnkgYW4gYXBpXG4gKlxuICogbGV0IG1hcDtcbiAqIGxldCBvYmogPSB7XG4gKiAgICAgXCJkYXRhXCI6IFtcbiAqICAgICAgICAge1xuICogICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAqICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiLFxuICogICAgICAgICAgICAgXCJhZGRyZXNzXCI6IHtcbiAqICAgICAgICAgICAgICAgICBcInN0cmVldFwiOiBcIjQ5My00MTA1IFZ1bHB1dGF0ZSBTdHJlZXRcIixcbiAqICAgICAgICAgICAgICAgICBcImNpdHlcIjogXCJTYXVtdXJcIixcbiAqICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjUyNjI4XCJcbiAqICAgICAgICAgICAgIH1cbiAqICAgICAgICAgfSxcbiAqICAgICAgICAge1xuICogICAgICAgICAgICAgXCJpZFwiOiAyMCxcbiAqICAgICAgICAgICAgIFwibmFtZVwiOiBcIkhvbGx5XCIsXG4gKiAgICAgICAgICAgICBcImFkZHJlc3NcIjoge1xuICogICAgICAgICAgICAgICAgIFwic3RyZWV0XCI6IFwiMTc2MiBFZ2V0IFJkLlwiLFxuICogICAgICAgICAgICAgICAgIFwiY2l0eVwiOiBcIlNjaHdhbGJhY2hcIixcbiAqICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjk1MjM0MFwiXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIH0sXG4gKiAgICAgICAgIHtcbiAqICAgICAgICAgICAgIFwiaWRcIjogMzAsXG4gKiAgICAgICAgICAgICBcIm5hbWVcIjogXCJHdXlcIixcbiAqICAgICAgICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gKiAgICAgICAgICAgICAgICAgXCJzdHJlZXRcIjogXCI5NTctMzg4IFNvbGxpY2l0dWRpbiBBdmVudWVcIixcbiAqICAgICAgICAgICAgICAgICBcImNpdHlcIjogXCJQYW5jaGlcdTAwRTBcIixcbiAqICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjQyMDcyOVwiXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIH1cbiAqICAgICBdXG4gKiB9O1xuICpcbiAqIC8vIFRoZSBmdW5jdGlvbiBpcyBwYXNzZWQgdGhpcyBkYXRhIHN0cnVjdHVyZSBhbmQgd2l0aCB0aGUgaGVscCBvZiB0aGUgc2VsZWN0b3IgYCdkYXRhLionYCB0aGUgZGF0YSB0byBiZSBjb25zaWRlcmVkIGFyZSBzZWxlY3RlZC5cbiAqIC8vIFRoZSBrZXkgaXMgZ2l2ZW4gYnkgYSBzaW1wbGUgZGVmaW5pdGlvbiBgJ2lkJ2AgYW5kIHRoZSB2YWx1ZSBpcyBnaXZlbiBieSBhIHRlbXBsYXRlIGAnJHtuYW1lfSAoJHthZGRyZXNzLnppcH0gJHthZGRyZXNzLmNpdHl9KSdgLlxuICogbWFwID0gYnVpbGRNYXAob2JqLCAnZGF0YS4qJywgJyR7bmFtZX0gKCR7YWRkcmVzcy56aXB9ICR7YWRkcmVzcy5jaXR5fSknLCAnaWQnKTtcbiAqIGNvbnNvbGUubG9nKG1hcCk7XG4gKlxuICogLy8gXHUyMUE2IE1hcCgzKSB7XG4gKiAvLyAgJzEwJyA9PiAnQ2Fzc2FuZHJhICg1MjYyOCBTYXVtdXIpJyxcbiAqIC8vICAnMjAnID0+ICdIb2xseSAoOTUyMzQwIFNjaHdhbGJhY2gpJyxcbiAqIC8vICAnMzAnID0+ICdHdXkgKDQyMDcyOSBQYW5jaGlcdTAwRTApJ1xuICogLy8gfVxuICpcbiAqIC8vIElmIG5vIGtleSBpcyBzcGVjaWZpZWQsIHRoZSBrZXkgZnJvbSB0aGUgc2VsZWN0aW9uLCBoZXJlIHRoZSBhcnJheSBpbmRleCwgaXMgdGFrZW4uXG4gKiBtYXAgPSBidWlsZE1hcChvYmosICdkYXRhLionLCAnJHtuYW1lfSAoJHthZGRyZXNzLnppcH0gJHthZGRyZXNzLmNpdHl9KScpO1xuICogY29uc29sZS5sb2cobWFwKTtcbiAqXG4gKiAvLyBcdTIxQTYgTWFwKDMpIHtcbiAqIC8vICAnMCcgPT4gJ0Nhc3NhbmRyYSAoNTI2MjggU2F1bXVyKScsXG4gKiAvLyAgJzEnID0+ICdIb2xseSAoOTUyMzQwIFNjaHdhbGJhY2gpJyxcbiAqIC8vICAnMicgPT4gJ0d1eSAoNDIwNzI5IFBhbmNoaVx1MDBFMCknXG4gKiAvLyB9XG4gKlxuICogLy8gYSBmaWx0ZXIgKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHt9KSBjYW4gYmUgc3BlY2lmaWVkIHRvIGFjY2VwdCBvbmx5IGRlZmluZWQgZW50cmllcy5cbiAqIG1hcCA9IGJ1aWxkTWFwKG9iaiwgJ2RhdGEuKicsICcke25hbWV9ICgke2FkZHJlc3MuemlwfSAke2FkZHJlc3MuY2l0eX0pJywgJ2lkJywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAqICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWVbJ2lkJ10gPj0gMjApID8gdHJ1ZSA6IGZhbHNlXG4gKiAgICAgICAgICAgIH0pO1xuICogY29uc29sZS5sb2cobWFwKTtcbiAqXG4gKiAvLyBcdTIxQTYgTWFwKDIpIHtcbiAqIC8vICAyMCA9PiAnSG9sbHkgKDk1MjM0MCBTY2h3YWxiYWNoKScsXG4gKiAvLyAgMzAgPT4gJ0d1eSAoNDIwNzI5IFBhbmNoaVx1MDBFMCknXG4gKiAvLyB9XG4gKlxuICogQHBhcmFtIHsqfSBzdWJqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ3xNb25zdGVyLkRhdGF+ZXhhbXBsZVNlbGVjdG9yQ2FsbGJhY2t9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlVGVtcGxhdGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleVRlbXBsYXRlXVxuICogQHBhcmFtIHtNb25zdGVyLkRhdGF+ZXhhbXBsZUZpbHRlckNhbGxiYWNrfSBbZmlsdGVyXVxuICogQHJldHVybiB7Kn1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbmVpdGhlciBhIHN0cmluZyBub3IgYSBmdW5jdGlvblxuICogQHRocm93cyB7VHlwZUVycm9yfSB0aGUgc2VsZWN0b3IgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBtYXBcbiAqL1xuZnVuY3Rpb24gYnVpbGRNYXAoc3ViamVjdCwgc2VsZWN0b3IsIHZhbHVlVGVtcGxhdGUsIGtleVRlbXBsYXRlLCBmaWx0ZXIpIHtcbiAgICByZXR1cm4gYXNzZW1ibGVQYXJ0cyhzdWJqZWN0LCBzZWxlY3RvciwgZmlsdGVyLCBmdW5jdGlvbiAodiwgaywgbSkge1xuICAgICAgICBrID0gYnVpbGQodiwga2V5VGVtcGxhdGUsIGspO1xuICAgICAgICB2ID0gYnVpbGQodiwgdmFsdWVUZW1wbGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0KGssIHYpO1xuICAgIH0pO1xuXG59XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBzdWJqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ3xNb25zdGVyLkRhdGF+ZXhhbXBsZVNlbGVjdG9yQ2FsbGJhY2t9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge01vbnN0ZXIuRGF0YX5leGFtcGxlRmlsdGVyQ2FsbGJhY2t9IFtmaWx0ZXJdXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7TWFwfVxuICogQHRocm93cyB7VHlwZUVycm9yfSBzZWxlY3RvciBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBhIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGFzc2VtYmxlUGFydHMoc3ViamVjdCwgc2VsZWN0b3IsIGZpbHRlciwgY2FsbGJhY2spIHtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXAoKTtcblxuICAgIGxldCBtYXA7XG4gICAgaWYgKGlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG4gICAgICAgIG1hcCA9IHNlbGVjdG9yKHN1YmplY3QpXG4gICAgICAgIGlmICghKG1hcCBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoZSBzZWxlY3RvciBjYWxsYmFjayBtdXN0IHJldHVybiBhIG1hcCcpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0cmluZyhzZWxlY3RvcikpIHtcbiAgICAgICAgbWFwID0gbmV3IE1hcDtcbiAgICAgICAgYnVpbGRGbGF0TWFwLmNhbGwobWFwLCBzdWJqZWN0LCBzZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2VsZWN0b3IgaXMgbmVpdGhlciBhIHN0cmluZyBub3IgYSBmdW5jdGlvbicpXG4gICAgfVxuXG4gICAgaWYgKCEobWFwIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIG1hcC5mb3JFYWNoKCh2LCBrLCBtKSA9PiB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGZpbHRlcikpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIuY2FsbChtLCB2LCBrKSAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2suY2FsbChyZXN1bHQsIHYsIGssIG0pO1xuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc3ViamVjdFxuICogQHBhcmFtIHNlbGVjdG9yXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gcGFyZW50TWFwXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBidWlsZEZsYXRNYXAoc3ViamVjdCwgc2VsZWN0b3IsIGtleSwgcGFyZW50TWFwKSB7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzO1xuICAgIGNvbnN0IGN1cnJlbnRNYXAgPSBuZXcgTWFwO1xuXG4gICAgY29uc3QgcmVzdWx0TGVuZ3RoID0gcmVzdWx0LnNpemU7XG5cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIGtleSA9IFtdO1xuXG4gICAgbGV0IHBhcnRzID0gc2VsZWN0b3Iuc3BsaXQoREVMSU1JVEVSKTtcbiAgICBsZXQgY3VycmVudCA9IFwiXCIsIGN1cnJlbnRQYXRoID0gW107XG4gICAgZG8ge1xuXG4gICAgICAgIGN1cnJlbnQgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgICBjdXJyZW50UGF0aC5wdXNoKGN1cnJlbnQpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBXSUxEQ0FSRCkge1xuXG4gICAgICAgICAgICBsZXQgZmluZGVyID0gbmV3IFBhdGhmaW5kZXIoc3ViamVjdCk7XG4gICAgICAgICAgICBsZXQgbWFwO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG1hcCA9IGZpbmRlci5nZXRWaWEoY3VycmVudFBhdGguam9pbihERUxJTUlURVIpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IGU7XG4gICAgICAgICAgICAgICAgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCBvXSBvZiBtYXApIHtcblxuICAgICAgICAgICAgICAgIGxldCBjb3B5S2V5ID0gY2xvbmUoa2V5KTtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoLm1hcCgoYSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb3B5S2V5LnB1c2goKGEgPT09IFdJTERDQVJEKSA/IGsgOiBhKVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBsZXQga2sgPSBjb3B5S2V5LmpvaW4oREVMSU1JVEVSKTtcbiAgICAgICAgICAgICAgICBsZXQgc3ViID0gYnVpbGRGbGF0TWFwLmNhbGwocmVzdWx0LCBvLCBwYXJ0cy5qb2luKERFTElNSVRFUiksIGNvcHlLZXksIG8pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHN1YikgJiYgcGFyZW50TWFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViW1BBUkVOVF0gPSBwYXJlbnRNYXA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VycmVudE1hcC5zZXQoa2ssIHN1Yik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG5cbiAgICB9IHdoaWxlIChwYXJ0cy5sZW5ndGggPiAwKTtcblxuICAgIC8vIG5vIHNldCBpbiBjaGlsZCBydW5cbiAgICBpZiAocmVzdWx0TGVuZ3RoID09PSByZXN1bHQuc2l6ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCBvXSBvZiBjdXJyZW50TWFwKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KGssIG8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YmplY3Q7XG5cbn1cblxuXG4vKipcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhpcyBmaWx0ZXIgY2FsbGJhY2ssIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LiBPbmx5IGlmIHRoZSBmaWx0ZXIgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGUgdmFsdWUgaXMgdGFrZW4gZm9yIHRoZSBtYXAuXG4gKlxuICogQGNhbGxiYWNrIE1vbnN0ZXIuRGF0YX5leGFtcGxlRmlsdGVyQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgIEtleVxuICogQG1lbWJlck9mIE1vbnN0ZXIuRGF0YVxuICogQHNlZSB7QGxpbmsgTW9uc3Rlci5EYXRhLmJ1aWxkTWFwfVxuICovXG5cbi8qKlxuICogQWx0ZXJuYXRpdmVseSB0byBhIHN0cmluZyBzZWxlY3RvciBhIGNhbGxiYWNrIGNhbiBiZSBzcGVjaWZpZWQuIHRoaXMgbXVzdCByZXR1cm4gYSBtYXAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7YnVpbGRNYXB9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RhdGEvYnVpbGRtYXAubWpzJztcbiAqXG4gKiBsZXQgb2JqID0ge1xuICogICAgICAgICAgICAgICAgXCJkYXRhXCI6IFtcbiAqICAgICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMTAsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiLFxuICogICAgICAgICAgICAgICAgICAgICAgICBcImVucmljaG1lbnRcIjoge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHM6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMSwgbGFiZWw6IFwiWFhTXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAyLCBsYWJlbDogXCJYU1wiLCBwcmljZTogW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJ30sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMywgbGFiZWw6IFwiU1wiLCBwcmljZTogW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJ30sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogNCwgbGFiZWw6IFwiTFwiLCBwcmljZTogW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJ30sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDIwLFxuICogICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJZZXNzZXkhXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW5yaWNobWVudFwiOiB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAxLCBsYWJlbDogXCJYWFNcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDIsIGxhYmVsOiBcIlhTXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAzLCBsYWJlbDogXCJTXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiA0LCBsYWJlbDogXCJMXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICB9O1xuICpcbiAqIGxldCBjYWxsYmFjayA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gKiAgICAgICAgICAgICAgICBsZXQgbSA9IG5ldyBNYXA7XG4gKlxuICogICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgYl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViamVjdC5kYXRhKSkge1xuICpcbiAqICAgICAgICAgICAgICAgICAgICBsZXQga2V5MSA9IGk7XG4gKlxuICogICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2osIGNdIG9mIE9iamVjdC5lbnRyaWVzKGIuZW5yaWNobWVudC52YXJpYW50cykpIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleTIgPSBqO1xuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgZF0gb2YgT2JqZWN0LmVudHJpZXMoYy5wcmljZSkpIHtcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5MyA9IGs7XG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5uYW1lID0gYi5uYW1lO1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sYWJlbCA9IGMubGFiZWw7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmlkID0gW2tleTEsIGtleTIsIGtleTNdLmpvaW4oJy4nKTtcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnNldChkLmlkLCBkKTtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgfVxuICpcbiAqICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICByZXR1cm4gbTtcbiAqICAgICAgICAgICAgfVxuICpcbiAqIGxldCBtYXAgPSBidWlsZE1hcChvYmosIGNhbGxiYWNrLCAnJHtuYW1lfSAke3ZrfScsICcke2lkfScpXG4gKlxuICogLy8gXHUyMUE2IE1hcCgzKSB7XG4gKiAvLyAgXCIwLjAuMFwiOlwiQ2Fzc2FuZHJhIDEyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMC4wLjFcIjpcIkNhc3NhbmRyYSAxMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjAuMS4wXCI6XCJDYXNzYW5kcmEgMjIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIwLjEuMVwiOlwiQ2Fzc2FuZHJhIDIyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMC4yLjBcIjpcIkNhc3NhbmRyYSAzMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjAuMi4xXCI6XCJDYXNzYW5kcmEgMzIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIwLjMuMFwiOlwiQ2Fzc2FuZHJhIDQyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMC4zLjFcIjpcIkNhc3NhbmRyYSA0Mi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjEuMC4wXCI6XCJZZXNzZXkhIDEyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4wLjFcIjpcIlllc3NleSEgMTIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIxLjEuMFwiOlwiWWVzc2V5ISAyMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjEuMS4xXCI6XCJZZXNzZXkhIDIyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4yLjBcIjpcIlllc3NleSEgMzIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIxLjIuMVwiOlwiWWVzc2V5ISAzMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjEuMy4wXCI6XCJZZXNzZXkhIDQyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4zLjFcIjpcIlllc3NleSEgNDIuMTIgXHUyMEFDXCJcbiAqIC8vIH1cbiAqXG4gKiBAY2FsbGJhY2sgTW9uc3Rlci5EYXRhfmV4YW1wbGVTZWxlY3RvckNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHN1YmplY3Qgc3ViamVjdFxuICogQHJldHVybiBNYXBcbiAqIEBzaW5jZSAxLjE3LjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEBzZWUge0BsaW5rIE1vbnN0ZXIuRGF0YS5idWlsZE1hcH1cbiAqL1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHN1YmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gZGVmaW5pdGlvblxuICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkKHN1YmplY3QsIGRlZmluaXRpb24sIGRlZmF1bHRWYWx1ZSkge1xuICAgIGlmIChkZWZpbml0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWUgPyBkZWZhdWx0VmFsdWUgOiBzdWJqZWN0O1xuICAgIHZhbGlkYXRlU3RyaW5nKGRlZmluaXRpb24pO1xuXG4gICAgY29uc3QgcmVnZXhwID0gLyg/PHBsYWNlaG9sZGVyPlxcJHsoPzxwYXRoPlthLXpcXF5BLVouXFwtXzAtOV0qKX0pL2dtXG4gICAgY29uc3QgYXJyYXkgPSBbLi4uZGVmaW5pdGlvbi5tYXRjaEFsbChyZWdleHApXTtcblxuICAgIGxldCBmaW5kZXIgPSBuZXcgUGF0aGZpbmRlcihzdWJqZWN0KTtcblxuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZpbmRlci5nZXRWaWEoZGVmaW5pdGlvbik7XG4gICAgfVxuXG4gICAgYXJyYXkuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgICBsZXQgZ3JvdXBzID0gYT8uWydncm91cHMnXTtcbiAgICAgICAgbGV0IHBsYWNlaG9sZGVyID0gZ3JvdXBzPy5bJ3BsYWNlaG9sZGVyJ11cbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgICBsZXQgcGF0aCA9IGdyb3Vwcz8uWydwYXRoJ11cblxuICAgICAgICBsZXQgdiA9IGZpbmRlci5nZXRWaWEocGF0aCk7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHYgPSBkZWZhdWx0VmFsdWU7XG5cbiAgICAgICAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24ucmVwbGFjZUFsbChwbGFjZWhvbGRlciwgdik7XG5cblxuICAgIH0pXG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcblxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtidWlsZE1hcH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2J1aWxkbWFwLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdidWlsZE1hcCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBjb252ZXJ0TWFwUmVzdWx0ID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIHIgPSBPYmplY3QuZnJvbUVudHJpZXMocik7XG4gICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgciA9IHIubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0TWFwUmVzdWx0KGUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgb10gb2YgT2JqZWN0LmVudHJpZXMocikpIHtcbiAgICAgICAgICAgICAgICAgICAgcltrXSA9IGNvbnZlcnRNYXBSZXN1bHQobyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkIE1hcCB3aXRoIGNhbGxiYWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnZGVmaW5pdGlvbiBzaG91bGQgcmV0dXJuIG1hcCB3aXRoIHN1YiBhbmQgcGFyZW50IGtleXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnJpY2htZW50XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDEsIGxhYmVsOiBcIlhYU1wiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMiwgbGFiZWw6IFwiWFNcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDMsIGxhYmVsOiBcIlNcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDQsIGxhYmVsOiBcIkxcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJZZXNzZXkhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVucmljaG1lbnRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMSwgbGFiZWw6IFwiWFhTXCIsIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAyLCBsYWJlbDogXCJYU1wiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMywgbGFiZWw6IFwiU1wiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogNCwgbGFiZWw6IFwiTFwiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCBjYWxsYmFjayA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IG0gPSBuZXcgTWFwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgYl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViamVjdC5kYXRhKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkxID0gaTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtqLCBjXSBvZiBPYmplY3QuZW50cmllcyhiLmVucmljaG1lbnQudmFyaWFudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5MiA9IGo7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIGRdIG9mIE9iamVjdC5lbnRyaWVzKGMucHJpY2UpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5MyA9IGs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLm5hbWUgPSBiLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sYWJlbCA9IGMubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5pZCA9IFtrZXkxLCBrZXkyLCBrZXkzXS5qb2luKCcuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnNldChkLmlkLCBkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBtO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbWFwID0gYnVpbGRNYXAob2JqLCBjYWxsYmFjaywgJyR7bmFtZX0gJHtsYWJlbH0nLCAnJHtpZH0nKVxuICAgICAgICAgICAgbGV0IGkgPSBjb252ZXJ0TWFwUmVzdWx0KG1hcCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShpKSkudG8uYmUuZXF1YWwoJ3tcIjAuMC4wXCI6XCJDYXNzYW5kcmEgWFhTXCIsXCIwLjAuMVwiOlwiQ2Fzc2FuZHJhIFhYU1wiLFwiMC4xLjBcIjpcIkNhc3NhbmRyYSBYU1wiLFwiMC4xLjFcIjpcIkNhc3NhbmRyYSBYU1wiLFwiMC4yLjBcIjpcIkNhc3NhbmRyYSBTXCIsXCIwLjIuMVwiOlwiQ2Fzc2FuZHJhIFNcIixcIjAuMy4wXCI6XCJDYXNzYW5kcmEgTFwiLFwiMC4zLjFcIjpcIkNhc3NhbmRyYSBMXCIsXCIxLjAuMFwiOlwiWWVzc2V5ISBYWFNcIixcIjEuMC4xXCI6XCJZZXNzZXkhIFhYU1wiLFwiMS4xLjBcIjpcIlllc3NleSEgWFNcIixcIjEuMS4xXCI6XCJZZXNzZXkhIFhTXCIsXCIxLjIuMFwiOlwiWWVzc2V5ISBTXCIsXCIxLjIuMVwiOlwiWWVzc2V5ISBTXCIsXCIxLjMuMFwiOlwiWWVzc2V5ISBMXCIsXCIxLjMuMVwiOlwiWWVzc2V5ISBMXCJ9Jyk7XG5cbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkIHN1Ym1hcCB3aXRoIConLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdkZWZpbml0aW9uIHNob3VsZCByZXR1cm4ge1wiMTBcIjpcIkNhc3NhbmRyYSAxMFwiLFwiMjBcIjpcIlllc3NleSEgMjBcIn0nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJZZXNzZXkhXCIsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgbWFwID0gYnVpbGRNYXAob2JqLCAnZGF0YS4qJywgJyR7bmFtZX0gJHtpZH0nLCAnJHtpZH0nKVxuICAgICAgICAgICAgbGV0IGkgPSBjb252ZXJ0TWFwUmVzdWx0KG1hcCk7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoaSkpLnRvLmJlLmVxdWFsKCd7XCIxMFwiOlwiQ2Fzc2FuZHJhIDEwXCIsXCIyMFwiOlwiWWVzc2V5ISAyMFwifScpO1xuXG4gICAgICAgIH0pXG4gICAgfSlcblxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkIHN1Ym1hcCB3aXRoICoqJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnZGVmaW5pdGlvbiBzaG91bGQgcmV0dXJuIE1hcCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICBcImRhdGFcIjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ2Fzc2FuZHJhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVucmljaG1lbnRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMSwgbGFiZWw6IFwiWFhTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQycsIGlkOiAxfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnLCBpZDogMn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAyLCBsYWJlbDogXCJYU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnLCBpZDogM30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJywgaWQ6IDR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMywgbGFiZWw6IFwiU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnLCBpZDogNX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJywgaWQ6IDZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogNCwgbGFiZWw6IFwiTFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnLCBpZDogN30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJywgaWQ6IDh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIlllc3NleSFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW5yaWNobWVudFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAxLCBsYWJlbDogXCJYWFNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJywgaWQ6IDl9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQycsIGlkOiAxMH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAyLCBsYWJlbDogXCJYU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnLCBpZDogMTF9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQycsIGlkOiAxMn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAzLCBsYWJlbDogXCJTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQycsIGlkOiAxM30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJywgaWQ6IDE0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogXCJMXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQycsIGlkOiAxNX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJywgaWQ6IDE2fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0NC4xMiBcdTIwQUMnLCBpZDogMTd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCBtYXAgPSBidWlsZE1hcChvYmosICdkYXRhLiouZW5yaWNobWVudC52YXJpYW50cy4qLnByaWNlLionLCAnJHt2a30gJHteLmxhYmVsfSAke14uXi5uYW1lfScsICcke14uXi5za3V9JylcbiAgICAgICAgICAgIGxldCBpID0gY29udmVydE1hcFJlc3VsdChtYXApO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGkpKS50by5iZS5lcXVhbCgne1wiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMC5wcmljZS4wXCI6XCIxMi4xMiBcdTIwQUMgWFhTIENhc3NhbmRyYVwiLFwiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMC5wcmljZS4xXCI6XCIxMi4xMiBcdTIwQUMgWFhTIENhc3NhbmRyYVwiLFwiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMS5wcmljZS4wXCI6XCIyMi4xMiBcdTIwQUMgWFMgQ2Fzc2FuZHJhXCIsXCJkYXRhLjAuZW5yaWNobWVudC52YXJpYW50cy4xLnByaWNlLjFcIjpcIjIyLjEyIFx1MjBBQyBYUyBDYXNzYW5kcmFcIixcImRhdGEuMC5lbnJpY2htZW50LnZhcmlhbnRzLjIucHJpY2UuMFwiOlwiMzIuMTIgXHUyMEFDIFMgQ2Fzc2FuZHJhXCIsXCJkYXRhLjAuZW5yaWNobWVudC52YXJpYW50cy4yLnByaWNlLjFcIjpcIjMyLjEyIFx1MjBBQyBTIENhc3NhbmRyYVwiLFwiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMy5wcmljZS4wXCI6XCI0Mi4xMiBcdTIwQUMgTCBDYXNzYW5kcmFcIixcImRhdGEuMC5lbnJpY2htZW50LnZhcmlhbnRzLjMucHJpY2UuMVwiOlwiNDIuMTIgXHUyMEFDIEwgQ2Fzc2FuZHJhXCIsXCJkYXRhLjEuZW5yaWNobWVudC52YXJpYW50cy4wLnByaWNlLjBcIjpcIjEyLjEyIFx1MjBBQyBYWFMgWWVzc2V5IVwiLFwiZGF0YS4xLmVucmljaG1lbnQudmFyaWFudHMuMC5wcmljZS4xXCI6XCIxMi4xMiBcdTIwQUMgWFhTIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjEucHJpY2UuMFwiOlwiMjIuMTIgXHUyMEFDIFhTIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjEucHJpY2UuMVwiOlwiMjIuMTIgXHUyMEFDIFhTIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjIucHJpY2UuMFwiOlwiMzIuMTIgXHUyMEFDIFMgWWVzc2V5IVwiLFwiZGF0YS4xLmVucmljaG1lbnQudmFyaWFudHMuMi5wcmljZS4xXCI6XCIzMi4xMiBcdTIwQUMgUyBZZXNzZXkhXCIsXCJkYXRhLjEuZW5yaWNobWVudC52YXJpYW50cy4zLnByaWNlLjBcIjpcIjQyLjEyIFx1MjBBQyBMIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjMucHJpY2UuMVwiOlwiNDIuMTIgXHUyMEFDIEwgWWVzc2V5IVwiLFwiZGF0YS4xLmVucmljaG1lbnQudmFyaWFudHMuMy5wcmljZS4yXCI6XCI0NC4xMiBcdTIwQUMgTCBZZXNzZXkhXCJ9Jyk7XG5cbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2V4YW1wbGVjb2RlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBleGFtcGxlIGNvZGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhZGRyZXNzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInN0cmVldFwiOiBcIjQ5My00MTA1IFZ1bHB1dGF0ZSBTdHJlZXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNpdHlcIjogXCJTYXVtdXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjUyNjI4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkhvbGx5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFkZHJlc3NcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3RyZWV0XCI6IFwiMTc2MiBFZ2V0IFJkLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2l0eVwiOiBcIlNjaHdhbGJhY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjk1MjM0MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMzAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJHdXlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJlZXRcIjogXCI5NTctMzg4IFNvbGxpY2l0dWRpbiBBdmVudWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNpdHlcIjogXCJQYW5jaGlcdTAwRTBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInppcFwiOiBcIjQyMDcyOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgbWFwO1xuICAgICAgICAgICAgbWFwID0gYnVpbGRNYXAob2JqLCAnZGF0YS4qJywgJyR7bmFtZX0gKCR7YWRkcmVzcy56aXB9ICR7YWRkcmVzcy5jaXR5fSknLCAnaWQnKVxuICAgICAgICAgICAgZXhwZWN0KG1hcCkudG8uYmUuaW5zdGFuY2VPZihNYXApO1xuXG4gICAgICAgICAgICBtYXAgPSBidWlsZE1hcChvYmosICdkYXRhLionLCAnJHtuYW1lfSAoJHthZGRyZXNzLnppcH0gJHthZGRyZXNzLmNpdHl9KScpXG4gICAgICAgICAgICBleHBlY3QobWFwKS50by5iZS5pbnN0YW5jZU9mKE1hcCk7XG5cbiAgICAgICAgICAgIG1hcCA9IGJ1aWxkTWFwKG9iaiwgJ2RhdGEuKicsICcke25hbWV9ICgke2FkZHJlc3MuemlwfSAke2FkZHJlc3MuY2l0eX0pJywgJ2lkJywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlWydpZCddID49IDIwKSA/IHRydWUgOiBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGV4cGVjdChtYXApLnRvLmJlLmluc3RhbmNlT2YoTWFwKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkbWFwKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IG9iajEgPSB7XG4gICAgICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgICAgICAgXCIxMDA4MlwiOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCAxXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSAxXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiMTAwODRcIjoge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgMlwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgMlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIE1hcCBJbnN0YW5jZS4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoYnVpbGRNYXAoe30sICcnKSkudG8uYmUuaW5zdGFuY2VPZihNYXApO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtvYmoxLCAnZGF0YXNldC4qJywgJ2FkZHJlc3MnLCAne1wiZGF0YXNldC4xMDA4MlwiOlwiSGVyZSAxXCIsXCJkYXRhc2V0LjEwMDg0XCI6XCJIZXJlIDJcIn0nXSxcbiAgICAgICAgICAgIFtvYmoxLCAneCcsIHVuZGVmaW5lZCwgJ3t9J10sXG4gICAgICAgICAgICBbb2JqMSwgJ2RhdGFzZXQuKicsICduYW1lJywgJ3tcImRhdGFzZXQuMTAwODJcIjpcIlRlc3QgMVwiLFwiZGF0YXNldC4xMDA4NFwiOlwiVGVzdCAyXCJ9J10sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnYnVpbGRNYXAoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJywnICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnLCcgKyBKU09OLnN0cmluZ2lmeShjKSArICcpIHNob3VsZCByZXR1cm4gJyArIEpTT04uc3RyaW5naWZ5KGQpICsgJyAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBidWlsZE1hcChhLCBiLCBjKTtcbiAgICAgICAgICAgICAgICBsZXQgbSA9IEpTT04uc3RyaW5naWZ5KGNvbnZlcnRNYXBSZXN1bHQodCkpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChtKS50by5iZS5lcXVhbChkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHtwYXJzZURhdGFVUkx9IGZyb20gXCIuLi90eXBlcy9kYXRhdXJsLm1qc1wiO1xuaW1wb3J0IHtpc1N0cmluZ30gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtQcm94eU9ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVPYmplY3R9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi9leHRlbmQubWpzXCI7XG5pbXBvcnQge1BhdGhmaW5kZXJ9IGZyb20gXCIuL3BhdGhmaW5kZXIubWpzXCI7XG5cbmV4cG9ydCB7RGF0YXNvdXJjZX1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEBzaW5jZSAxLjI0LjBcbiAqL1xuY29uc3QgaW50ZXJuYWxEYXRhU3ltYm9sID0gU3ltYm9sKCdpbnRlcm5hbERhdGEnKTtcblxuLyoqXG4gKiBUaGUgZGF0YXNvdXJjZSBjbGFzcyBpcyB0aGUgYmFzaXMgZm9yIGRlYWxpbmcgd2l0aCBkaWZmZXJlbnQgZGF0YSBzb3VyY2VzLlxuICogSXQgcHJvdmlkZXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIGRhdGFcbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtEYXRhc291cmNlfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UubWpzJztcbiAqIG5ldyBEYXRhc291cmNlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQge0RhdGFzb3VyY2V9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RhdGEvZGF0YXNvdXJjZS5tanMnXG4gKlxuICogY2xhc3MgTXlEYXRhc291cmNlIGV4dGVuZHMgRGF0YXNvdXJjZSB7XG4gKiAgXG4gKiB9XG4gKlxuICogY29uc3QgZHMgPSBuZXcgTXlEYXRhc291cmNlKCk7XG4gKlxuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEBzdW1tYXJ5IFRoZSBkYXRhc291cmNlIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgYWNjZXNzIHRvIGRhdGEgb2JqZWN0cy5cbiAqL1xuY2xhc3MgRGF0YXNvdXJjZSBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBuZXcgUHJveHlPYnNlcnZlcih7XG4gICAgICAgICAgICAnb3B0aW9ucyc6IGV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0cylcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0gPSBuZXcgUHJveHlPYnNlcnZlcih7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgIFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGF0dGFjaCBhIG5ldyBvYnNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7RGF0YXNvdXJjZX1cbiAgICAgKi9cbiAgICBhdHRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuICAgICAgICB0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0uYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRldGFjaCBhIG9ic2VydmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgICAqIEByZXR1cm5zIHtEYXRhc291cmNlfVxuICAgICAqL1xuICAgIGRldGFjaE9ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxEYXRhU3ltYm9sXS5kZXRhY2hPYnNlcnZlcihvYnNlcnZlcilcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjb250YWluc09ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0uY29udGFpbnNPYnNlcnZlcihvYnNlcnZlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlZCBjbGFzc2VzIGNhbiBvdmVycmlkZSBhbmQgZXh0ZW5kIHRoaXMgbWV0aG9kIGFzIGZvbGxvd3MuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICogICAgICAgIG15VmFsdWU6dHJ1ZVxuICAgICAqICAgIH0pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb3B0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtEYXRhc291cmNlfVxuICAgICAqL1xuICAgIHNldE9wdGlvbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBuZXcgUGF0aGZpbmRlcih0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KClbJ29wdGlvbnMnXSkuc2V0VmlhKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybiB7RGF0YXNvdXJjZX1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9wdGlvbnMgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvblxuICAgICAqL1xuICAgIHNldE9wdGlvbnMob3B0aW9ucykge1xuXG4gICAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9uc0pTT04ob3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBleHRlbmQoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpWydvcHRpb25zJ10sIHNlbGYuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG5lc3RlZCBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgYnkgcGF0aCBgYS5iLmNgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlXG4gICAgICogQHJldHVybiB7Kn1cbiAgICAgKi9cbiAgICBnZXRPcHRpb24ocGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgUGF0aGZpbmRlcih0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRSZWFsU3ViamVjdCgpWydvcHRpb25zJ10pLmdldFZpYShwYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHJlYWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG4gICAgd3JpdGUoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHJlYWwgb2JqZWN0XG4gICAgICogXG4gICAgICogQHJldHVybiB7T2JqZWN0fEFycmF5fVxuICAgICAqL1xuICAgIGdldCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBzZWxmW2ludGVybmFsRGF0YVN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm4ge0RhdGFzb3VyY2V9XG4gICAgICovXG4gICAgc2V0KGRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGZbaW50ZXJuYWxEYXRhU3ltYm9sXS5zZXRTdWJqZWN0KGRhdGEpO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgb3B0aW9ucyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQganNvbiBkZWZpbml0aW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uc0pTT04oZGF0YSkge1xuICAgIGlmIChpc1N0cmluZyhkYXRhKSkge1xuXG4gICAgICAgIC8vIHRoZSBjb25maWd1cmF0aW9uIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSBkYXRhIHVybC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBkYXRhVXJsID0gcGFyc2VEYXRhVVJMKGRhdGEpO1xuICAgICAgICAgICAgZGF0YSA9IGRhdGFVcmwuY29udGVudDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgIH1cblxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgb2JqID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgIHZhbGlkYXRlT2JqZWN0KG9iaik7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBvcHRpb25zIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBqc29uIGRlZmluaXRpb24gKGFjdHVhbDogJyArIGRhdGEgKyAnKS4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7fTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7RGF0YXNvdXJjZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0RhdGFzb3VyY2UnLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgIGl0KCdzaG91bGQgaW5zdGFuY2Ugb2YgRGF0YXNvdXJjZSAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgRGF0YXNvdXJjZSgpKS50by5iZS5pbnN0YW5jZW9mKERhdGFzb3VyY2UpXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnT3B0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3NldE9wdGlvbiBzaG91bGQgY2hhbmdlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YXNvdXJjZSA9IG5ldyBEYXRhc291cmNlKCk7XG4gICAgICAgICAgICBleHBlY3QoZGF0YXNvdXJjZS5nZXRPcHRpb24oJ2RlZmF1bHQnKSkudG8uYmUudW5kZWZpbmVkXG4gICAgICAgICAgICBkYXRhc291cmNlLnNldE9wdGlvbignZGVmYXVsdCcsIHRydWUpXG4gICAgICAgICAgICBleHBlY3QoZGF0YXNvdXJjZS5nZXRPcHRpb24oJ2RlZmF1bHQnKSkudG8uYmUudHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2V0T3B0aW9ucyBzaG91bGQgc2V0IGFsbCB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhc291cmNlID0gbmV3IERhdGFzb3VyY2UoKTtcbiAgICAgICAgICAgIGV4cGVjdChkYXRhc291cmNlLmdldE9wdGlvbignZGVmYXVsdCcpKS50by5iZS51bmRlZmluZWRcbiAgICAgICAgICAgIGRhdGFzb3VyY2Uuc2V0T3B0aW9ucyh7ZGVmYXVsdDogdHJ1ZX0pXG4gICAgICAgICAgICBleHBlY3QoZGF0YXNvdXJjZS5nZXRPcHRpb24oJ2RlZmF1bHQnKSkudG8uYmUudHJ1ZVxuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgncncnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRhdGFzb3VyY2UgPSBuZXcgRGF0YXNvdXJjZSgpO1xuICAgICAgICBpdCgncmVhZCBzaG91bGQgdGhyb3cgZXhlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gZGF0YXNvdXJjZS5yZWFkKCkpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkIHRocm93IGV4ZXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IGRhdGFzb3VyY2UucmVhZCgpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuICAgIFxuICAgIGRlc2NyaWJlKCdnZXQvc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkYXRhc291cmNlID0gbmV3IERhdGFzb3VyY2UoKTtcbiAgICAgICAgaXQoJ2dldCBzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCggZGF0YXNvdXJjZS5nZXQoKSkudG8uYmUuZXFsKHt9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkIHRocm93IGV4ZXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCBkYXRhc291cmNlLmdldCgpKS50by5iZS5lcWwoe30pO1xuICAgICAgICAgICAgZXhwZWN0KCBkYXRhc291cmNlLnNldCh7YTonbXl2YWx1ZSd9KSkudG8uYmUuaW5zdGFuY2VvZihEYXRhc291cmNlKTtcbiAgICAgICAgICAgIGV4cGVjdCggZGF0YXNvdXJjZS5nZXQoKSkudG8uYmUuZXFsKHthOidteXZhbHVlJ30pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KSIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5cbmltcG9ydCB7aXNBcnJheSwgaXNPYmplY3R9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7Tm9kZX0gZnJvbSBcIi4uL3R5cGVzL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vdHlwZXMvbm9kZWxpc3QubWpzXCI7XG5pbXBvcnQge2Fzc2VtYmxlUGFydHN9IGZyb20gXCIuL2J1aWxkbWFwLm1qc1wiO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuL2V4dGVuZC5tanNcIjtcblxuZXhwb3J0IHtidWlsZFRyZWV9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHBhcmVudFN5bWJvbCA9IFN5bWJvbCgncGFyZW50Jyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHJvb3RTeW1ib2wgPSBTeW1ib2woJ3Jvb3QnKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBidWlsZFRyZWVPcHRpb25zXG4gKiBAcHJvcGVydHkge2FycmF5fSBvcHRpb25zLnJvb3RSZWZlcmVuY2VzPVtudWxsLCB1bmRlZmluZWRdIGRlZmluZXMgdGhlIHZhbHVlcyBmb3IgZWxlbWVudHMgd2l0aG91dCBwYXJlbnRzXG4gKiBAcHJvcGVydHkge01vbnN0ZXIuRGF0YX5leGFtcGxlRmlsdGVyQ2FsbGJhY2t9IG9wdGlvbnMuZmlsdGVyIGZpbHRlcmluZyBvZiB0aGUgdmFsdWVzXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKi9cblxuLyoqXG4gKiBXaXRoIHRoZSBoZWxwIG9mIHRoZSBmdW5jdGlvbiBgYnVpbGRUcmVlKClgLCBub2RlcyBjYW4gYmUgZWFzaWx5IGNyZWF0ZWQgZnJvbSBkYXRhIG9iamVjdHMuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7YnVpbGRUcmVlfSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAbGF0ZXN0L3NvdXJjZS9kYXRhL2J1aWxkdHJlZS5tanMnO1xuICogYnVpbGRUcmVlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSBzdWJqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ3xNb25zdGVyLkRhdGF+ZXhhbXBsZVNlbGVjdG9yQ2FsbGJhY2t9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRJREtleVxuICogQHBhcmFtIHtidWlsZFRyZWVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm4geyp9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5laXRoZXIgYSBzdHJpbmcgbm9yIGEgZnVuY3Rpb25cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdGhlIHNlbGVjdG9yIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgbWFwXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9iamVjdCBoYXMgbm8gdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaWRcbiAqIEBzaW5jZSAxLjI2LjBcbiAqL1xuZnVuY3Rpb24gYnVpbGRUcmVlKHN1YmplY3QsIHNlbGVjdG9yLCBpZEtleSwgcGFyZW50SURLZXksIG9wdGlvbnMpIHtcblxuICAgIGNvbnN0IG5vZGVzID0gbmV3IE1hcDtcblxuICAgIGlmICghaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwge1xuICAgICAgICByb290UmVmZXJlbmNlczogW251bGwsIHVuZGVmaW5lZF0sXG4gICAgICAgIGZpbHRlcjogdW5kZWZpbmVkXG4gICAgfSwgb3B0aW9ucylcblxuICAgIGNvbnN0IGZpbHRlciA9IG9wdGlvbnM/LmZpbHRlcjtcbiAgICBsZXQgcm9vdFJlZmVyZW5jZXMgPSBvcHRpb25zLnJvb3RSZWZlcmVuY2VzO1xuICAgIGlmICghaXNBcnJheShyb290UmVmZXJlbmNlcykpIHtcbiAgICAgICAgcm9vdFJlZmVyZW5jZXMgPSBbcm9vdFJlZmVyZW5jZXNdO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkTWFwID0gYXNzZW1ibGVQYXJ0cyhzdWJqZWN0LCBzZWxlY3RvciwgZmlsdGVyLCBmdW5jdGlvbiAobywgaywgbSkge1xuXG4gICAgICAgIGNvbnN0IGtleSA9IG8/LltpZEtleV1cbiAgICAgICAgbGV0IHJlZiA9IG8/LltwYXJlbnRJREtleV1cbiAgICAgICAgaWYgKHJvb3RSZWZlcmVuY2VzLmluZGV4T2YocmVmKSAhPT0gLTEpIHJlZiA9IHJvb3RTeW1ib2w7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBvYmplY3QgaGFzIG5vIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGlkJylcbiAgICAgICAgfVxuXG4gICAgICAgIG9bcGFyZW50U3ltYm9sXSA9IHJlZjtcblxuICAgICAgICBjb25zdCBub2RlID0gbmV3IE5vZGUobyk7XG4gICAgICAgIHRoaXMuaGFzKHJlZikgPyB0aGlzLmdldChyZWYpLmFkZChub2RlKSA6IHRoaXMuc2V0KHJlZiwgbmV3IE5vZGVMaXN0KCkuYWRkKG5vZGUpKTtcbiAgICAgICAgbm9kZXMuc2V0KGtleSwgbm9kZSk7XG5cbiAgICB9KVxuXG4gICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgXG4gICAgICAgIGxldCBpZCA9IG5vZGU/LlsndmFsdWUnXT8uW2lkS2V5XTtcblxuICAgICAgICBpZiAoY2hpbGRNYXAuaGFzKGlkKSkge1xuICAgICAgICAgICAgbm9kZS5jaGlsZE5vZGVzID0gY2hpbGRNYXAuZ2V0KGlkKTtcbiAgICAgICAgICAgIGNoaWxkTWFwLmRlbGV0ZShpZClcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBsaXN0ID0gbmV3IE5vZGVMaXN0O1xuXG4gICAgY2hpbGRNYXAuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICBpZiAocyBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgbGlzdC5hZGQobik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBsaXN0O1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtidWlsZFRyZWV9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9idWlsZHRyZWUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdidWlsZFRyZWUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnZXhhbXBsZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biBleGFtcGxlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBvYmplY3RzID0ge1xuICAgICAgICAgICAgICAgIGRhdGFzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgXCIxXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidmVoaWNsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsXG5cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCIyXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIjJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiY2FyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiM1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRydWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiNFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCI0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1vdG9yY3ljbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIxXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCI1XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIjVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU1VWXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMlwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiNlwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogXCI2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNwb3J0cyBjYXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIyXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBidWlsZFRyZWUob2JqZWN0cywgJ2RhdGFzZXQuKicsICdpZCcsICdwYXJlbnQnKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVzKS50by5iZS5pbnN0YW5jZU9mKE5vZGVMaXN0KTtcbiAgICAgICAgICAgIGV4cGVjdChub2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgICAgICAgICAgZXhwZWN0KG5vZGVzLnRvU3RyaW5nKCkpLnRvLmJlLmVxdWFsKCd7XCJpZFwiOlwiMVwiLFwibmFtZVwiOlwidmVoaWNsZVwiLFwicGFyZW50XCI6bnVsbH1cXG4gXHUyNTFDe1wiaWRcIjpcIjJcIixcIm5hbWVcIjpcImNhclwiLFwicGFyZW50XCI6XCIxXCJ9XFxuIHwgXHUyNTFDe1wiaWRcIjpcIjVcIixcIm5hbWVcIjpcIlNVVlwiLFwicGFyZW50XCI6XCIyXCJ9XFxuIHwgXHUyNTE0e1wiaWRcIjpcIjZcIixcIm5hbWVcIjpcInNwb3J0cyBjYXJcIixcInBhcmVudFwiOlwiMlwifVxcbiBcdTI1MUN7XCJpZFwiOlwiM1wiLFwibmFtZVwiOlwidHJ1Y2tcIixcInBhcmVudFwiOlwiMVwifVxcbiBcdTI1MTR7XCJpZFwiOlwiNFwiLFwibmFtZVwiOlwibW90b3JjeWNsZVwiLFwicGFyZW50XCI6XCIxXCJ9JyApO1xuXG5cbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2J1aWxkVHJlZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBvYmoxID0ge1xuICAgICAgICAgICAgZGF0YXNldDoge1xuICAgICAgICAgICAgICAgIFwiMVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDFcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDFcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsXG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiMlwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjJcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDJcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDJcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjFcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCIzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiM1wiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgM1wiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgM1wiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjRcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCI0XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCA0XCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSA0XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiNVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjVcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDVcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDVcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjFcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI2XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgNlwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgNlwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiNFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIE5vZGUgSW5zdGFuY2UuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGJ1aWxkVHJlZSh7fSwgJycpKS50by5iZS5pbnN0YW5jZU9mKE5vZGVMaXN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW29iajEsICdkYXRhc2V0LionLCAne1wiaWRcIjpcIjFcIixcIm5hbWVcIjpcIlRlc3QgMVwiLFwiYWRkcmVzc1wiOlwiSGVyZSAxXCIsXCJwYXJlbnRcIjpudWxsfVxcbiBcdTI1MUN7XCJpZFwiOlwiMlwiLFwibmFtZVwiOlwiVGVzdCAyXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDJcIixcInBhcmVudFwiOlwiMVwifVxcbiB8IFx1MjUxQ3tcImlkXCI6XCIzXCIsXCJuYW1lXCI6XCJUZXN0IDNcIixcImFkZHJlc3NcIjpcIkhlcmUgM1wiLFwicGFyZW50XCI6XCIyXCJ9XFxuIHwgXHUyNTE0e1wiaWRcIjpcIjRcIixcIm5hbWVcIjpcIlRlc3QgNFwiLFwiYWRkcmVzc1wiOlwiSGVyZSA0XCIsXCJwYXJlbnRcIjpcIjJcIn1cXG4gfCB8IFx1MjUxNHtcImlkXCI6XCI2XCIsXCJuYW1lXCI6XCJUZXN0IDZcIixcImFkZHJlc3NcIjpcIkhlcmUgNlwiLFwicGFyZW50XCI6XCI0XCJ9XFxuIFx1MjUxNHtcImlkXCI6XCI1XCIsXCJuYW1lXCI6XCJUZXN0IDVcIixcImFkZHJlc3NcIjpcIkhlcmUgNVwiLFwicGFyZW50XCI6XCIxXCJ9J10sXG4gICAgICAgICAgICBbb2JqMSwgJ3gnLCAnJ10sXG4gICAgICAgICAgICBbb2JqMSwgJ2RhdGFzZXQuKicsICd7XCJpZFwiOlwiMVwiLFwibmFtZVwiOlwiVGVzdCAxXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDFcIixcInBhcmVudFwiOm51bGx9XFxuIFx1MjUxQ3tcImlkXCI6XCIyXCIsXCJuYW1lXCI6XCJUZXN0IDJcIixcImFkZHJlc3NcIjpcIkhlcmUgMlwiLFwicGFyZW50XCI6XCIxXCJ9XFxuIHwgXHUyNTFDe1wiaWRcIjpcIjNcIixcIm5hbWVcIjpcIlRlc3QgM1wiLFwiYWRkcmVzc1wiOlwiSGVyZSAzXCIsXCJwYXJlbnRcIjpcIjJcIn1cXG4gfCBcdTI1MTR7XCJpZFwiOlwiNFwiLFwibmFtZVwiOlwiVGVzdCA0XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDRcIixcInBhcmVudFwiOlwiMlwifVxcbiB8IHwgXHUyNTE0e1wiaWRcIjpcIjZcIixcIm5hbWVcIjpcIlRlc3QgNlwiLFwiYWRkcmVzc1wiOlwiSGVyZSA2XCIsXCJwYXJlbnRcIjpcIjRcIn1cXG4gXHUyNTE0e1wiaWRcIjpcIjVcIixcIm5hbWVcIjpcIlRlc3QgNVwiLFwiYWRkcmVzc1wiOlwiSGVyZSA1XCIsXCJwYXJlbnRcIjpcIjFcIn0nXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2J1aWxkVHJlZSgnICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnLCcgKyBKU09OLnN0cmluZ2lmeShiKSArICcpIHNob3VsZCByZXR1cm4gJyArIEpTT04uc3RyaW5naWZ5KGMpICsgJyAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVsaXN0ID0gYnVpbGRUcmVlKGEsIGIsICdpZCcsICdwYXJlbnQnKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qobm9kZWxpc3QudG9TdHJpbmcoKSkudG8uYmUuZXFsKGMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdidWlsZFRyZWUoKSB0ZXN0IDInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIDJcbiAgICAgICAgICogICAgMVxuICAgICAgICAgKiAgICAzXG4gICAgICAgICAqIDRcbiAgICAgICAgICogICAgNlxuICAgICAgICAgKiA1XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgb2JqMSA9IHtcbiAgICAgICAgICAgIGRhdGFzZXQ6IHtcbiAgICAgICAgICAgICAgICBcIjFcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCAxXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSAxXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiMlwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjJcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDJcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDJcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjBcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCIzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiM1wiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgM1wiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgM1wiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjRcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCI0XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCA0XCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSA0XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIwXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiNVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjVcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDVcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDVcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjBcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI2XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNlwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgNlwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgNlwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiNFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjdcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCI3XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCA3XCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSA3XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIxXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gTm9kZSBJbnN0YW5jZS4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoYnVpbGRUcmVlKHt9LCAnJykpLnRvLmJlLmluc3RhbmNlT2YoTm9kZUxpc3QpO1xuICAgICAgICB9KTtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbb2JqMSwgJ2RhdGFzZXQuKicsICd7XCJpZFwiOlwiMlwiLFwibmFtZVwiOlwiVGVzdCAyXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDJcIixcInBhcmVudFwiOlwiMFwifVxcbiBcdTI1MUN7XCJpZFwiOlwiMVwiLFwibmFtZVwiOlwiVGVzdCAxXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDFcIixcInBhcmVudFwiOlwiMlwifVxcbiB8IFx1MjUxNHtcImlkXCI6XCI3XCIsXCJuYW1lXCI6XCJUZXN0IDdcIixcImFkZHJlc3NcIjpcIkhlcmUgN1wiLFwicGFyZW50XCI6XCIxXCJ9XFxuIFx1MjUxNHtcImlkXCI6XCIzXCIsXCJuYW1lXCI6XCJUZXN0IDNcIixcImFkZHJlc3NcIjpcIkhlcmUgM1wiLFwicGFyZW50XCI6XCIyXCJ9XFxue1wiaWRcIjpcIjRcIixcIm5hbWVcIjpcIlRlc3QgNFwiLFwiYWRkcmVzc1wiOlwiSGVyZSA0XCIsXCJwYXJlbnRcIjpcIjBcIn1cXG4gXHUyNTE0e1wiaWRcIjpcIjZcIixcIm5hbWVcIjpcIlRlc3QgNlwiLFwiYWRkcmVzc1wiOlwiSGVyZSA2XCIsXCJwYXJlbnRcIjpcIjRcIn1cXG57XCJpZFwiOlwiNVwiLFwibmFtZVwiOlwiVGVzdCA1XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDVcIixcInBhcmVudFwiOlwiMFwifSddLFxuICAgICAgICAgICAgW29iajEsICd4JywgJyddLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnYnVpbGRUcmVlKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcsJyArIEpTT04uc3RyaW5naWZ5KGIpICsgJykgc2hvdWxkIHJldHVybiAnICsgSlNPTi5zdHJpbmdpZnkoYykgKyAnICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZWxpc3QgPSBidWlsZFRyZWUoYSwgYiwgJ2lkJywgJ3BhcmVudCcsIHtcbiAgICAgICAgICAgICAgICAgICAgcm9vdFJlZmVyZW5jZXM6IFsnMCddXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3Qobm9kZWxpc3QudG9TdHJpbmcoKSkudG8uYmUuZXF1YWwoYyk7XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1RyYW5zZm9ybWVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvdHJhbnNmb3JtZXIubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmRlc2NyaWJlKCdUcmFuc2Zvcm1lcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIHByb21pc2VzLnB1c2goaW5pdEpTRE9NKCkpO1xuICAgICAgICBpZighZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1RyYW5zZm9ybWVyLnJ1bigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnPz86YScsIG51bGwsICdhJ10sXG4gICAgICAgICAgICBbJz8/OmEnLCB1bmRlZmluZWQsICdhJ10sXG4gICAgICAgICAgICBbJz8/OmEnLCAndHJ1ZScsICd0cnVlJ10sXG4gICAgICAgICAgICBbJz8/OmEnLCBmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgWycgaWY6YTogJywgZmFsc2UsIHVuZGVmaW5lZF0sIC8vIHdpdGhvdXQgXFxcXFxuICAgICAgICAgICAgWycgaWY6YTpcXFxcICcsIGZhbHNlLCBcIiBcIl0sXG4gICAgICAgICAgICBbJyBpZjphOlxcXFwgJywgdHJ1ZSwgXCJhXCJdLFxuICAgICAgICAgICAgWydkZWZhdWx0OnllcycsIG51bGwsICd5ZXMnXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDp5ZXMnLCB1bmRlZmluZWQsICd5ZXMnXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDoxOmJvb2wnLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgWydkZWZhdWx0Om9uOmJvb2wnLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgWydkZWZhdWx0OnRydWU6Ym9vbCcsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6eWVzOmJvb2wnLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgWydkZWZhdWx0OnVuZGVmaW5lZDpib29sJywgdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6ZmFsc2U6Ym9vbCcsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWydkZWZhdWx0OjE6aW50JywgdW5kZWZpbmVkLCAxXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDoxOnN0cmluZycsIHVuZGVmaW5lZCwgJzEnXSxcbiAgICAgICAgICAgIFsnZmlyc3Qta2V5Jywge2E6IDEsIGM6IDMsIGI6IDJ9LCAxXSxcbiAgICAgICAgICAgIFsnbGFzdC1rZXknLCB7YTogMSwgYzogMywgYjogMn0sIDNdLFxuICAgICAgICAgICAgWydudGgtbGFzdC1rZXk6MCcsIHthOiAxLCBjOiAzLCBiOiAyfSwgM10sXG4gICAgICAgICAgICBbJ250aC1sYXN0LWtleToxJywge2E6IDEsIGM6IDMsIGI6IDJ9LCAyXSxcbiAgICAgICAgICAgIFsnbnRoLWxhc3Qta2V5OjInLCB7YTogMSwgYzogMywgYjogMn0sIDFdLFxuICAgICAgICAgICAgWydudGgta2V5OjInLCB7YTogMSwgYjogMiwgYzogM30sIDNdLFxuICAgICAgICAgICAgWydudGgta2V5OjAnLCB7YzogMywgYTogMSwgYjogMn0sIDFdLFxuICAgICAgICAgICAgWydudGgta2V5OjInLCB7YTogMSwgYzogMywgYjogMn0sIDNdLFxuICAgICAgICAgICAgWydwcmVmaXg6SGVsbG9cXFxcICcsICd0ZXN0JywgXCJIZWxsbyB0ZXN0XCJdLFxuICAgICAgICAgICAgWyd0b2pzb24nLCB7YTogNH0sIFwie1xcXCJhXFxcIjo0fVwiXSxcbiAgICAgICAgICAgIFsncHJlZml4OmFcXFxcXFxcXDogJywgJ3Rlc3QnLCBcImFcXFxcdGVzdFwiXSxcbiAgICAgICAgICAgIFsncHJlZml4OmFcXFxcICcsICd0ZXN0JywgXCJhIHRlc3RcIl0sXG4gICAgICAgICAgICBbJ3N0YXRpYzphYmM6YTpiOngnLCBcInRlc3RcIiwgXCJhYmM6YTpiOnhcIl0sXG4gICAgICAgICAgICBbJ3RvbG93ZXJjYXNlJywgXCJBOmI6Q3NlNFwiLCBcImE6Yjpjc2U0XCJdLFxuICAgICAgICAgICAgWyd0b3VwcGVyJywgXCJBOmI6Q3NlNFwiLCBcIkE6QjpDU0U0XCJdLFxuICAgICAgICAgICAgWyd0b3N0cmluZycsIDUsIFwiNVwiXSxcbiAgICAgICAgICAgIFsndG9zdHJpbmcnLCBbMSwgMiwgMywge31dLCBcIjEsMiwzLFtvYmplY3QgT2JqZWN0XVwiXSxcbiAgICAgICAgICAgIFsndG9pbnRlZ2VyJywgXCI1XCIsIDVdLFxuICAgICAgICAgICAgWyd0cmltJywgXCIgNSBcIiwgXCI1XCJdLFxuICAgICAgICAgICAgWyd0cmltJywgXCIgYVwiLCBcImFcIl0sXG4gICAgICAgICAgICBbJ3RyaW0nLCBcIiBcIiwgXCJcIl0sXG4gICAgICAgICAgICBbJ3Jhd3VybGVuY29kZScsIFwiXHUwMEZDXHUwMEY2XHUwMEU0XCIsIFwiJUMzJUJDJUMzJUI2JUMzJUE0XCJdLFxuICAgICAgICAgICAgWydjYWxsOnRlc3RjYWxsYmFjazo0OjU6NicsIFwidGVzdFwiLCBcInRlc3Q0NTZcIl0sXG4gICAgICAgICAgICBbJ3BsYWluJywgJ3Q8YnI+ZXN0JywgXCJ0ZXN0XCJdLFxuICAgICAgICAgICAgWydpZjphOmInLCB0cnVlLCBcImFcIl0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsICdvbicsIFwiYVwiXSxcbiAgICAgICAgICAgIFsnaWY6YTpiJywgJ3RydWUnLCBcImFcIl0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsICdmYWxzZScsIFwiYlwiXSxcbiAgICAgICAgICAgIFsnaWY6YTpiJywgOSwgXCJhXCJdLFxuICAgICAgICAgICAgWydpZjphOmInLCAnJywgXCJiXCJdLFxuICAgICAgICAgICAgWydpZjphOmInLCB1bmRlZmluZWQsIFwiYlwiXSxcbiAgICAgICAgICAgIFsnaWY6YTpiJywgZmFsc2UsIFwiYlwiXSxcbiAgICAgICAgICAgIFsndWNmaXJzdCcsICdjYXInLCBcIkNhclwiXSxcbiAgICAgICAgICAgIFsndWNmaXJzdCcsICdjQXInLCBcIkNBclwiXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDp0ZXN0JywgJ2EnLCBcImFcIl0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6dGVzdCcsIHVuZGVmaW5lZCwgXCJ0ZXN0XCJdLFxuICAgICAgICAgICAgWydmcm9tanNvbicsICd7fScsIHt9XSxcbiAgICAgICAgICAgIFsnZnJvbWpzb24nLCAne1wiYVwiOjF9Jywge2E6IDF9XSxcbiAgICAgICAgICAgIFsndWN3b3JkcycsICdjQXIgcnVucycsIFwiQ0FyIFJ1bnNcIl0sXG4gICAgICAgICAgICBbJ3RvaW50ZWdlcicsICc2JywgNl0sXG4gICAgICAgICAgICBbJ2xlbmd0aCcsICd0ZXN0JywgNF0sXG4gICAgICAgICAgICBbJ3RvLWJhc2U2NCcsICdIZWxsbyBXb3JsZCEnLCBcIlNHVnNiRzhnVjI5eWJHUWhcIl0sXG4gICAgICAgICAgICBbJ2Zyb20tYmFzZTY0JywgJ1NHVnNiRzhnVjI5eWJHUWgnLCBcIkhlbGxvIFdvcmxkIVwiXSxcbiAgICAgICAgICAgIFsndG8tYmFzZTY0JywgJ3Rlc3QnLCBcImRHVnpkQT09XCJdLFxuICAgICAgICAgICAgWydmcm9tLWJhc2U2NCcsIFwiZEdWemRBPT1cIiwgJ3Rlc3QnXSxcbiAgICAgICAgICAgIFsncHJlZml4OmEnLCAndGVzdCcsIFwiYXRlc3RcIl0sXG4gICAgICAgICAgICBbJ3N1ZmZpeDphJywgJ3Rlc3QnLCBcInRlc3RhXCJdLFxuICAgICAgICAgICAgWydpbmRleDphJywge2E6IDR9LCA0XSxcbiAgICAgICAgICAgIFsnaW5kZXg6MicsIFsyLCA0LCA3XSwgN10sXG4gICAgICAgICAgICBbJ2luZGV4Ong6dGVzdCcsIFsyLCA0LCA3XSwgJ3Rlc3QnXSxcbiAgICAgICAgICAgIFsncGF0aDphLmIuYycsIHthOiB7Yjoge2M6IDR9fX0sIDRdLFxuICAgICAgICAgICAgWydwYXRoOmEuYi5kJywge2E6IHtiOiB7YzogNH19fSwgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgIFsnaW5kZXg6YScsIG5ldyBNYXAoKS5zZXQoJ2EnLCA1KSwgNV0sXG4gICAgICAgICAgICBbJ3N1YnN0cmluZzoyOjQnLCAnYWJjZGVmZ2hpamtsbW5vcCcsICdjZGVmJ10sXG4gICAgICAgICAgICBbJ25vcCcsICdhYmNkZWZnaGlqa2xtbm9wJywgJ2FiY2RlZmdoaWprbG1ub3AnXSxcblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnVHJhbnNmb3JtZXIucnVuKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbmV3IFRyYW5zZm9ybWVyKGEpO1xuXG4gICAgICAgICAgICAgICAgdC5zZXRDYWxsYmFjaygndGVzdGNhbGxiYWNrJywgZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiICsgYyArIGQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdC5ydW4oYik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHIpLnRvLmJlLmVxbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1RyYW5zZm9ybWVyLnJ1bigpIHRocm93cyBFcnJvcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3RvbG93ZXJjYXNlJywgW11dLFxuICAgICAgICAgICAgWyd0b2xvd2VyY2FzZScsIHt9XSxcbiAgICAgICAgICAgIFsndG9sb3dlcmNhc2UnLCA0LjVdLFxuICAgICAgICAgICAgWyd0b3VwcGVyJywgdHJ1ZV0sXG4gICAgICAgICAgICBbJ3RvdXBwZXInLCA1XSxcbiAgICAgICAgICAgIFsndG9pbnRlZ2VyJywgXCJhXCJdLFxuICAgICAgICAgICAgWyd0cmltJywgNV0sXG4gICAgICAgICAgICBbJ3RyaW0nLCB0cnVlXSxcbiAgICAgICAgICAgIFsndHJpbScsIHt9XSxcbiAgICAgICAgICAgIFsndHJpbScsIFtdXSxcbiAgICAgICAgICAgIFsncmF3dXJsZW5jb2RlJywgW11dLFxuICAgICAgICAgICAgWydpZjphOmInLCB7fV0sXG4gICAgICAgICAgICBbJ3Vjd29yZHMnLCB7fV0sXG4gICAgICAgICAgICBbJ3Vjd29yZHMnLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ3Vjd29yZHMnLCA0XSxcbiAgICAgICAgICAgIFsncGF0aDphLmIuYycsIFwiXCIsIDRdLFxuICAgICAgICAgICAgWyd0b2ludGVnZXInLCB7fV0sXG4gICAgICAgICAgICBbJ2Jhc2U2NCcsIHt9XSxcbiAgICAgICAgICAgIFsnZnJvbWpzb24nLCAnJ10sXG4gICAgICAgICAgICBbJ3ByZWZpeCcsIHt9XSxcbiAgICAgICAgICAgIFsnc3VmZml4Jywge31dLFxuICAgICAgICAgICAgWydpbmRleCcsIFwidGVzdFwiXSxcbiAgICAgICAgICAgIFsneHh4eHh4JywgXCJ0ZXN0XCJdLCAvLyB1bnN1cHBvcnRlZCBjb21tYW5kXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ1RyYW5zZm9ybWVyLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnKS5ydW4oJyArIEpTT04uc3RyaW5naWZ5KGIpICsgJykgc2hvdWxkIHRocm93IEVycm9yICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IG5ldyBUcmFuc2Zvcm1lcihhKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gdC5ydW4oYikpLnRvLnRocm93KEVycm9yKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCduZXcgVHJhbnNmb3JtZXIoKS5ydW4oXCJ1bmlxaWRcIiknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCB0ID0gbmV3IFRyYW5zZm9ybWVyKCd1bmlxaWQnKTtcbiAgICAgICAgICAgIGV4cGVjdCh0LnJ1bihcIlwiKSkudG8uYmUuYSgnc3RyaW5nJyk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbmV3IFRyYW5zZm9ybWVyKCkucnVuKFwiZGVmYXVsdDpleUppSWpveGZRPT06b2JqZWN0XCIpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdCA9IG5ldyBUcmFuc2Zvcm1lcignZGVmYXVsdDpleUppSWpveGZRPT06b2JqZWN0Jyk7XG4gICAgICAgICAgICBleHBlY3QodC5ydW4odW5kZWZpbmVkKSkudG8uZXFsKHtiOiAxfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCduZXcgVHJhbnNmb3JtZXIoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBUcmFuc2Zvcm1lcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgVHJhbnNmb3JtZXIoXCJcIikpLnRvLmluc3RhbmNlT2YoVHJhbnNmb3JtZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIFRyYW5zZm9ybWVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBUcmFuc2Zvcm1lcihcInN1ZmZpeDphYmNcIikpLnRvLmluc3RhbmNlT2YoVHJhbnNmb3JtZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZmFsc2UgYXMgYXJndW1lbnQgc2hvdWxkIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbmV3IFRyYW5zZm9ybWVyKGZhbHNlKVxuICAgICAgICAgICAgfSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ29iamVjdCBhcyBhcmd1bWVudCBzaG91bGQgdGhyb3cgVHlwZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtZXIoe30pXG4gICAgICAgICAgICB9KS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn0pOyIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7UGF0aGZpbmRlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL3BhdGhmaW5kZXIubWpzXCI7XG5cbmRlc2NyaWJlKCdQYXRoZmluZGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IGNvbnZlcnRNYXBSZXN1bHQgPSBmdW5jdGlvbiAocikge1xuICAgICAgICBpZiAociBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgciA9IE9iamVjdC5mcm9tRW50cmllcyhyKTtcbiAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByID0gci5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRNYXBSZXN1bHQoZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHIgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCBvXSBvZiBPYmplY3QuZW50cmllcyhyKSkge1xuICAgICAgICAgICAgICAgICAgICByW2tdID0gY29udmVydE1hcFJlc3VsdChvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICB9XG5cblxuICAgIGRlc2NyaWJlKCd3aXRoIFdpbGRjYXJkIGFuZCBJdGVyYXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgcGYsIG9iajtcblxuICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG9iaiA9IHtcbiAgICAgICAgICAgICAgICBhOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFwiMS0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCIxLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkOiAnISdcblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBcIjItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFwiMi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZDogJz8nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZiA9IG5ldyBQYXRoZmluZGVyKG9iaik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnYS4qLmIuKicsICd7XCIwXCI6e1wiMFwiOntcImNcIjpcIjEtMVwifSxcIjFcIjp7XCJjXCI6XCIxLTJcIn19LFwiMVwiOntcIjBcIjp7XCJjXCI6XCIyLTFcIn0sXCIxXCI6e1wiY1wiOlwiMi0yXCJ9fX0nXSxcbiAgICAgICAgICAgIFsnYS4qLmInLCAne1wiMFwiOlt7XCJjXCI6XCIxLTFcIn0se1wiY1wiOlwiMS0yXCJ9XSxcIjFcIjpbe1wiY1wiOlwiMi0xXCJ9LHtcImNcIjpcIjItMlwifV19J10sXG4gICAgICAgICAgICBbJ2EuMS5iJywgJ1t7XCJjXCI6XCIyLTFcIn0se1wiY1wiOlwiMi0yXCJ9XSddLFxuICAgICAgICAgICAgWydhLjAuYicsICdbe1wiY1wiOlwiMS0xXCJ9LHtcImNcIjpcIjEtMlwifV0nXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgICAgIGl0KCcuc2V0VmlhKCcgKyBhICsgJykgc2hvdWxkIHJlc3VsdCBpbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCByID0gcGYuZ2V0VmlhKGEpO1xuICAgICAgICAgICAgICAgIGxldCBpID0gY29udmVydE1hcFJlc3VsdChyKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoaSkpLmlzLmVxdWFsKGIpO1xuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdhcGkgdGVzdHMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IHBhdGhmaW5kZXIsIG9iamVjdDtcblxuXG4gICAgICAgIGNsYXNzIEEge1xuICAgICAgICAgICAgZ2V0IGEoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICBvYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgXCJ0ZXN0MVwiLCBmYWxzZSwgdW5kZWZpbmVkLCBwYXJzZUludChcImFcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGY6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiBbXCJ0ZXN0MlwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBqOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGs6IChuZXcgTWFwKS5zZXQoJ20nLCB7bjogM30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgbDogKG5ldyBTZXQpLmFkZCh7bjogNH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGI6IG5ldyBBXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBwYXRoZmluZGVyID0gbmV3IFBhdGhmaW5kZXIob2JqZWN0KTtcblxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdjcmVhdGUgbmV3IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsxMl0sXG4gICAgICAgICAgICAgICAgW3VuZGVmaW5lZF0sXG4gICAgICAgICAgICAgICAgW251bGxdLFxuICAgICAgICAgICAgICAgIFtcInRlc3RcIl1cbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSB0eXBlb2YgYTtcbiAgICAgICAgICAgICAgICBpZiAoYSA9PT0gbnVsbCkgbGFiZWwgPSAnbnVsbCc7XG5cblxuICAgICAgICAgICAgICAgIGl0KGxhYmVsICsgJyBzaG91bGQgdGhyb3cgZXJyb3InLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoZmluZGVyKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KEVycm9yKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJy5zZXRWaWEoeCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBwZiwgb2JqO1xuXG4gICAgICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBvYmogPSB7fVxuICAgICAgICAgICAgICAgIHBmID0gbmV3IFBhdGhmaW5kZXIob2JqKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydhLmIuMC4wLmMnLCB0cnVlLCAne1wiYVwiOntcImJcIjpbW3tcImNcIjp0cnVlfV1dfX0nXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi4wLmMnLCB0cnVlLCAne1wiYVwiOntcImJcIjpbe1wiY1wiOnRydWV9XX19J10sXG4gICAgICAgICAgICAgICAgWydhLmIuMy5jJywgdHJ1ZSwgJ3tcImFcIjp7XCJiXCI6W251bGwsbnVsbCxudWxsLHtcImNcIjp0cnVlfV19fSddLFxuICAgICAgICAgICAgICAgIFsnYS5iLmMnLCB0cnVlLCAne1wiYVwiOntcImJcIjp7XCJjXCI6dHJ1ZX19fSddXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgICAgICAgICBpdCgnLnNldFZpYSgnICsgYSArICcsICcgKyBiICsgJykgc2hvdWxkIHJlc3VsdCBpbiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBwZi5zZXRWaWEoYSwgYilcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KG9iaikpLmlzLmVxdWFsKGMpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJy5zZXRWaWEoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IGE7XG4gICAgICAgICAgICBsZXQgYjtcbiAgICAgICAgICAgIGxldCBjO1xuXG4gICAgICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBhID0gXCJhLnhcIjtcbiAgICAgICAgICAgICAgICBiID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgYyA9IFwiYS55LmRcIjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCcuc2V0VmlhKCcgKyBhICsgJywgJyArIGIgKyAnKSBzaG91bGQgcmV0dXJuIFBhdGhmaW5kZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHBhdGhmaW5kZXIuc2V0VmlhKGEsIGIpKS5pcy5pbnN0YW5jZU9mKFBhdGhmaW5kZXIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCcuc2V0VmlhKCcgKyBhICsgJywgJyArIGIgKyAnKSBzaG91bGQgY2hhbmdlIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwYXRoZmluZGVyLnNldFZpYShhLCBiKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkob2JqZWN0KSkuaXMuZXF1YWwoJ3tcImFcIjp7XCJiXCI6e1wiY1wiOls0LFwidGVzdDFcIixmYWxzZSxudWxsLG51bGxdLFwiZVwiOmZhbHNlLFwiZlwiOlt7XCJnXCI6ZmFsc2UsXCJoXCI6MyxcImlcIjpbXCJ0ZXN0MlwiXX1dLFwialwiOnt9LFwia1wiOnt9LFwibFwiOnt9fSxcInhcIjpcInRydWVcIn0sXCJiXCI6e319Jyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJy5zZXRWaWEoJyArIGMgKyAnLCAnICsgYiArICcpIHNob3VsZCBjaGFuZ2Ugb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHBhdGhmaW5kZXIuc2V0VmlhKGMsIGIpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShvYmplY3QpKS5pcy5lcXVhbCgne1wiYVwiOntcImJcIjp7XCJjXCI6WzQsXCJ0ZXN0MVwiLGZhbHNlLG51bGwsbnVsbF0sXCJlXCI6ZmFsc2UsXCJmXCI6W3tcImdcIjpmYWxzZSxcImhcIjozLFwiaVwiOltcInRlc3QyXCJdfV0sXCJqXCI6e30sXCJrXCI6e30sXCJsXCI6e319LFwieVwiOntcImRcIjpcInRydWVcIn19LFwiYlwiOnt9fScpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBkZXNjcmliZSgnLmV4aXN0cygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnYS5iLmMuMScsIHRydWVdLFxuICAgICAgICAgICAgICAgIFsnYi5hJywgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgWydhLmIueCcsIGZhbHNlXSxcbiAgICAgICAgICAgICAgICBbJ2EueCcsIGZhbHNlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5xJywgZmFsc2VdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmMuMCcsIHRydWVdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmQnLCB0cnVlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5mLjAuZycsIHRydWVdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmYuMC5pLjAnLCB0cnVlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5mLjAuaS4yJywgZmFsc2VdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmUnLCB0cnVlXSxcbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgICAgICAgICBpdCgnLmV4aXN0cygnICsgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIgKyAnICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHBhdGhmaW5kZXIuZXhpc3RzKGEpKS5pcy5lcXVhbChiKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCcuZGVsZXRlVmlhKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydhLmIuZScsICd7XCJhXCI6e1wiYlwiOntcImNcIjpbNCxcInRlc3QxXCIsZmFsc2UsbnVsbCxudWxsXSxcImZcIjpbe1wiZ1wiOmZhbHNlLFwiaFwiOjMsXCJpXCI6W1widGVzdDJcIl19XSxcImpcIjp7fSxcImtcIjp7fSxcImxcIjp7fX19LFwiYlwiOnt9fSddLFxuICAgICAgICAgICAgICAgIFsnYS5iLmYnLCAne1wiYVwiOntcImJcIjp7XCJjXCI6WzQsXCJ0ZXN0MVwiLGZhbHNlLG51bGwsbnVsbF0sXCJlXCI6ZmFsc2UsXCJqXCI6e30sXCJrXCI6e30sXCJsXCI6e319fSxcImJcIjp7fX0nXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5qJywgJ3tcImFcIjp7XCJiXCI6e1wiY1wiOls0LFwidGVzdDFcIixmYWxzZSxudWxsLG51bGxdLFwiZVwiOmZhbHNlLFwiZlwiOlt7XCJnXCI6ZmFsc2UsXCJoXCI6MyxcImlcIjpbXCJ0ZXN0MlwiXX1dLFwia1wiOnt9LFwibFwiOnt9fX0sXCJiXCI6e319J10sXG5cbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICAgICAgaXQoJy5kZWxldGVWaWEoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiICsgJyAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGhmaW5kZXIuZGVsZXRlVmlhKGEpXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShvYmplY3QpKS5pcy5lcXVhbChiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnLmdldFZpYSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGVzY3JpYmUoJy5nZXRWaWEoKScsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgICAgICAgICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgXCJ0ZXN0MVwiLCBmYWxzZSwgdW5kZWZpbmVkLCBwYXJzZUludChcImFcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTogW1widGVzdDJcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgajoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs6IChuZXcgTWFwKS5zZXQoJ20nLCB7bjogM30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsOiAobmV3IFNldCkuYWRkKHtuOiA0fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG86IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwOiB7cTogMSwgcjogdHJ1ZX19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3A6IHtxOiAyLCByOiB0cnVlfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cDoge3E6IDMsIHI6IHRydWV9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwOiB7cTogNCwgcjogdHJ1ZX19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3A6IHtxOiA1LCByOiB0cnVlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDoge2E6IDF9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdToge2E6IDJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjoge2E6IDN9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDoge2E6IDR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcGF0aGZpbmRlciA9IG5ldyBQYXRoZmluZGVyKG9iamVjdCk7XG5cblxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBbJ2EuKicsICdbW1wiYlwiLHtcImNcIjpbNCxcInRlc3QxXCIsZmFsc2UsbnVsbCxudWxsXSxcImVcIjpmYWxzZSxcImZcIjpbe1wiZ1wiOmZhbHNlLFwiaFwiOjMsXCJpXCI6W1widGVzdDJcIl19XSxcImpcIjp7fSxcImtcIjp7fSxcImxcIjp7fSxcIm9cIjpbe1wicFwiOntcInFcIjoxLFwiclwiOnRydWV9fSx7XCJwXCI6e1wicVwiOjIsXCJyXCI6dHJ1ZX19LHtcInBcIjp7XCJxXCI6MyxcInJcIjp0cnVlfX0se1wicFwiOntcInFcIjo0LFwiclwiOnRydWV9fSx7XCJwXCI6e1wicVwiOjUsXCJyXCI6dHJ1ZX19XSxcInNcIjp7XCJ0XCI6e1wiYVwiOjF9LFwidVwiOntcImFcIjoyfSxcInZcIjp7XCJhXCI6M30sXCJ4XCI6e1wiYVwiOjR9fX1dXSddLFxuICAgICAgICAgICAgICAgICAgICBbJ2EuYi5zLiouYScsICdbW1widFwiLDFdLFtcInVcIiwyXSxbXCJ2XCIsM10sW1wieFwiLDRdXSddLFxuICAgICAgICAgICAgICAgICAgICBbJ2EuYi5zLionLCAnW1tcInRcIix7XCJhXCI6MX1dLFtcInVcIix7XCJhXCI6Mn1dLFtcInZcIix7XCJhXCI6M31dLFtcInhcIix7XCJhXCI6NH1dXSddLFxuICAgICAgICAgICAgICAgICAgICBbJ2EuYi5vLioucC5xJywgJ1tbXCIwXCIsMV0sW1wiMVwiLDJdLFtcIjJcIiwzXSxbXCIzXCIsNF0sW1wiNFwiLDVdXSddLFxuICAgICAgICAgICAgICAgICAgICBbJ2EuYi5vLioucC5yJywgJ1tbXCIwXCIsdHJ1ZV0sW1wiMVwiLHRydWVdLFtcIjJcIix0cnVlXSxbXCIzXCIsdHJ1ZV0sW1wiNFwiLHRydWVdXSddLFxuICAgICAgICAgICAgICAgICAgICBbJ2EuYi5vLioucCcsICdbW1wiMFwiLHtcInFcIjoxLFwiclwiOnRydWV9XSxbXCIxXCIse1wicVwiOjIsXCJyXCI6dHJ1ZX1dLFtcIjJcIix7XCJxXCI6MyxcInJcIjp0cnVlfV0sW1wiM1wiLHtcInFcIjo0LFwiclwiOnRydWV9XSxbXCI0XCIse1wicVwiOjUsXCJyXCI6dHJ1ZX1dXSddXG4gICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgICAgICAgICBpdCgnLmdldFZpYSgnICsgYSArICcpIHNob3VsZCByZXN1bHQgJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByID0gcGF0aGZpbmRlci5nZXRWaWEoYSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHIpKSkuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCcuZ2V0VmlhKCkgc2hvdWxkIHJlc3VsdCAnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgcCA9IG5ldyBQYXRoZmluZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjOiAxfSwge2M6IDJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2M6IDEsIGQ6IGZhbHNlfSwge2M6IDJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IHIgPSBwLmdldFZpYShcIioueC4qLmNcIilcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1hcFRvT2JqKG1hcCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0ge31cbiAgICAgICAgICAgICAgICAgICAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2tdID0gbWFwVG9PYmoodilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2tdID0gdlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkobWFwVG9PYmoocikpKS5pcy5lcXVhbCgne1wiYVwiOntcIjBcIjoxLFwiMVwiOjJ9LFwiYlwiOntcIjBcIjoxLFwiMVwiOjJ9fScpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCcuZ2V0VmlhKGEuYi5sLjAubikgd2l0aCBtYXAgc2hvdWxkIHJldHVybiA0ICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QocGF0aGZpbmRlci5nZXRWaWEoJ2EuYi5sLjAubicpKS5pcy5lcXVhbCg0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydhLmIuay5tLm4nLCAzXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5sLjAubicsIDRdLFxuICAgICAgICAgICAgICAgIFsnYS54JywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5xJywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5jLjEnLCBcInRlc3QxXCJdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmMuMCcsIDRdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmQnLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmYuMC5nJywgZmFsc2VdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmYuMC5pLjAnLCBcInRlc3QyXCJdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmUnLCBmYWxzZV0sXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuXG4gICAgICAgICAgICAgICAgaXQoJy5nZXRWaWEoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiICsgJyAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChwYXRoZmluZGVyLmdldFZpYShhKSkuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbJ2EuYi5kLmUnXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5kLngnXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi5sLmUubiddLFxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICAgICAgaXQoJy5nZXRWaWEoJyArIGEgKyAnKSBzaG91bGQgdGhyb3cgRXJyb3IgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gcGF0aGZpbmRlci5nZXRWaWEoYSkpLnRvLnRocm93KEVycm9yKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7ZGlmZn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RpZmYubWpzXCI7XG5pbXBvcnQge1F1ZXVlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3F1ZXVlLm1qc1wiO1xuXG5kZXNjcmliZSgnRGlmZicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCdEaWZmIHNwZWNpYWwgY2FzZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIG9iajEsIG9iajI7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBvYmoxID0ge1xuICAgICAgICAgICAgICAgIFwiY291bnRcIjogMSxcbiAgICAgICAgICAgICAgICBcInJlYXNvblwiOiBudWxsLFxuICAgICAgICAgICAgICAgIFwiaW5mb1wiOiBcInRlc3RcIixcbiAgICAgICAgICAgICAgICBcImV4Y2hhbmdlXCI6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgb2JqMiA9IHtcbiAgICAgICAgICAgICAgICBcImNvdW50XCI6IDIsXG4gICAgICAgICAgICAgICAgXCJyZWFzb25cIjogbnVsbCxcbiAgICAgICAgICAgICAgICBcImluZm9cIjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFwiZXhjaGFuZ2VcIjogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ0RpZmYgdmFsdWUgd2l0aCBudWxsICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gZGlmZihvYmoxLCBvYmoyKTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShkKSkuaXMuZXF1YWwoJ1t7XCJvcGVyYXRvclwiOlwidXBkYXRlXCIsXCJwYXRoXCI6W1wiY291bnRcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6MSxcInR5cGVcIjpcIm51bWJlclwifSxcInNlY29uZFwiOntcInZhbHVlXCI6MixcInR5cGVcIjpcIm51bWJlclwifX0se1wib3BlcmF0b3JcIjpcImRlbGV0ZVwiLFwicGF0aFwiOltcImluZm9cIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6XCJ0ZXN0XCIsXCJ0eXBlXCI6XCJzdHJpbmdcIn19XScpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnRGlmZiBpZGVudGljYWwgdmFsdWUgd2l0aCBudWxsICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gZGlmZihvYmoxLCBvYmoxKTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShkKSkuaXMuZXF1YWwoJ1tdJyk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG4gICAgY29uc3QgZGF0ZTEgPSBuZXcgRGF0ZTtcblxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RlL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvcGFyc2VcbiAgICBjb25zdCBkYXRlMiA9IERhdGUucGFyc2UoJzAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVCcpO1xuICAgIGNvbnN0IGRhdGUzID0gRGF0ZS5wYXJzZSgnMDQgRGVjIDE5OTUgMDA6MTI6MDAgR01UJyk7IC8vIE51bWJlclxuICAgIGNvbnN0IGRhdGU0ID0gRGF0ZS5wYXJzZSgnMDQgRGVjIDE5OTUgMDA6MTI6MDEgR01UJyk7IC8vIE51bWJlclxuXG4gICAgY29uc3QgZGF0ZTUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKCcwNCBEZWMgMTk5NSAwMDoxMjowMSBHTVQnKSk7IC8vIERhdGVcbiAgICBjb25zdCBkYXRlNiA9IG5ldyBEYXRlKERhdGUucGFyc2UoJzA0IERlYyAxOTk1IDAwOjEyOjAyIEdNVCcpKTsgLy8gRGF0ZVxuXG4gICAgW1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IG5ldyBRdWV1ZSgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wiYVwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6e1wiZGF0YVwiOltdfSxcInR5cGVcIjpcIm9iamVjdFwiLFwiaW5zdGFuY2VcIjpcIlF1ZXVlXCJ9fV0nXG4gICAgICAgIF0sXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjogMVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYzoge1xuICAgICAgICAgICAgICAgICAgICBkOiAyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGU6IDNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGY6IHtcbiAgICAgICAgICAgICAgICAgICAgZDogMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJkZWxldGVcIixcInBhdGhcIjpbXCJhXCIsXCJiXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOjEsXCJ0eXBlXCI6XCJudW1iZXJcIn19LHtcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJhXCIsXCJlXCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjozLFwidHlwZVwiOlwibnVtYmVyXCJ9fSx7XCJvcGVyYXRvclwiOlwiZGVsZXRlXCIsXCJwYXRoXCI6W1wiY1wiXSxcImZpcnN0XCI6e1widmFsdWVcIjp7XCJkXCI6Mn0sXCJ0eXBlXCI6XCJvYmplY3RcIixcImluc3RhbmNlXCI6XCJPYmplY3RcIn19LHtcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJmXCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjp7XCJkXCI6Mn0sXCJ0eXBlXCI6XCJvYmplY3RcIixcImluc3RhbmNlXCI6XCJPYmplY3RcIn19XSdcbiAgICAgICAgXSxcblxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZGF0ZTEsXG4gICAgICAgICAgICAgICAgYzogZGF0ZTRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZGF0ZTIsXG4gICAgICAgICAgICAgICAgYjogZGF0ZTNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJ1cGRhdGVcIixcInBhdGhcIjpbXCJhXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOlwiJyArIGRhdGUxLnRvSVNPU3RyaW5nKCkgKyAnXCIsXCJ0eXBlXCI6XCJvYmplY3RcIixcImluc3RhbmNlXCI6XCJEYXRlXCJ9LFwic2Vjb25kXCI6e1widmFsdWVcIjowLFwidHlwZVwiOlwibnVtYmVyXCJ9fSx7XCJvcGVyYXRvclwiOlwiZGVsZXRlXCIsXCJwYXRoXCI6W1wiY1wiXSxcImZpcnN0XCI6e1widmFsdWVcIjo4MTgwMzU5MjEwMDAsXCJ0eXBlXCI6XCJudW1iZXJcIn19LHtcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJiXCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjo4MTgwMzU5MjAwMDAsXCJ0eXBlXCI6XCJudW1iZXJcIn19XSdcbiAgICAgICAgXSxcblxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZGF0ZTVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYjogZGF0ZTZcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJkZWxldGVcIixcInBhdGhcIjpbXCJhXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOlwiMTk5NS0xMi0wNFQwMDoxMjowMS4wMDBaXCIsXCJ0eXBlXCI6XCJvYmplY3RcIixcImluc3RhbmNlXCI6XCJEYXRlXCJ9fSx7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wiYlwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6XCIxOTk1LTEyLTA0VDAwOjEyOjAyLjAwMFpcIixcInR5cGVcIjpcIm9iamVjdFwiLFwiaW5zdGFuY2VcIjpcIkRhdGVcIn19XSdcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IGRhdGUxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IGRhdGUxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1tdJ1xuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBkYXRlM1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcImFcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjgxODAzNTkyMDAwMCxcInR5cGVcIjpcIm51bWJlclwifX1dJ1xuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBkYXRlMlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBkYXRlM1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcInVwZGF0ZVwiLFwicGF0aFwiOltcImFcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6MCxcInR5cGVcIjpcIm51bWJlclwifSxcInNlY29uZFwiOntcInZhbHVlXCI6ODE4MDM1OTIwMDAwLFwidHlwZVwiOlwibnVtYmVyXCJ9fV0nXG4gICAgICAgIF0sXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogMlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcInVwZGF0ZVwiLFwicGF0aFwiOltcImFcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6MSxcInR5cGVcIjpcIm51bWJlclwifSxcInNlY29uZFwiOntcInZhbHVlXCI6MixcInR5cGVcIjpcIm51bWJlclwifX1dJ1xuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHg6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJkZWxldGVcIixcInBhdGhcIjpbXCJhXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOjEsXCJ0eXBlXCI6XCJudW1iZXJcIn19LHtcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJ4XCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjoxLFwidHlwZVwiOlwibnVtYmVyXCJ9fV0nXG4gICAgICAgIF0sXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogMixcbiAgICAgICAgICAgICAgICB4OiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwidXBkYXRlXCIsXCJwYXRoXCI6W1wiYVwiXSxcImZpcnN0XCI6e1widmFsdWVcIjoxLFwidHlwZVwiOlwibnVtYmVyXCJ9LFwic2Vjb25kXCI6e1widmFsdWVcIjoyLFwidHlwZVwiOlwibnVtYmVyXCJ9fSx7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wieFwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6MSxcInR5cGVcIjpcIm51bWJlclwifX1dJ1xuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwiZGVsZXRlXCIsXCJwYXRoXCI6W1wiYVwiXSxcImZpcnN0XCI6e1widmFsdWVcIjpudWxsLFwidHlwZVwiOlwib2JqZWN0XCJ9fV0nXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW10nXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJhXCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjpudWxsLFwidHlwZVwiOlwib2JqZWN0XCJ9fV0nXG4gICAgICAgIF0sIFtcbiAgICAgICAge30sXG4gICAgICAgIHthOiB1bmRlZmluZWR9LFxuICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJhXCJdLFwic2Vjb25kXCI6e1widHlwZVwiOlwidW5kZWZpbmVkXCJ9fV0nXG4gICAgXVxuXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgaXQoJ0RpZmYgc2hvdWxkIHJlc3VsdCAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBkaWZmKGEsIGIpO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGQpKS5pcy5lcXVhbChjKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG59KSIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtpc09iamVjdH0gZnJvbSBcIi4uLy4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtEYXRhc291cmNlfSBmcm9tIFwiLi4vZGF0YXNvdXJjZS5tanNcIjtcbmltcG9ydCB7UGF0aGZpbmRlcn0gZnJvbSBcIi4uL3BhdGhmaW5kZXIubWpzXCI7XG5pbXBvcnQge1BpcGV9IGZyb20gXCIuLi9waXBlLm1qc1wiO1xuaW1wb3J0IHtXcml0ZUVycm9yfSBmcm9tIFwiLi9yZXN0YXBpL3dyaXRlZXJyb3IubWpzXCI7XG5cbmV4cG9ydCB7UmVzdEFQSX1cblxuLyoqXG4gKiBUaGUgUmVzdEFQSSBpcyBhIGNsYXNzIHRoYXQgZW5hYmxlcyBhIFJFU1QgQVBJIHNlcnZlci5cbiAqIFxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7UmVzdEFQSX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3Jlc3RhcGkubWpzJztcbiAqIG5ldyBSZXN0QVBJKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQge1Jlc3RBUEl9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RhdGEvZGF0YXNvdXJjZS9yZXN0YXBpLm1qcyc7XG4gKlxuICogY29uc3QgZHMgPSBuZXcgUmVzdEFQSSh7XG4gKiAgIHVybDogJ2h0dHBzOi8vaHR0cGJpbi5vcmcvZ2V0J1xuICogfSx7XG4gKiAgIHVybDogJ2h0dHBzOi8vaHR0cGJpbi5vcmcvcG9zdCdcbiAqIH0pO1xuICpcbiAqIGRzLnNldCh7ZmxhZzp0cnVlfSlcbiAqIGRzLndyaXRlKCkudGhlbigoKT0+Y29uc29sZS5sb2coJ2RvbmUnKSk7XG4gKiBkcy5yZWFkKCkudGhlbigoKT0+Y29uc29sZS5sb2coJ2RvbmUnKSk7XG4gKlxuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGEuRGF0YXNvdXJjZVxuICogQHN1bW1hcnkgVGhlIExvY2FsU3RvcmFnZSBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGFjY2VzcyB0byBkYXRhIG9iamVjdHMuXG4gKi9cbmNsYXNzIFJlc3RBUEkgZXh0ZW5kcyBEYXRhc291cmNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtyZWFkRGVmaW5pdGlvbl0gQW4gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhbnkgY3VzdG9tIHNldHRpbmdzIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhlIHJlYWQgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3dyaXRlRGVmaW5pdGlvbl0gQW4gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhbnkgY3VzdG9tIHNldHRpbmdzIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhlIHdyaXRlIHJlcXVlc3QuXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZWFkRGVmaW5pdGlvbiwgd3JpdGVEZWZpbml0aW9uKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9XG5cbiAgICAgICAgaWYgKGlzT2JqZWN0KHJlYWREZWZpbml0aW9uKSkgb3B0aW9ucy5yZWFkID0gcmVhZERlZmluaXRpb247XG4gICAgICAgIGlmIChpc09iamVjdCh3cml0ZURlZmluaXRpb24pKSBvcHRpb25zLndyaXRlID0gd3JpdGVEZWZpbml0aW9uO1xuXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmw9dW5kZWZpbmVkIERlZmluZXMgdGhlIHJlc291cmNlIHRoYXQgeW91IHdpc2ggdG8gZmV0Y2guXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHdyaXRlPXt9IE9wdGlvbnNcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gd3JpdGUuaW5pdD17fSBBbiBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGFueSBjdXN0b20gc2V0dGluZ3MgdGhhdCB5b3Ugd2FudCB0byBhcHBseSB0byB0aGUgcmVxdWVzdC4gVGhlIHBhcmFtZXRlcnMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBvZiB0aGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3R8UmVxdWVzdCBjb25zdHJ1Y3Rvcn1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gd3JpdGUuaW5pdC5tZXRob2Q9UE9TVFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3cml0ZS5hY2NlcHRlZFN0YXR1cz1bMjAwLDIwMV1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gd3JpdGUudXJsIFVSTFxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3cml0ZS5tYXBwaW5nIHRoZSBtYXBwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHdyaXRpbmcuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHdyaXRlLm1hcHBpbmcudHJhbnNmb3JtZXIgVHJhbnNmb3JtZXIgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBlbnRyaWVzXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHdyaXRlLnJlcG9ydFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB3cml0ZS5yZXBvcnQucGF0aCBQYXRoIHRvIHZhbGlkYXRpb25zXG4gICAgICogQHByb3BlcnR5IHtNb25zdGVyLkRhdGEuRGF0YXNvdXJjZX5leGFtcGxlQ2FsbGJhY2tbXX0gd3JpdGUubWFwcGluZy5jYWxsYmFjayB3aXRoIHRoZSBoZWxwIG9mIHRoZSBjYWxsYmFjaywgdGhlIHN0cnVjdHVyZXMgY2FuIGJlIGFkanVzdGVkIGJlZm9yZSB3cml0aW5nLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSByZWFkLmluaXQ9e30gQW4gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhbnkgY3VzdG9tIHNldHRpbmdzIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuIFRoZSBwYXJhbWV0ZXJzIGFyZSBpZGVudGljYWwgdG8gdGhvc2Ugb2YgdGhlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdC9SZXF1ZXN0fFJlcXVlc3QgY29uc3RydWN0b3J9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYWQuaW5pdC5tZXRob2Q9R0VUXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYWQuYWNjZXB0ZWRTdGF0dXM9WzIwMF1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVhZC51cmwgVVJMXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHJlYWQubWFwcGluZyB0aGUgbWFwcGluZyBpcyBhcHBsaWVkIGFmdGVyIHJlYWRpbmcuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWQubWFwcGluZy50cmFuc2Zvcm1lciBUcmFuc2Zvcm1lciB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXNcbiAgICAgKiBAcHJvcGVydHkge01vbnN0ZXIuRGF0YS5EYXRhc291cmNlfmV4YW1wbGVDYWxsYmFja1tdfSByZWFkLm1hcHBpbmcuY2FsbGJhY2sgd2l0aCB0aGUgaGVscCBvZiB0aGUgY2FsbGJhY2ssIHRoZSBzdHJ1Y3R1cmVzIGNhbiBiZSBhZGp1c3RlZCBhZnRlciByZWFkaW5nLlxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICB3cml0ZToge1xuICAgICAgICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY2NlcHRlZFN0YXR1czogWzIwMCwgMjAxXSxcbiAgICAgICAgICAgICAgICB1cmw6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtYXBwaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrczogW11cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlcG9ydDoge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhZDoge1xuICAgICAgICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWNjZXB0ZWRTdGF0dXM6IFsyMDBdLFxuICAgICAgICAgICAgICAgIHVybDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1hcHBpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzOiBbXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBvcHRpb25zIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBqc29uIGRlZmluaXRpb25cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgZGF0YSBjYW5ub3QgYmUgcmVhZFxuICAgICAqL1xuICAgIHJlYWQoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBsZXQgcmVzcG9uc2U7XG5cbiAgICAgICAgbGV0IGluaXQgPSBzZWxmLmdldE9wdGlvbigncmVhZC5pbml0Jyk7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5pdCkpIGluaXQgPSB7fTtcblxuICAgICAgICByZXR1cm4gZmV0Y2goc2VsZi5nZXRPcHRpb24oJ3JlYWQudXJsJyksIGluaXQpLnRoZW4ocmVzcCA9PiB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHJlc3A7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkU3RhdHVzID0gc2VsZi5nZXRPcHRpb24oJ3JlYWQuYWNjZXB0ZWRTdGF0dXMnLCBbMjAwXSk7XG5cbiAgICAgICAgICAgIGlmIChhY2NlcHRlZFN0YXR1cy5pbmRleE9mKHJlc3Auc3RhdHVzKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigndGhlIGRhdGEgY2Fubm90IGJlIHJlYWQgKHJlc3BvbnNlICcgKyByZXNwLnN0YXR1cyArICcpJylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3AudGV4dCgpXG4gICAgICAgIH0pLnRoZW4oYm9keSA9PiB7XG5cbiAgICAgICAgICAgIGxldCBvYmo7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShib2R5KTtcblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnN1YnN0cmluZygwLCA5NykgKyAnLi4uJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQganNvbiAoYWN0dWFsOiAnICsgYm9keSArICcpLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdHJhbnNmb3JtYXRpb24gPSBzZWxmLmdldE9wdGlvbigncmVhZC5tYXBwaW5nLnRyYW5zZm9ybWVyJyk7XG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgUGlwZSh0cmFuc2Zvcm1hdGlvbik7XG4gICAgICAgICAgICAgICAgb2JqID0gcGlwZS5ydW4ob2JqKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5zZXQob2JqKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqIEB0aHJvd3Mge1dyaXRlRXJyb3J9IHRoZSBkYXRhIGNhbm5vdCBiZSB3cml0dGVuXG4gICAgICovXG4gICAgd3JpdGUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cbiAgICAgICAgbGV0IGluaXQgPSBzZWxmLmdldE9wdGlvbignd3JpdGUuaW5pdCcpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGluaXQpKSBpbml0ID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgaW5pdFsnaGVhZGVycyddICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaW5pdFsnaGVhZGVycyddID0ge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvYmogPSBzZWxmLmdldCgpO1xuICAgICAgICBsZXQgdHJhbnNmb3JtYXRpb24gPSBzZWxmLmdldE9wdGlvbignd3JpdGUubWFwcGluZy50cmFuc2Zvcm1lcicpO1xuICAgICAgICBpZiAodHJhbnNmb3JtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcGlwZSA9IG5ldyBQaXBlKHRyYW5zZm9ybWF0aW9uKTtcbiAgICAgICAgICAgIG9iaiA9IHBpcGUucnVuKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2hlYXRoaW5nT2JqZWN0ID0gc2VsZi5nZXRPcHRpb24oJ3dyaXRlLnNoZWF0aGluZy5vYmplY3QnKTtcbiAgICAgICAgbGV0IHNoZWF0aGluZ1BhdGggPSBzZWxmLmdldE9wdGlvbignd3JpdGUuc2hlYXRoaW5nLnBhdGgnKTtcbiAgICAgICAgbGV0IHJlcG9ydFBhdGggPSBzZWxmLmdldE9wdGlvbignd3JpdGUucmVwb3J0LnBhdGgnKTtcblxuICAgICAgICBpZiAoc2hlYXRoaW5nT2JqZWN0ICYmIHNoZWF0aGluZ1BhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YiA9IG9iajtcbiAgICAgICAgICAgIG9iaiA9IHNoZWF0aGluZ09iamVjdDtcbiAgICAgICAgICAgIChuZXcgUGF0aGZpbmRlcihvYmopKS5zZXRWaWEoc2hlYXRoaW5nUGF0aCwgc3ViKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRbJ2JvZHknXSA9IEpTT04uc3RyaW5naWZ5KG9iaik7XG5cbiAgICAgICAgcmV0dXJuIGZldGNoKHNlbGYuZ2V0T3B0aW9uKCd3cml0ZS51cmwnKSwgaW5pdCkudGhlbihyZXNwb25zZSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkU3RhdHVzID0gc2VsZi5nZXRPcHRpb24oJ3dyaXRlLmFjY2VwdGVkU3RhdHVzJywgWzIwMCwgMjAwMV0pO1xuXG4gICAgICAgICAgICBpZiAoYWNjZXB0ZWRTdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpID09PSAtMSkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKS50aGVuKChib2R5KSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiwgdmFsaWRhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uID0gbmV3IFBhdGhmaW5kZXIob2JqKS5nZXRWaWEocmVwb3J0UGF0aClcblxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5Lmxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnN1YnN0cmluZygwLCA5NykgKyAnLi4uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gKGFjdHVhbDogJyArIGJvZHkgKyAnKS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXcml0ZUVycm9yKCd0aGUgZGF0YSBjYW5ub3QgYmUgd3JpdHRlbiAocmVzcG9uc2UgJyArIHJlc3BvbnNlLnN0YXR1cyArICcpJywgcmVzcG9uc2UsIHZhbGlkYXRpb24pXG5cbiAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1Jlc3RBUEl9XG4gICAgICovXG4gICAgZ2V0Q2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFJlc3RBUEkoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVsnb3B0aW9ucyddLnJlYWQsIHNlbGZbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbJ29wdGlvbnMnXS53cml0ZSk7XG4gICAgfVxuXG59XG5cblxuLyoqXG4gKiBUaGlzIGNhbGxiYWNrIGNhbiBiZSBwYXNzZWQgdG8gYSBkYXRhc291cmNlIGFuZCBpcyB1c2VkIHRvIGFkYXB0IGRhdGEgc3RydWN0dXJlcy5cbiAqXG4gKiBAY2FsbGJhY2sgTW9uc3Rlci5EYXRhLkRhdGFzb3VyY2V+ZXhhbXBsZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5ICBLZXlcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEBzZWUgTW9uc3Rlci5EYXRhLkRhdGFzb3VyY2VcbiAqL1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi8uLi8uLi9jb25zdGFudHMubWpzXCI7XG5cbmV4cG9ydCB7V3JpdGVFcnJvcn1cblxuLyoqXG4gKiBFcnJvciBtZXNzYWdlIGZvciBBUEkgcmVxdWVzdHMgd2l0aCBleHRlbnNpb24gb2YgcmVxdWVzdCBhbmQgdmFsaWRhdGlvbi5cbiAqIFxuICogQHNpbmNlIDEuMjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGEuRGF0YXNvdXJjZS5SZXN0QVBJXG4gKiBAc3VtbWFyeSB0aGUgZXJyb3IgaXMgdGhyb3duIGJ5IHRoZSByZXN0IGFwaSBpbiBjYXNlIG9mIGVycm9yXG4gKi9cbmNsYXNzIFdyaXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgcmVzcG9uc2UsIHZhbGlkYXRpb24pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdID0ge1xuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgdmFsaWRhdGlvbjogdmFsaWRhdGlvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1Jlc3BvbnNlfVxuICAgICAqL1xuICAgIGdldFJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbFN5bWJvbF1bJ3Jlc3BvbnNlJ11cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0VmFsaWRhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdWyd2YWxpZGF0aW9uJ11cbiAgICB9XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1Jlc3RBUEl9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3Jlc3RhcGkubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlT2JqZWN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdSZXN0QVBJJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IGZldGNoUmVmZXJlbmNlOyBcbiAgICBsZXQgcmV0dXJuU3RhdHVzO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgZ2xvYmFsVGhpc1snZmV0Y2gnXSA9IGZldGNoUmVmZXJlbmNlO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgcmV0dXJuU3RhdHVzID0gMjAwO1xuICAgICAgICBmZXRjaFJlZmVyZW5jZSA9IGdsb2JhbFRoaXNbJ2ZldGNoJ107XG4gICAgICAgIGdsb2JhbFRoaXNbJ2ZldGNoJ10gPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG5cbiAgICAgICAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXJsJylcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiBcInRlc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXR1cm5TdGF0dXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfTtcblxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGluc3RhbmNlIG9mIFJlc3RBUEkgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IFJlc3RBUEkoJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvd29ybGQuanNvbicpKS50by5iZS5pbnN0YW5jZW9mKFJlc3RBUEkpXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncncnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3JlYWQgc2hvdWxkIHJldHVybiBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgUmVzdEFQSSh7dXJsOiAnaHR0cHM6Ly9tb25zdGVyanMub3JnL2Fzc2V0cy93b3JsZC5qc29uJ30pXG4gICAgICAgICAgICBkcy5yZWFkKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZU9iamVjdChkYXRhKTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkICcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBSZXN0QVBJKHt1cmw6ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nfSwge3VybDogJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvd29ybGQuanNvbid9KVxuICAgICAgICAgICAgZHMud3JpdGUoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlT2JqZWN0KGRhdGEpO1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ3J3IHdpdGggZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZWFkIHNob3VsZCB0aHJvdyBleGNlcHRpb24nLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuU3RhdHVzID0gNDAwOyAvLyBmZXRjaCByZXNwb25zZSB3aXRoIDQwMFxuXG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBSZXN0QVBJKHt1cmw6ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nfSlcbiAgICAgICAgICAgIGRzLnJlYWQoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoXCJzaG91bGQgbm90IHJ1bi5cIik7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoKSk7IC8vIHNob3VsZCB0aHJvdyBleGNlcHRpb24gYmVjYXVzZSByZXR1cm5TdGF0dXM9NDAwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd3cml0ZSBzaG91bGQgJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIHJldHVyblN0YXR1cyA9IDQwMDsgLy8gZmV0Y2ggcmVzcG9uc2Ugd2l0aCA0MDBcbiAgICAgICAgICAgIGNvbnN0IGRzID0gbmV3IFJlc3RBUEkoe3VybDogJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvd29ybGQuanNvbid9LCB7dXJsOiAnaHR0cHM6Ly9tb25zdGVyanMub3JnL2Fzc2V0cy93b3JsZC5qc29uJ30pXG4gICAgICAgICAgICBkcy53cml0ZSgpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVPYmplY3QoZGF0YSk7XG4gICAgICAgICAgICAgICAgZG9uZShcImVycm9yXCIpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKCkpOyAvLyBzaG91bGQgdGhyb3cgZXhjZXB0aW9uIGJlY2F1c2UgcmV0dXJuU3RhdHVzPTQwMFxuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KSIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gXCIuLi8uLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge0RhdGFzb3VyY2V9IGZyb20gXCIuLi8uLi9kYXRhc291cmNlLm1qc1wiO1xuaW1wb3J0IHtTdG9yYWdlLCBzdG9yYWdlT2JqZWN0U3ltYm9sfSBmcm9tIFwiLi4vc3RvcmFnZS5tanNcIjtcblxuZXhwb3J0IHtTZXNzaW9uU3RvcmFnZX1cblxuLyoqXG4gKiBUaGUgU2Vzc2lvblN0b3JhZ2UgY2xhc3MgcHJvdmlkZXMgYSBkYXRhIHNvdXJjZSB0aGF0IHVzZXMgdGhlIFNlc3Npb25TdG9yYWdlIEFQSSBvbiB0aGUgY2xpZW50LlxuICogXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtTZXNzaW9uU3RvcmFnZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2Uvc2Vzc2lvbnN0b3JhZ2UubWpzJztcbiAqIG5ldyBTZXNzaW9uU3RvcmFnZSgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAxLjIyLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhLkRhdGFzb3VyY2UuU3RvcmFnZVxuICogQHN1bW1hcnkgVGhlIExvY2FsU3RvcmFnZSBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGFjY2VzcyB0byBkYXRhIG9iamVjdHMuXG4gKi9cbmNsYXNzIFNlc3Npb25TdG9yYWdlIGV4dGVuZHMgU3RvcmFnZSB7XG5cbiAgICAvKipcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICogQHJldHVybiB7ZXh0ZXJuYWw6c2Vzc2lvblN0b3JhZ2V9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBbc3RvcmFnZU9iamVjdFN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiBnZXRHbG9iYWxPYmplY3QoJ3Nlc3Npb25TdG9yYWdlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIENsb25lXG4gICAgICogXG4gICAgICogQHJldHVybiB7U2Vzc2lvblN0b3JhZ2V9XG4gICAgICovXG4gICAgZ2V0Q2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25TdG9yYWdlKHNlbGZbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbJ29wdGlvbnMnXS5rZXkpO1xuICAgIH1cblxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge0RhdGFzb3VyY2V9IGZyb20gXCIuLi9kYXRhc291cmNlLm1qc1wiO1xuXG5leHBvcnQge1N0b3JhZ2UsIHN0b3JhZ2VPYmplY3RTeW1ib2x9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHN0b3JhZ2VPYmplY3RTeW1ib2wgPSBTeW1ib2woJ3N0b3JhZ2VPYmplY3QnKTtcblxuLyoqXG4gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyBhIHJlY29yZC5cbiAqIFxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7U3RvcmFnZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2UubWpzJztcbiAqIG5ldyBTdG9yYWdlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQge1N0b3JhZ2V9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlLm1qcyc7XG4gKlxuICogbmV3IERhdGFzb3VyY2UoKTtcbiAqXG4gKiBAc2luY2UgMS4yMi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRGF0YS5EYXRhc291cmNlXG4gKiBAc3VtbWFyeSBUaGUgU3RvcmFnZSBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGFjY2VzcyB0byBkYXRhIG9iamVjdHMgb3ZlciBXZWJTdG9yYWdlQVBJLlxuICovXG5jbGFzcyBTdG9yYWdlIGV4dGVuZHMgRGF0YXNvdXJjZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTG9jYWxTdG9yYWdlIEtleVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioa2V5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uKCdrZXknLCB2YWxpZGF0ZVN0cmluZyhrZXkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30ga2V5PXVuZGVmaW5lZCBMb2NhbFN0b3JhZ2UgS2V5XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgICAgICAgIGtleTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICogQHJldHVybiB7ZXh0ZXJuYWw6U3RvcmFnZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFtzdG9yYWdlT2JqZWN0U3ltYm9sXSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXNcIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgb3B0aW9ucyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQganNvbiBkZWZpbml0aW9uXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGRhdGEgY2Fubm90IGJlIHJlYWRcbiAgICAgKi9cbiAgICByZWFkKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgICAgICBjb25zdCBzdG9yYWdlID0gc2VsZltzdG9yYWdlT2JqZWN0U3ltYm9sXSgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc3RvcmFnZS5nZXRJdGVtKHNlbGYuZ2V0T3B0aW9uKCdrZXknKSkpO1xuICAgICAgICAgICAgc2VsZi5zZXQoZGF0YT8/e30pO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RvcmFnZX1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGRhdGEgY2Fubm90IGJlIHdyaXR0ZW5cbiAgICAgKi9cbiAgICB3cml0ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHNlbGZbc3RvcmFnZU9iamVjdFN5bWJvbF0oKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHNlbGYuZ2V0KCk7XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKHNlbGYuZ2V0T3B0aW9uKCdrZXknKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShzZWxmLmdldE9wdGlvbigna2V5JyksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0b3JhZ2V9XG4gICAgICovXG4gICAgZ2V0Q2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGY9dGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlKHNlbGZbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbJ29wdGlvbnMnXS5rZXkpO1xuICAgIH0gXG4gICAgXG59XG4iLCAiZnVuY3Rpb24gY3JlYXRlU3RvcmFnZSgpIHtcbiAgICBsZXQgVU5TRVQgPSBTeW1ib2woKTtcbiAgICBsZXQgcyA9IHt9LFxuICAgICAgICBub29wQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIH0sXG4gICAgICAgIF9pdGVtSW5zZXJ0aW9uQ2FsbGJhY2sgPSBub29wQ2FsbGJhY2s7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJ3NldEl0ZW0nLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChrLCB2ID0gVU5TRVQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gVU5TRVQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgJ3NldEl0ZW0nIG9uICdTdG9yYWdlJzogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgayA9IGsgKyAnJztcbiAgICAgICAgICAgICAgICBpZiAoIXMuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgX2l0ZW1JbnNlcnRpb25DYWxsYmFjayhzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNba10gPSB2ICsgJyc7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsICdnZXRJdGVtJywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBrID0+IHtcbiAgICAgICAgICAgICAgICBrID0gayArICcnO1xuICAgICAgICAgICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzW2tdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJ3JlbW92ZUl0ZW0nLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGsgPT4ge1xuICAgICAgICAgICAgICAgIGsgPSBrICsgJyc7XG4gICAgICAgICAgICAgICAgaWYgKHMuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCAnY2xlYXInLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrIGluIHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzW2tdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCAnbGVuZ3RoJywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzKS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgXCJrZXlcIiwge1xuICAgICAgICB2YWx1ZTogayA9PiB7XG4gICAgICAgICAgICBsZXQga2V5ID0gT2JqZWN0LmtleXMocylba107XG4gICAgICAgICAgICByZXR1cm4gKCFrZXkpID8gbnVsbCA6IGtleTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJ2l0ZW1JbnNlcnRpb25DYWxsYmFjaycsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX2l0ZW1JbnNlcnRpb25DYWxsYmFjaztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiB2ID0+IHtcbiAgICAgICAgICAgIGlmICghdiB8fCB0eXBlb2YgdiAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdiA9IG5vb3BDYWxsYmFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9pdGVtSW5zZXJ0aW9uQ2FsbGJhY2sgPSB2O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHM7XG59XG5cblxuZXhwb3J0IHtjcmVhdGVTdG9yYWdlfTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1Nlc3Npb25TdG9yYWdlfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlL3Nlc3Npb25zdG9yYWdlLm1qc1wiO1xuaW1wb3J0IHtjcmVhdGVTdG9yYWdlfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC9sb2NhbHN0b3JhZ2UubWpzXCI7XG5cblxubGV0IHN0b3JhZ2VSZWZlcmVuY2U7XG5cbmRlc2NyaWJlKCdTZXNzaW9uU3RvcmFnZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFRoaXNbJ3Nlc3Npb25TdG9yYWdlJ10gPSBzdG9yYWdlUmVmZXJlbmNlO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgc3RvcmFnZVJlZmVyZW5jZSA9IGdsb2JhbFRoaXNbJ3Nlc3Npb25TdG9yYWdlJ11cbiAgICAgICAgZ2xvYmFsVGhpc1snc2Vzc2lvblN0b3JhZ2UnXSA9IGNyZWF0ZVN0b3JhZ2UoKTtcblxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkIGluc3RhbmNlIG9mIFNlc3Npb25TdG9yYWdlICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBTZXNzaW9uU3RvcmFnZSgnbXlrZXknKSkudG8uYmUuaW5zdGFuY2VvZihTZXNzaW9uU3RvcmFnZSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdydycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgncmVhZCBzaG91bGQgcmV0dXJuIG9iamVjdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBTZXNzaW9uU3RvcmFnZSgnbXlrZXknKVxuICAgICAgICAgICAgZHMucmVhZCgpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3dyaXRlIHNob3VsZCAnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgU2Vzc2lvblN0b3JhZ2UoJ215a2V5JylcbiAgICAgICAgICAgIGRzLndyaXRlKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KSIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGF1dGhvciBzY2h1a2FpIEdtYkhcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gXCIuLi8uLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge0RhdGFzb3VyY2V9IGZyb20gXCIuLi8uLi9kYXRhc291cmNlLm1qc1wiO1xuaW1wb3J0IHtTdG9yYWdlLCBzdG9yYWdlT2JqZWN0U3ltYm9sfSBmcm9tIFwiLi4vc3RvcmFnZS5tanNcIjtcblxuZXhwb3J0IHtMb2NhbFN0b3JhZ2V9XG5cbi8qKlxuICogVGhlIExvY2FsU3RvcmFnZSBEYXRhc291cmNlIHByb3ZpZGVzIGEgZGF0YSBzdG9yZSBpbiB0aGUgYnJvd3NlciBsb2NhbFN0b3JhZ2UuXG4gKiBcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge0xvY2FsU3RvcmFnZX0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQGxhdGVzdC9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2UvbG9jYWxzdG9yYWdlLm1qcyc7XG4gKiBuZXcgTG9jYWxTdG9yYWdlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGEuRGF0YXNvdXJjZS5TdG9yYWdlXG4gKiBAc3VtbWFyeSBUaGUgTG9jYWxTdG9yYWdlIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgYWNjZXNzIHRvIGRhdGEgb2JqZWN0cy5cbiAqL1xuY2xhc3MgTG9jYWxTdG9yYWdlIGV4dGVuZHMgU3RvcmFnZSB7XG5cbiAgICAvKipcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICogQHJldHVybiB7ZXh0ZXJuYWw6bG9jYWxTdG9yYWdlfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgW3N0b3JhZ2VPYmplY3RTeW1ib2xdKCkge1xuICAgICAgICByZXR1cm4gZ2V0R2xvYmFsT2JqZWN0KCdsb2NhbFN0b3JhZ2UnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgY2xvbmVcbiAgICAgKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gICAgICovXG4gICAgZ2V0Q2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IExvY2FsU3RvcmFnZShzZWxmW2ludGVybmFsU3ltYm9sXS5nZXRSZWFsU3ViamVjdCgpWydvcHRpb25zJ10ua2V5KTtcbiAgICB9XG5cblxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtMb2NhbFN0b3JhZ2V9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2UvbG9jYWxzdG9yYWdlLm1qc1wiO1xuaW1wb3J0IHtjcmVhdGVTdG9yYWdlfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC9sb2NhbHN0b3JhZ2UubWpzXCI7XG5cblxubGV0IGxvY2FsU3RvcmFnZVJlZmVyZW5jZTtcblxuZGVzY3JpYmUoJ0xvY2FsU3RvcmFnZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFRoaXNbJ2xvY2FsU3RvcmFnZSddID0gbG9jYWxTdG9yYWdlUmVmZXJlbmNlO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbG9jYWxTdG9yYWdlUmVmZXJlbmNlID0gZ2xvYmFsVGhpc1snbG9jYWxTdG9yYWdlJ11cbiAgICAgICAgZ2xvYmFsVGhpc1snbG9jYWxTdG9yYWdlJ10gPSBjcmVhdGVTdG9yYWdlKCk7XG5cbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBMb2NhbFN0b3JhZ2UgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IExvY2FsU3RvcmFnZSgnbXlrZXknKSkudG8uYmUuaW5zdGFuY2VvZihMb2NhbFN0b3JhZ2UpXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncncnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3JlYWQgc2hvdWxkIHJldHVybiBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgTG9jYWxTdG9yYWdlKCdteWtleScpXG4gICAgICAgICAgICBkcy5yZWFkKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkICcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBMb2NhbFN0b3JhZ2UoJ215a2V5JylcbiAgICAgICAgICAgIGRzLndyaXRlKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KSIsICIvKiogbm9kZWpzIGRvZXNudCBzdXBwb3J0IHdpbmRvdy5jcnlwdCAqL1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ01hdGgnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgcmFuZG9tID0gKCkgPT4ge31cbiAgICBcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICBpZiAoIWdsb2JhbFRoaXNbJ2NyeXB0byddKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbihtID0+IHtcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzWydjcnlwdG8nXSA9IG5ldyBtLkNyeXB0bygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9tYXRoL3JhbmRvbS5tanNcIikudGhlbihtID0+IHtcbiAgICAgICAgICAgIHJhbmRvbSA9IG0ucmFuZG9tO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pKVxuXG5cbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnJhbmRvbSgpJywgZnVuY3Rpb24gKCkge1xuXG5cbiAgICAgICAgaXQoJ2EgZ3JlYXRlciBiIHNob3VsZCB0aHJvdyBlcnJvciAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gcmFuZG9tKDEwLCAyKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCByZXR1cm4gYSBudW1iZXIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHIgPSByYW5kb20oKTtcbiAgICAgICAgICAgIGV4cGVjdChyKS50aGF0LmlzLmEoJ251bWJlcicpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCByZXR1cm4gYSBudW1iZXIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHJhbmRvbSg1LCA2KSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCB0aHJvdyBFcnJvciB3ZSBjYW5ub3QgZ2VuZXJhdGUgbnVtYmVycyBsYXJnZXIgdGhhbiA1MyBiaXRzLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiByYW5kb20oLTk5OTk5OTk5OSwgOTk5OTk5OTk5OTk5OTk5OTk5OTkpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcgc2hvdWxkIHRocm93IEVycm9yIHdlIGNhbm5vdCBnZW5lcmF0ZSBudW1iZXJzIGxhcmdlciB0aGFuIDUzIGJpdHMuJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWzEsIDEwMF0sXG4gICAgICAgICAgICAgICAgWzUwMCwgNjAwXSxcbiAgICAgICAgICAgICAgICBbMTAwLCAxMDAwXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBsZXQgciA9IHJhbmRvbShhLCBiKTtcblxuICAgICAgICAgICAgICAgIGl0KHIgKyAnIHNob3VsZCByZXR1cm4gdmFsdWUgYmV0d2VlbiAnICsgYSArICcgJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIgPj0gYSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIgPD0gYikudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWzEsIDEwMF0sXG4gICAgICAgICAgICAgICAgWzUwMCwgNjAwXSxcbiAgICAgICAgICAgICAgICBbMTAwLCAxMDAwXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCByb3VuZHMgPSA1MDBcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSByb3VuZHM7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcmFuZG9tKGEsIGIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhdmcgPSBzdW0gLyByb3VuZHM7XG5cbiAgICAgICAgICAgICAgICBpdChhdmcgKyAnIHNob3VsZCBiZXR3ZWVuICcgKyBhICsgJyAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoYXZnID4gYSkudG8uYmUudHJ1ZVxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoYXZnIDwgYikudG8uYmUudHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSlcblxuICAgICAgICB9KVxuXG5cbiAg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QUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLFFBQ0ksQ0FBQztBQUFBLFFBQ0Q7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxNQUVBO0FBQUEsUUFDSTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsVUFDSSxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFFQTtBQUFBLFFBQ0k7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUFBLE1BRUE7QUFBQSxRQUNJO0FBQUEsVUFDSSxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxNQUVBO0FBQUEsUUFDSTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsVUFDSSxHQUFHO0FBQUEsVUFDSCxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLFFBQ0k7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQSxDQUFDO0FBQUEsUUFDRDtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsUUFDSTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsVUFDSSxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLFFBQ0ksQ0FBQztBQUFBLFFBQ0Q7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxNQUFHO0FBQUEsUUFDSCxDQUFDO0FBQUEsUUFDRCxFQUFDLEdBQUcsT0FBUztBQUFBLFFBQ2I7QUFBQSxNQUNKO0FBQUEsSUFHQSxFQUFFLFFBQVEsU0FBVSxNQUFNO0FBRXRCLFVBQUlDLEtBQUksS0FBSyxNQUFNO0FBQ25CLFVBQUksSUFBSSxLQUFLLE1BQU07QUFDbkIsVUFBSSxJQUFJLEtBQUssTUFBTTtBQUduQixTQUFHLHdCQUF3QixHQUFHLFdBQVk7QUFDdEMsWUFBSSxJQUFJLEtBQUtBLElBQUcsQ0FBQztBQUNqQixlQUFPLEtBQUssVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQUFBLE1BQ3hDLENBQUM7QUFBQSxJQUdMLENBQUM7QUFBQSxFQUVMLENBQUM7OztBQ3JNRDtBQUNBO0FBRUE7QUFDQTs7O0FDSkE7QUFZQSxNQUFNLGFBQU4sY0FBeUIsTUFBTTtBQUFBLElBTTNCLFlBQVksU0FBUyxVQUFVLFlBQVk7QUFDdkMsWUFBTSxPQUFPO0FBQ2IsV0FBSyxrQkFBa0I7QUFBQSxRQUNuQjtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLElBS0EsY0FBYztBQUNWLGFBQU8sS0FBSyxnQkFBZ0I7QUFBQSxJQUNoQztBQUFBLElBS0EsZ0JBQWdCO0FBQ1osYUFBTyxLQUFLLGdCQUFnQjtBQUFBLElBQ2hDO0FBQUEsRUFDSjs7O0FEREEsTUFBTSxVQUFOLGNBQXNCLFdBQVc7QUFBQSxJQVE3QixZQUFZLGdCQUFnQixpQkFBaUI7QUFDekMsWUFBTTtBQUVOLFlBQU0sVUFBVSxDQUFDO0FBRWpCLFVBQUksU0FBUyxjQUFjO0FBQUcsZ0JBQVEsT0FBTztBQUM3QyxVQUFJLFNBQVMsZUFBZTtBQUFHLGdCQUFRLFFBQVE7QUFFL0MsV0FBSyxXQUFXLE9BQU87QUFBQSxJQUUzQjtBQUFBLElBc0JBLElBQUksV0FBVztBQUNYLGFBQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLFVBQVU7QUFBQSxRQUNyQyxPQUFPO0FBQUEsVUFDSCxNQUFNO0FBQUEsWUFDRixRQUFRO0FBQUEsVUFDWjtBQUFBLFVBQ0EsZ0JBQWdCLENBQUMsS0FBSyxHQUFHO0FBQUEsVUFDekIsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFlBQ0wsYUFBYTtBQUFBLFlBQ2IsV0FBVyxDQUFDO0FBQUEsVUFDaEI7QUFBQSxVQUNBLFFBQVE7QUFBQSxZQUNKLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsTUFBTTtBQUFBLFlBQ0YsUUFBUTtBQUFBLFVBQ1o7QUFBQSxVQUNBLGdCQUFnQixDQUFDLEdBQUc7QUFBQSxVQUNwQixLQUFLO0FBQUEsVUFDTCxTQUFTO0FBQUEsWUFDTCxhQUFhO0FBQUEsWUFDYixXQUFXLENBQUM7QUFBQSxVQUNoQjtBQUFBLFFBQ0o7QUFBQSxNQUVKLENBQUM7QUFBQSxJQUNMO0FBQUEsSUFRQSxPQUFPO0FBQ0gsWUFBTUMsUUFBTztBQUNiLFVBQUk7QUFFSixVQUFJQyxRQUFPRCxNQUFLLFVBQVUsV0FBVztBQUNyQyxVQUFJLENBQUMsU0FBU0MsS0FBSTtBQUFHLFFBQUFBLFFBQU8sQ0FBQztBQUU3QixhQUFPLE1BQU1ELE1BQUssVUFBVSxVQUFVLEdBQUdDLEtBQUksRUFBRSxLQUFLLFVBQVE7QUFDeEQsbUJBQVc7QUFFWCxjQUFNLGlCQUFpQkQsTUFBSyxVQUFVLHVCQUF1QixDQUFDLEdBQUcsQ0FBQztBQUVsRSxZQUFJLGVBQWUsUUFBUSxLQUFLLE1BQU0sTUFBTSxJQUFJO0FBQzVDLGdCQUFNLE1BQU0sdUNBQXVDLEtBQUssU0FBUyxHQUFHO0FBQUEsUUFDeEU7QUFFQSxlQUFPLEtBQUssS0FBSztBQUFBLE1BQ3JCLENBQUMsRUFBRSxLQUFLLFVBQVE7QUFFWixZQUFJO0FBRUosWUFBSTtBQUNBLGdCQUFNLEtBQUssTUFBTSxJQUFJO0FBQUEsUUFFekIsU0FBUyxHQUFQO0FBRUUsY0FBSSxLQUFLLFNBQVMsS0FBSztBQUNuQixtQkFBTyxLQUFLLFVBQVUsR0FBRyxFQUFFLElBQUk7QUFBQSxVQUNuQztBQUVBLGdCQUFNLElBQUksTUFBTSx5REFBeUQsT0FBTyxJQUFJO0FBQUEsUUFDeEY7QUFFQSxZQUFJLGlCQUFpQkEsTUFBSyxVQUFVLDBCQUEwQjtBQUM5RCxZQUFJLG1CQUFtQixRQUFXO0FBQzlCLGdCQUFNLE9BQU8sSUFBSSxLQUFLLGNBQWM7QUFDcEMsZ0JBQU0sS0FBSyxJQUFJLEdBQUc7QUFBQSxRQUN0QjtBQUVBLFFBQUFBLE1BQUssSUFBSSxHQUFHO0FBQ1osZUFBTztBQUFBLE1BQ1gsQ0FBQztBQUFBLElBQ0w7QUFBQSxJQU1BLFFBQVE7QUFDSixZQUFNQSxRQUFPO0FBR2IsVUFBSUMsUUFBT0QsTUFBSyxVQUFVLFlBQVk7QUFDdEMsVUFBSSxDQUFDLFNBQVNDLEtBQUk7QUFBRyxRQUFBQSxRQUFPLENBQUM7QUFDN0IsVUFBSSxPQUFPQSxNQUFLLGVBQWUsVUFBVTtBQUNyQyxRQUFBQSxNQUFLLGFBQWE7QUFBQSxVQUNkLGdCQUFnQjtBQUFBLFFBQ3BCO0FBQUEsTUFDSjtBQUVBLFVBQUksTUFBTUQsTUFBSyxJQUFJO0FBQ25CLFVBQUksaUJBQWlCQSxNQUFLLFVBQVUsMkJBQTJCO0FBQy9ELFVBQUksbUJBQW1CLFFBQVc7QUFDOUIsY0FBTSxPQUFPLElBQUksS0FBSyxjQUFjO0FBQ3BDLGNBQU0sS0FBSyxJQUFJLEdBQUc7QUFBQSxNQUN0QjtBQUVBLFVBQUksa0JBQWtCQSxNQUFLLFVBQVUsd0JBQXdCO0FBQzdELFVBQUksZ0JBQWdCQSxNQUFLLFVBQVUsc0JBQXNCO0FBQ3pELFVBQUksYUFBYUEsTUFBSyxVQUFVLG1CQUFtQjtBQUVuRCxVQUFJLG1CQUFtQixlQUFlO0FBQ2xDLGNBQU0sTUFBTTtBQUNaLGNBQU07QUFDTixRQUFDLElBQUksV0FBVyxHQUFHLEVBQUcsT0FBTyxlQUFlLEdBQUc7QUFBQSxNQUNuRDtBQUVBLE1BQUFDLE1BQUssVUFBVSxLQUFLLFVBQVUsR0FBRztBQUVqQyxhQUFPLE1BQU1ELE1BQUssVUFBVSxXQUFXLEdBQUdDLEtBQUksRUFBRSxLQUFLLGNBQVk7QUFFN0QsY0FBTSxpQkFBaUJELE1BQUssVUFBVSx3QkFBd0IsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUV6RSxZQUFJLGVBQWUsUUFBUSxTQUFTLE1BQU0sTUFBTSxJQUFJO0FBRWhELGlCQUFPLFNBQVMsS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTO0FBRWxDLGdCQUFJRSxNQUFLO0FBQ1QsZ0JBQUk7QUFDQSxjQUFBQSxPQUFNLEtBQUssTUFBTSxJQUFJO0FBQ3JCLDJCQUFhLElBQUksV0FBV0EsSUFBRyxFQUFFLE9BQU8sVUFBVTtBQUFBLFlBRXRELFNBQVMsR0FBUDtBQUVFLGtCQUFJLEtBQUssU0FBUyxLQUFLO0FBQ25CLHVCQUFPLEtBQUssVUFBVSxHQUFHLEVBQUUsSUFBSTtBQUFBLGNBQ25DO0FBRUEsb0JBQU0sSUFBSSxNQUFNLHlEQUF5RCxPQUFPLElBQUk7QUFBQSxZQUN4RjtBQUVBLGtCQUFNLElBQUksV0FBVywwQ0FBMEMsU0FBUyxTQUFTLEtBQUssVUFBVSxVQUFVO0FBQUEsVUFFOUcsQ0FBQztBQUFBLFFBR0w7QUFFQSxlQUFPO0FBQUEsTUFDWCxDQUFDO0FBQUEsSUFDTDtBQUFBLElBTUEsV0FBVztBQUNQLFlBQU1GLFFBQU87QUFDYixhQUFPLElBQUksUUFBUUEsTUFBSyxnQkFBZ0IsZUFBZSxFQUFFLFdBQVcsTUFBTUEsTUFBSyxnQkFBZ0IsZUFBZSxFQUFFLFdBQVcsS0FBSztBQUFBLElBQ3BJO0FBQUEsRUFFSjs7O0FFOU9BO0FBR0EsV0FBUyxXQUFXLFdBQVk7QUFFNUIsUUFBSUc7QUFDSixRQUFJO0FBRUosY0FBVSxNQUFNO0FBQ1osaUJBQVcsV0FBV0E7QUFBQSxJQUMxQixDQUFDO0FBRUQsZUFBVyxNQUFNO0FBRWIscUJBQWU7QUFDZixNQUFBQSxrQkFBaUIsV0FBVztBQUM1QixpQkFBVyxXQUFXLFNBQVUsS0FBSyxTQUFTO0FBRTFDLFlBQUksQ0FBQztBQUFLLGdCQUFNLElBQUksTUFBTSxhQUFhO0FBRXZDLGVBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3BDLGtCQUFRO0FBQUEsWUFDSixNQUFNLFdBQVk7QUFDZCxxQkFBTyxLQUFLLFVBQVU7QUFBQSxnQkFDbEIsR0FBRztBQUFBLGNBQ1AsQ0FBQztBQUFBLFlBQ0w7QUFBQSxZQUNBLFFBQVE7QUFBQSxVQUNaLENBQUM7QUFBQSxRQUNMLENBQUM7QUFBQSxNQUVMO0FBQUEsSUFFSixDQUFDO0FBRUQsT0FBRywrQkFBK0IsV0FBWTtBQUMxQyxhQUFPLElBQUksUUFBUSx5Q0FBeUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxXQUFXLE9BQU87QUFBQSxJQUMzRixDQUFDO0FBRUQsYUFBUyxNQUFNLFdBQVk7QUFFdkIsU0FBRyw2QkFBNkIsU0FBVSxNQUFNO0FBQzVDLGNBQU0sS0FBSyxJQUFJLFFBQVEsRUFBQyxLQUFLLDBDQUF5QyxDQUFDO0FBQ3ZFLFdBQUcsS0FBSyxFQUFFLEtBQUssVUFBUTtBQUNuQix5QkFBZSxJQUFJO0FBQ25CLGVBQUs7QUFBQSxRQUNULENBQUMsRUFBRSxNQUFNLE9BQUssS0FBSyxDQUFDLENBQUM7QUFBQSxNQUN6QixDQUFDO0FBRUQsU0FBRyxpQkFBaUIsU0FBVSxNQUFNO0FBQ2hDLGNBQU0sS0FBSyxJQUFJLFFBQVEsRUFBQyxLQUFLLDBDQUF5QyxHQUFHLEVBQUMsS0FBSywwQ0FBeUMsQ0FBQztBQUN6SCxXQUFHLE1BQU0sRUFBRSxLQUFLLFVBQVE7QUFDcEIseUJBQWUsSUFBSTtBQUNuQixlQUFLO0FBQUEsUUFDVCxDQUFDLEVBQUUsTUFBTSxPQUFLLEtBQUssQ0FBQyxDQUFDO0FBQUEsTUFDekIsQ0FBQztBQUFBLElBR0wsQ0FBQztBQUVELGFBQVMsa0JBQWtCLFdBQVk7QUFFbkMsU0FBRywrQkFBK0IsU0FBVSxNQUFNO0FBQzlDLHVCQUFlO0FBRWYsY0FBTSxLQUFLLElBQUksUUFBUSxFQUFDLEtBQUssMENBQXlDLENBQUM7QUFDdkUsV0FBRyxLQUFLLEVBQUUsS0FBSyxVQUFRO0FBQ25CLGVBQUssaUJBQWlCO0FBQUEsUUFDMUIsQ0FBQyxFQUFFLE1BQU0sT0FBSyxLQUFLLENBQUM7QUFBQSxNQUN4QixDQUFDO0FBRUQsU0FBRyxpQkFBaUIsU0FBVSxNQUFNO0FBQ2hDLHVCQUFlO0FBQ2YsY0FBTSxLQUFLLElBQUksUUFBUSxFQUFDLEtBQUssMENBQXlDLEdBQUcsRUFBQyxLQUFLLDBDQUF5QyxDQUFDO0FBQ3pILFdBQUcsTUFBTSxFQUFFLEtBQUssVUFBUTtBQUNwQix5QkFBZSxJQUFJO0FBQ25CLGVBQUssT0FBTztBQUFBLFFBQ2hCLENBQUMsRUFBRSxNQUFNLE9BQUssS0FBSyxDQUFDO0FBQUEsTUFDeEIsQ0FBQztBQUFBLElBR0wsQ0FBQztBQUFBLEVBR0wsQ0FBQzs7O0FDbEZEO0FBQ0E7OztBQ0RBO0FBQ0E7QUFTQSxNQUFNLHNCQUFzQixPQUFPLGVBQWU7QUF1QmxELE1BQU0sVUFBTixjQUFzQixXQUFXO0FBQUEsSUFPN0IsWUFBWSxLQUFLO0FBQ2IsWUFBTTtBQUNOLFdBQUssVUFBVSxPQUFPLGVBQWUsR0FBRyxDQUFDO0FBQUEsSUFDN0M7QUFBQSxJQUtBLElBQUksV0FBVztBQUNYLGFBQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLFVBQVU7QUFBQSxRQUNyQyxLQUFLO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFDTDtBQUFBLElBT0EsQ0FBQyx1QkFBdUI7QUFDcEIsWUFBTSxJQUFJLE1BQU0sb0RBQW9EO0FBQUEsSUFDeEU7QUFBQSxJQVFBLE9BQU87QUFDSCxZQUFNQyxRQUFPO0FBRWIsWUFBTSxVQUFVQSxNQUFLLHFCQUFxQjtBQUUxQyxhQUFPLElBQUksUUFBUSxTQUFVLFNBQVM7QUFDbEMsY0FBTSxPQUFPLEtBQUssTUFBTSxRQUFRLFFBQVFBLE1BQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUM5RCxRQUFBQSxNQUFLLElBQUksUUFBTSxDQUFDLENBQUM7QUFDakIsZ0JBQVE7QUFBQSxNQUNaLENBQUM7QUFBQSxJQUVMO0FBQUEsSUFNQSxRQUFRO0FBQ0osWUFBTUEsUUFBTztBQUViLFlBQU0sVUFBVUEsTUFBSyxxQkFBcUI7QUFFMUMsYUFBTyxJQUFJLFFBQVEsU0FBVSxTQUFTO0FBRWxDLGNBQU0sT0FBT0EsTUFBSyxJQUFJO0FBQ3RCLFlBQUksU0FBUyxRQUFXO0FBQ3BCLGtCQUFRLFdBQVdBLE1BQUssVUFBVSxLQUFLLENBQUM7QUFBQSxRQUM1QyxPQUFPO0FBQ0gsa0JBQVEsUUFBUUEsTUFBSyxVQUFVLEtBQUssR0FBRyxLQUFLLFVBQVUsSUFBSSxDQUFDO0FBQUEsUUFDL0Q7QUFFQSxnQkFBUTtBQUFBLE1BQ1osQ0FBQztBQUFBLElBQ0w7QUFBQSxJQUtBLFdBQVc7QUFDUCxZQUFNQSxRQUFLO0FBQ1gsYUFBTyxJQUFJLFFBQVFBLE1BQUssZ0JBQWdCLGVBQWUsRUFBRSxXQUFXLEdBQUc7QUFBQSxJQUMzRTtBQUFBLEVBRUo7OztBRDFGQSxNQUFNLGlCQUFOLGNBQTZCLFFBQVE7QUFBQSxJQU9qQyxDQUFDLHVCQUF1QjtBQUNwQixhQUFPLGdCQUFnQixnQkFBZ0I7QUFBQSxJQUMzQztBQUFBLElBT0EsV0FBVztBQUNQLFlBQU1DLFFBQU87QUFDYixhQUFPLElBQUksZUFBZUEsTUFBSyxnQkFBZ0IsZUFBZSxFQUFFLFdBQVcsR0FBRztBQUFBLElBQ2xGO0FBQUEsRUFFSjs7O0FFakRBLFdBQVMsZ0JBQWdCO0FBQ3JCLFFBQUksUUFBUSxPQUFPO0FBQ25CLFFBQUksSUFBSSxDQUFDLEdBQ0wsZUFBZSxNQUFNO0FBQUEsSUFDckIsR0FDQSx5QkFBeUI7QUFFN0IsV0FBTyxlQUFlLEdBQUcsV0FBVztBQUFBLE1BQ2hDLEtBQUssTUFBTTtBQUNQLGVBQU8sQ0FBQyxHQUFHLElBQUksVUFBVTtBQUNyQixjQUFJLE1BQU0sT0FBTztBQUNiLGtCQUFNLElBQUksVUFBVSxxRkFBcUY7QUFBQSxVQUM3RztBQUNBLGNBQUksSUFBSTtBQUNSLGNBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxHQUFHO0FBQ3RCLG1DQUF1QixFQUFFLE1BQU07QUFBQSxVQUNuQztBQUNBLFlBQUUsS0FBSyxJQUFJO0FBQUEsUUFDZjtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFDRCxXQUFPLGVBQWUsR0FBRyxXQUFXO0FBQUEsTUFDaEMsS0FBSyxNQUFNO0FBQ1AsZUFBTyxPQUFLO0FBQ1IsY0FBSSxJQUFJO0FBQ1IsY0FBSSxFQUFFLGVBQWUsQ0FBQyxHQUFHO0FBQ3JCLG1CQUFPLEVBQUU7QUFBQSxVQUNiLE9BQU87QUFDSCxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU8sZUFBZSxHQUFHLGNBQWM7QUFBQSxNQUNuQyxLQUFLLE1BQU07QUFDUCxlQUFPLE9BQUs7QUFDUixjQUFJLElBQUk7QUFDUixjQUFJLEVBQUUsZUFBZSxDQUFDLEdBQUc7QUFDckIsbUJBQU8sRUFBRTtBQUFBLFVBQ2I7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU8sZUFBZSxHQUFHLFNBQVM7QUFBQSxNQUM5QixLQUFLLE1BQU07QUFDUCxlQUFPLE1BQU07QUFDVCxtQkFBUyxLQUFLLEdBQUc7QUFDYixnQkFBSSxFQUFFLGVBQWUsQ0FBQyxHQUFHO0FBQ3JCLHFCQUFPLEVBQUU7QUFBQSxZQUNiO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTyxlQUFlLEdBQUcsVUFBVTtBQUFBLE1BQy9CLEtBQUssTUFBTTtBQUNQLGVBQU8sT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQzFCO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTyxlQUFlLEdBQUcsT0FBTztBQUFBLE1BQzVCLE9BQU8sT0FBSztBQUNSLFlBQUksTUFBTSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLGVBQVEsQ0FBQyxNQUFPLE9BQU87QUFBQSxNQUMzQjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU8sZUFBZSxHQUFHLHlCQUF5QjtBQUFBLE1BQzlDLEtBQUssTUFBTTtBQUNQLGVBQU87QUFBQSxNQUNYO0FBQUEsTUFDQSxLQUFLLE9BQUs7QUFDTixZQUFJLENBQUMsS0FBSyxPQUFPLEtBQUssWUFBWTtBQUM5QixjQUFJO0FBQUEsUUFDUjtBQUNBLGlDQUF5QjtBQUFBLE1BQzdCO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7OztBQ3RFQSxNQUFJO0FBRUosV0FBUyxrQkFBa0IsV0FBWTtBQUVuQyxjQUFVLE1BQU07QUFDWixpQkFBVyxvQkFBb0I7QUFBQSxJQUNuQyxDQUFDO0FBRUQsZUFBVyxXQUFZO0FBRW5CLHlCQUFtQixXQUFXO0FBQzlCLGlCQUFXLG9CQUFvQixjQUFjO0FBQUEsSUFFakQsQ0FBQztBQUVELE9BQUcsc0NBQXNDLFdBQVk7QUFDakQsYUFBTyxJQUFJLGVBQWUsT0FBTyxDQUFDLEVBQUUsR0FBRyxHQUFHLFdBQVcsY0FBYztBQUFBLElBQ3ZFLENBQUM7QUFFRCxhQUFTLE1BQU0sV0FBWTtBQUV2QixTQUFHLDZCQUE2QixTQUFVLE1BQU07QUFDNUMsY0FBTSxLQUFLLElBQUksZUFBZSxPQUFPO0FBQ3JDLFdBQUcsS0FBSyxFQUFFLEtBQUssVUFBUTtBQUNuQixlQUFLO0FBQUEsUUFDVCxDQUFDLEVBQUUsTUFBTSxPQUFLLEtBQUssQ0FBQyxDQUFDO0FBQUEsTUFDekIsQ0FBQztBQUVELFNBQUcsaUJBQWlCLFNBQVUsTUFBTTtBQUNoQyxjQUFNLEtBQUssSUFBSSxlQUFlLE9BQU87QUFDckMsV0FBRyxNQUFNLEVBQUUsS0FBSyxVQUFRO0FBQ3BCLGVBQUs7QUFBQSxRQUNULENBQUMsRUFBRSxNQUFNLE9BQUssS0FBSyxDQUFDLENBQUM7QUFBQSxNQUN6QixDQUFDO0FBQUEsSUFHTCxDQUFDO0FBQUEsRUFHTCxDQUFDOzs7QUN4Q0Q7QUFDQTtBQXFCQSxNQUFNLGVBQU4sY0FBMkIsUUFBUTtBQUFBLElBTy9CLENBQUMsdUJBQXVCO0FBQ3BCLGFBQU8sZ0JBQWdCLGNBQWM7QUFBQSxJQUN6QztBQUFBLElBTUEsV0FBVztBQUNQLFlBQU1DLFFBQU87QUFDYixhQUFPLElBQUksYUFBYUEsTUFBSyxnQkFBZ0IsZUFBZSxFQUFFLFdBQVcsR0FBRztBQUFBLElBQ2hGO0FBQUEsRUFHSjs7O0FDMUNBLE1BQUk7QUFFSixXQUFTLGdCQUFnQixXQUFZO0FBRWpDLGNBQVUsTUFBTTtBQUNaLGlCQUFXLGtCQUFrQjtBQUFBLElBQ2pDLENBQUM7QUFFRCxlQUFXLFdBQVk7QUFFbkIsOEJBQXdCLFdBQVc7QUFDbkMsaUJBQVcsa0JBQWtCLGNBQWM7QUFBQSxJQUUvQyxDQUFDO0FBRUQsT0FBRyxvQ0FBb0MsV0FBWTtBQUMvQyxhQUFPLElBQUksYUFBYSxPQUFPLENBQUMsRUFBRSxHQUFHLEdBQUcsV0FBVyxZQUFZO0FBQUEsSUFDbkUsQ0FBQztBQUVELGFBQVMsTUFBTSxXQUFZO0FBRXZCLFNBQUcsNkJBQTZCLFNBQVUsTUFBTTtBQUM1QyxjQUFNLEtBQUssSUFBSSxhQUFhLE9BQU87QUFDbkMsV0FBRyxLQUFLLEVBQUUsS0FBSyxVQUFRO0FBQ25CLGVBQUs7QUFBQSxRQUNULENBQUMsRUFBRSxNQUFNLE9BQUssS0FBSyxDQUFDLENBQUM7QUFBQSxNQUN6QixDQUFDO0FBRUQsU0FBRyxpQkFBaUIsU0FBVSxNQUFNO0FBQ2hDLGNBQU0sS0FBSyxJQUFJLGFBQWEsT0FBTztBQUNuQyxXQUFHLE1BQU0sRUFBRSxLQUFLLFVBQVE7QUFDcEIsZUFBSztBQUFBLFFBQ1QsQ0FBQyxFQUFFLE1BQU0sT0FBSyxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3pCLENBQUM7QUFBQSxJQUdMLENBQUM7QUFBQSxFQUdMLENBQUM7OztBQzNDRCxXQUFTLFFBQVEsV0FBWTtBQUV6QixRQUFJQyxVQUFTLE1BQU07QUFBQSxJQUFDO0FBRXBCLFdBQU8sU0FBVSxNQUFNO0FBRW5CLFVBQUksV0FBVyxDQUFDO0FBQ2hCLFVBQUksQ0FBQyxXQUFXLFdBQVc7QUFDdkIsaUJBQVMsS0FBSywwRUFBOEIsS0FBSyxPQUFLO0FBQ2xELHFCQUFXLFlBQVksSUFBSSxFQUFFLE9BQU87QUFDcEMsaUJBQU87QUFBQSxRQUNYLENBQUMsQ0FBQztBQUFBLE1BQ047QUFFQSxlQUFTLEtBQUssOERBQXlELEtBQUssT0FBSztBQUM3RSxRQUFBQSxVQUFTLEVBQUU7QUFDWCxlQUFPO0FBQUEsTUFDWCxDQUFDLENBQUM7QUFHRixjQUFRLElBQUksUUFBUSxFQUFFLEtBQUssTUFBTTtBQUM3QixhQUFLO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFFTCxDQUFDO0FBRUQsYUFBUyxhQUFhLFdBQVk7QUFHOUIsU0FBRyxtQ0FBbUMsV0FBWTtBQUM5QyxlQUFPLE1BQU1BLFFBQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sS0FBSztBQUFBLE1BQzlDLENBQUM7QUFFRCxTQUFHLDRCQUE0QixXQUFZO0FBQ3ZDLFlBQUksSUFBSUEsUUFBTztBQUNmLGVBQU8sQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUFFLFFBQVE7QUFBQSxNQUNoQyxDQUFDO0FBRUQsU0FBRyw0QkFBNEIsV0FBWTtBQUN2QyxlQUFPLE1BQU1BLFFBQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sS0FBSztBQUFBLE1BQzdDLENBQUM7QUFFRCxTQUFHLHVFQUF1RSxXQUFZO0FBQ2xGLGVBQU8sTUFBTUEsUUFBTyxZQUFZLElBQW9CLENBQUMsRUFBRSxHQUFHLE1BQU0sS0FBSztBQUFBLE1BQ3pFLENBQUM7QUFFRCxTQUFHLHVFQUF1RSxXQUFZO0FBRWxGO0FBQUEsVUFDSSxDQUFDLEdBQUcsR0FBRztBQUFBLFVBQ1AsQ0FBQyxLQUFLLEdBQUc7QUFBQSxVQUNULENBQUMsS0FBSyxHQUFJO0FBQUEsUUFDZCxFQUFFLFFBQVEsU0FBVSxNQUFNO0FBRXRCLGNBQUlDLEtBQUksS0FBSyxNQUFNO0FBQ25CLGNBQUksSUFBSSxLQUFLLE1BQU07QUFFbkIsY0FBSSxJQUFJRCxRQUFPQyxJQUFHLENBQUM7QUFFbkIsYUFBRyxJQUFJLGtDQUFrQ0EsS0FBSSxNQUFNLEdBQUcsV0FBWTtBQUM5RCxtQkFBTyxLQUFLQSxFQUFDLEVBQUUsR0FBRyxHQUFHO0FBQ3JCLG1CQUFPLEtBQUssQ0FBQyxFQUFFLEdBQUcsR0FBRztBQUFBLFVBQ3pCLENBQUM7QUFBQSxRQUNMLENBQUM7QUFFRDtBQUFBLFVBQ0ksQ0FBQyxHQUFHLEdBQUc7QUFBQSxVQUNQLENBQUMsS0FBSyxHQUFHO0FBQUEsVUFDVCxDQUFDLEtBQUssR0FBSTtBQUFBLFFBQ2QsRUFBRSxRQUFRLFNBQVUsTUFBTTtBQUV0QixjQUFJQSxLQUFJLEtBQUssTUFBTTtBQUNuQixjQUFJLElBQUksS0FBSyxNQUFNO0FBRW5CLGNBQUksTUFBTTtBQUNWLGdCQUFNLFNBQVM7QUFFZixtQkFBUyxJQUFJLEdBQUcsTUFBTSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ3hDLG1CQUFPRCxRQUFPQyxJQUFHLENBQUM7QUFBQSxVQUN0QjtBQUVBLGNBQUksTUFBTSxNQUFNO0FBRWhCLGFBQUcsTUFBTSxxQkFBcUJBLEtBQUksTUFBTSxHQUFHLFdBQVk7QUFDbkQsbUJBQU8sTUFBTUEsRUFBQyxFQUFFLEdBQUcsR0FBRztBQUN0QixtQkFBTyxNQUFNLENBQUMsRUFBRSxHQUFHLEdBQUc7QUFBQSxVQUMxQixDQUFDO0FBQUEsUUFHTCxDQUFDO0FBQUEsTUFFTCxDQUFDO0FBQUEsSUFHTCxDQUFDO0FBQUEsRUFHTCxDQUFDOyIsCiAgIm5hbWVzIjogWyJBc3NlcnRpb25FcnJvciIsICJleHRlbmQiLCAiZ2xvYmFsIiwgIkFzc2VydGlvbkVycm9yIiwgImdsb2JhbCIsICJleHBvcnRzIiwgIm9iaiIsICJ0cnVuY2F0ZSIsICJnZXRBcnJheU5hbWUiLCAiaXNOYU4iLCAiZXNjYXBlIiwgImdldFByb21pc2VWYWx1ZSIsICJlbGVtZW50IiwgIkJvb2xlYW4iLCAiV2Vha1NldCIsICJXZWFrTWFwIiwgIkRhdGFWaWV3IiwgIkFycmF5QnVmZmVyIiwgImluc3BlY3RDdXN0b20iLCAiY29uZmlnIiwgImNvbmZpZyIsICJpc1ByaW1pdGl2ZSIsICJjb25maWciLCAiY2hhaSIsICJjb25maWciLCAiY2hhaSIsICJjaGFpIiwgImNoYWkiLCAiY2hhaSIsICJjaGFpIiwgImEiLCAiaXNOYU4iLCAiZ2V0T3BlcmF0b3IiLCAiaXNPYmplY3QiLCAiY29uZmlnIiwgInV0aWwiLCAiQXNzZXJ0aW9uRXJyb3IiLCAiQXNzZXJ0aW9uIiwgImNoYWkiLCAiQXNzZXJ0aW9uIiwgIkFzc2VydGlvbkVycm9yIiwgImEiLCAibWF0Y2hJZHgiLCAiY2hhaSIsICJ1dGlsIiwgImNoYWkiLCAidXRpbCIsICJBc3NlcnRpb24iLCAic2hvdWxkIiwgImNoYWkiLCAidXRpbCIsICJBc3NlcnRpb24iLCAiYXNzZXJ0IiwgInV0aWwiLCAiY29uZmlnIiwgImNvcmUiLCAiZXhwZWN0IiwgInNob3VsZCIsICJhc3NlcnQiLCAicmVxdWlyZV9jaGFpIiwgImEiLCAiY29uc29sZSIsICJERUxJTUlURVIiLCAiaW5pdF9jb25zdGFudHMiLCAiaW5pdCIsICJhIiwgInNlbGYiLCAiYSIsICJpbnRlcm5hbCIsICJhIiwgImRpZmYiLCAiZG9jdW1lbnQiLCAid2luZG93IiwgImVsZW1lbnQiLCAiZG9jdW1lbnQiLCAiZG9jdW1lbnQiLCAiZWxlbWVudCIsICJpbml0X2NvbnN0YW50cyIsICJkb2N1bWVudCIsICJIVE1MVGVtcGxhdGVFbGVtZW50IiwgIkRvY3VtZW50RnJhZ21lbnQiLCAiRG9jdW1lbnQiLCAiaW5pdF9jb25zdGFudHMiLCAic2VsZiIsICJlbGVtZW50IiwgInZhbHVlIiwgImRvY3VtZW50IiwgImUiLCAiaSIsICJpbml0X2NvbnN0YW50cyIsICJlbGVtZW50IiwgInN5bWJvbCIsICJpbml0X2NvbnN0YW50cyIsICJzZWxmIiwgImVsZW1lbnQiLCAib2JqIiwgImluaXRfY29uc3RhbnRzIiwgInNlbGYiLCAiaW5pdF9jb25zdGFudHMiLCAiZG9jdW1lbnQiLCAid2luZG93IiwgIkJ1ZmZlclNvdXJjZUNvbnZlcnRlciIsICJhIiwgIkNvbnZlcnQiLCAiY29tYmluZSIsICJyZXRCdWYiLCAicmV0VmlldyIsICJCb29sZWFuIiwgIlNldCIsICJfYSIsICJyZXRWaWV3IiwgInRlbXBCdWZmZXJWaWV3IiwgIkFzblR5cGVUeXBlcyIsICJBc25Qcm9wVHlwZXMiLCAiQm9vbGVhbiIsICJpbXBvcnRfcHZ0c3V0aWxzIiwgIl9hIiwgIlNldCIsICJkZWZhdWx0Q29udmVydGVyIiwgIl9hIiwgImVsZW1lbnQiLCAiU2V0IiwgIlNldCIsICJlbGVtZW50IiwgImltcG9ydF9wdnRzdXRpbHMiLCAiX19leHRlbmRzIiwgIl9fYXNzaWduIiwgIl9fcmVzdCIsICJfX2RlY29yYXRlIiwgIl9fcGFyYW0iLCAiX19tZXRhZGF0YSIsICJfX2F3YWl0ZXIiLCAiX19nZW5lcmF0b3IiLCAiX19leHBvcnRTdGFyIiwgIl9fdmFsdWVzIiwgIl9fcmVhZCIsICJfX3NwcmVhZCIsICJfX3NwcmVhZEFycmF5cyIsICJfX3NwcmVhZEFycmF5IiwgIl9fYXdhaXQiLCAiX19hc3luY0dlbmVyYXRvciIsICJfX2FzeW5jRGVsZWdhdG9yIiwgIl9fYXN5bmNWYWx1ZXMiLCAiX19tYWtlVGVtcGxhdGVPYmplY3QiLCAiX19pbXBvcnRTdGFyIiwgIl9faW1wb3J0RGVmYXVsdCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEluIiwgIl9fY3JlYXRlQmluZGluZyIsICJleHBvcnRzIiwgImEiLCAidiIsICJ0c2xpYiIsICJpc0NvbnZlcnRpYmxlIiwgInNjaGVtYVN0b3JhZ2UiLCAiaW5pdF9pbmRleF9lcyIsICJKc29uUHJvcFR5cGVzIiwgImltcG9ydF9wdnRzdXRpbHMiLCAiT2JqZWN0SWRlbnRpZmllciIsICJpbml0X2luZGV4X2VzIiwgImZvcm1hdCIsICJFY1B1YmxpY0tleSIsICJFZFByaXZhdGVLZXkiLCAiRWRQdWJsaWNLZXkiLCAiQ3VydmVQcml2YXRlS2V5IiwgIkNyeXB0byIsICJhIiwgInByb2Nlc3MiLCAiaW1wb3J0X3B2dHN1dGlscyIsICJDcnlwdG9LZXkiLCAiQWVzQ2JjUHJvdmlkZXIiLCAiQWVzQ21hY1Byb3ZpZGVyIiwgIkFlc0N0clByb3ZpZGVyIiwgIkFlc0djbVByb3ZpZGVyIiwgIkFlc0t3UHJvdmlkZXIiLCAiQWVzRWNiUHJvdmlkZXIiLCAiUnNhUHJpdmF0ZUtleSIsICJSc2FQdWJsaWNLZXkiLCAiUnNhU3NhUHJvdmlkZXIiLCAiUnNhUHNzUHJvdmlkZXIiLCAiUnNhT2FlcFByb3ZpZGVyIiwgIkVjUHJpdmF0ZUtleSIsICJFY1B1YmxpY0tleSIsICJFY2RzYVByb3ZpZGVyIiwgIkVjZGhQcm92aWRlciIsICJFZFByaXZhdGVLZXkiLCAiRWRQdWJsaWNLZXkiLCAiRWREc2FQcm92aWRlciIsICJFY2RoRXNQcm92aWRlciIsICJQYmtkZjJQcm92aWRlciIsICJIbWFjUHJvdmlkZXIiLCAiSGtkZlByb3ZpZGVyIiwgIlNoYWtlMTI4UHJvdmlkZXIiLCAiU2hha2UyNTZQcm92aWRlciIsICJTdWJ0bGVDcnlwdG8iLCAiaW5pdF9pbmRleF9lcyIsICJjcnlwdG9fX2RlZmF1bHQiLCAiZm9ybWF0IiwgIl9hIiwgImdsb2JhbFJlZmVyZW5jZSIsICJpbnRlcm5hbENvdW50ZXIiLCAiZWxlbWVudCIsICJjaGFpIiwgInZlcnNpb24iLCAiYSIsICJtb25zdGVyVmVyc2lvbiIsICJhIiwgImNvbnNvbGUiLCAiYSIsICJoYW5kbGVyIiwgInNlbGYiLCAiYSIsICJpbml0X2NvbnN0YW50cyIsICJpbml0X2NvbnN0YW50cyIsICJzZWxmIiwgInNlbGYiLCAiZG9jdW1lbnQiLCAiY2hhaSIsICJ3aW5kb3ciLCAiZXhwZWN0IiwgImV4cGVjdCIsICJpbml0X2NvbnN0YW50cyIsICJjcmVhdGVFbGVtZW50IiwgImFwcGVuZFRvRG9jdW1lbnQiLCAic2VsZiIsICJkb2N1bWVudCIsICJleHBlY3QiLCAiZmV0Y2hSZWZlcmVuY2UiLCAibXV0YXRpb25vYnNlcnZlciIsICJhZGRlZE5vZGVzIiwgImV4cGVjdCIsICJlIiwgImV4cGVjdCIsICJpbml0X2NvbnN0YW50cyIsICJjcmVhdGVFbGVtZW50IiwgInNlbGYiLCAiZG9jdW1lbnQiLCAiZXhwZWN0IiwgImV4cGVjdCIsICJleHBlY3QiLCAiZWxlbWVudCIsICJ2IiwgImEiLCAiaW5pdF9jb25zdGFudHMiLCAiZXhwZWN0IiwgImh0bWwxIiwgIkN1c3RvbUNvbnRyb2wiLCAicmVnaXN0ZXJDdXN0b21FbGVtZW50IiwgImRvY3VtZW50IiwgIm0iLCAiZWxlbWVudCIsICJkb2N1bWVudCIsICJhIiwgImluaXRfY29uc3RhbnRzIiwgInNlbGYiLCAiZmV0Y2hSZWZlcmVuY2UiLCAiYSIsICJpbml0X2NvbnN0YW50cyIsICJleHBlY3QiLCAiaHRtbDEiLCAiQ3VzdG9tRWxlbWVudCIsICJyZWdpc3RlckN1c3RvbUVsZW1lbnQiLCAiZG9jdW1lbnQiLCAiZWxlbWVudCIsICJhIiwgImh0bWwxIiwgImh0bWwyIiwgImh0bWwzIiwgInN5bWJvbCIsICJlbGVtZW50IiwgImEiLCAiZ2xvYmFsIiwgImEiLCAiaW5pdF9jb25zdGFudHMiLCAiYSIsICJ3aW5kb3dSZWFkeSIsICJkb21SZWFkeSIsICJLRVlfRE9DVU1FTlQiLCAiZWxlbWVudCIsICJlbGVtZW50IiwgImEiLCAiRm9ybWF0dGVyIiwgInNlbGYiLCAiRm9ybWF0dGVyIiwgImEiLCAiZ2xvYmFsIiwgImEiLCAiYSIsICJSYW5kb21JRCIsICJVVUlEIiwgImEiLCAiYSIsICJhIiwgImEiLCAiYSIsICJOb2RlTGlzdCIsICJzZWxmIiwgIk5vZGUiLCAiTm9kZSIsICJOb2RlTGlzdCIsICJzZWxmIiwgIk5vZGVMaXN0IiwgIk5vZGUiLCAiYSIsICJOb2RlTGlzdCIsICJOb2RlIiwgIk5vZGVMaXN0IiwgIk5vZGUiLCAiTm9kZSIsICJOb2RlTGlzdCIsICJhIiwgImEiLCAiYSIsICJhIiwgInNlbGYiLCAiYSIsICJhIiwgImEiLCAiaW5pdCIsICJzZWxmIiwgImRpZmYiLCAiYSIsICJhIiwgImEiLCAic2VsZiIsICJhIiwgImEiLCAiYSIsICJpIiwgImEiLCAicGFyc2VPcHRpb25zSlNPTiIsICJzZWxmIiwgIk5vZGUiLCAiTm9kZUxpc3QiLCAiTm9kZUxpc3QiLCAiYSIsICJhIiwgImIiLCAiYyIsICJhIiwgImEiLCAic2VsZiIsICJpbml0IiwgIm9iaiIsICJmZXRjaFJlZmVyZW5jZSIsICJzZWxmIiwgInNlbGYiLCAic2VsZiIsICJyYW5kb20iLCAiYSJdCn0K +/** + * + * @param element + * @param object + * @return {Promise[]} + * @license AGPLv3 + * @since 1.23.0 + * @memberOf Monster.DOM + */ +/** + * + * @param object + * @param path + * @returns {void} + * @throws {TypeError} unsupported type + * @throws {TypeError} unsupported type + * @throws {Error} the journey is not at its end + * @throws {Error} unsupported action for this data type + * @license AGPLv3 + * @since 1.6.0 + * @private + */ +/** + * + * @private + * @license AGPLv3 + * @since 1.8.0 + * @param {HTMLElement} container + * @param {string} key + * @param {string} ref + * @param {string} path + * @throws {Error} no template was found with the specified key. + */ +/** + * @license AGPLv3 + * @since 1.15.0 + * @private + * @this CustomElement + */ +/** + * @license AGPLv3 + * @since 1.27.0 + * @return void + * @private + */ +/** + * @memberOf Monster.DOM + * @license AGPLv3 + * @since 1.8.0 + * @type {string} + */ +/** + * @memberOf Monster.DOM + * @type {string} + * @license AGPLv3 + * @since 1.14.0 + */ +/** + * @memberOf Monster.DOM + * @type {string} + * @license AGPLv3 + * @since 1.24.0 + */ +/** + * @memberOf Monster.DOM + * @type {string} + * @license AGPLv3 + * @since 1.25.0 + */ +/** + * @memberOf Monster.DOM + * @type {string} + * @license AGPLv3 + * @since 1.27.0 + */ +/** + * @memberOf Monster.DOM + * @type {string} + * @license AGPLv3 + * @since 1.27.1 + */ +/** + * @memberOf Monster.DOM + * @type {string} + * @license AGPLv3 + * @since 1.8.0 + */ +/** + * @memberOf Monster.DOM + * @type {string} + * @license AGPLv3 + * @since 1.9.0 + */ +/** + * @memberOf Monster.DOM + * @type {symbol} + * @license AGPLv3 + * @since 1.24.0 + */ +/** + * @private + * @license AGPLv3 + * @since 1.10.0 + * @param {HTMLElement} node + * @param {string} key + * @param {string} path + * @return {void} + */ +/** + * @private + * @license AGPLv3 + * @since 1.12.0 + * @param text + * @return {string} + */ +/** + * @private + * @license AGPLv3 + * @since 1.18.0 + * @param {String} parameter + * @return {Monster.Types.Parameter[]|undefined} + * @memberOf Monster.Types + */ +/** + * @private + * @license AGPLv3 + * @since 1.8.0 + * @param {HTMLElement} container + * @param {array} parts + * @param {object} subject + * @return {void} + */ +/** + * @private + * @license AGPLv3 + * @since 1.8.0 + * @param {object} change + * @return {void} + * @this Updater + */ +/** + * @private + * @license AGPLv3 + * @since 1.8.0 + * @param {object} change + * @return {void} + * @throws {Error} the value is not iterable + * @throws {Error} pipes are not allowed when cloning a node. + * @throws {Error} no template was found with the specified key. + * @throws {Error} the maximum depth for the recursion is reached. + * @this Updater + */ +/** + * @private + * @license AGPLv3 + * @since 1.8.0 + * @param {object} change + * @return {void} + */ +/** + * @private + * @license AGPLv3 + * @since 1.8.0 + * @param {string} path + * @param {object} change + * @return {void} + */ +/** + * @private + * @license AGPLv3 + * @since 1.9.0 + * @return {function + * @this Updater + */ +/** + * @private + * @param {String|undefined} query + * @param {String|undefined|null} name name of the slot (if the parameter is undefined, all slots are searched, if the parameter has the value null, all slots without a name are searched. if a string is specified, the slots with this name are searched.) + * @return {*} + * @this CustomElement + * @license AGPLv3 + * @since 1.23.0 + * @throws {Error} query must be a string + */ +/** + * @private + * @return {CustomElement} + * @memberOf Monster.DOM + * @this CustomElement + * @license AGPLv3 + * @since 1.16.0 + * @throws {TypeError} value is not an instance of + */ +/** + * @private + * @return {CustomElement} + * @throws {Error} html is not set. + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/attachShadow + * @memberOf Monster.DOM + * @license AGPLv3 + * @since 1.8.0 + */ +/** + * @private + * @type {symbol} + * @memberOf Monster + * @license AGPLv3 + * @since 1.24.0 + */ +/** + * @private + * @type {symbol} + * @memberOf Monster + * @license AGPLv3 + * @since 1.25.0 + */ +/** + * @private + * @type {symbol} + * @memberOf Monster.Data + * @license AGPLv3 + * @since 1.24.0 + */ +/** + * A UniqueQueue is a queue that contains items only once. + * + * @license AGPLv3 + * @since 1.4.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @summary A queue for unique values + */ +/** + * A `TokenList` allows you to manage tokens (individual character strings such as css classes in an attribute string). + * + * The `TokenList` offers various functions to manipulate values. For example, you can add, remove or replace a class in a CSS list. + * + * This class implements the [iteration protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols). + * + * @externalExample ../../example/types/tokenlist-1.mjs + * @license AGPLv3 + * @since 1.2.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * A factory for creating worker instances. + * + * @license AGPLv3 + * @since 1.25.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM.Worker + * @summary A small factory to create worker + */ +/** + * A log entry for the logger + * + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Logging + */ +/** + * A provider makes a translation object available. + * + * @license AGPLv3 + * @since 1.13.0 + * @copyright schukai GmbH + * @memberOf Monster.I18n + * @see {@link https://datatracker.ietf.org/doc/html/rfc3066} + */ +/** + * Adds a class attribute to an element. + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {Symbol} symbol + * @param {Object} object + * @return {boolean} + */ +/** + * Alternatively to a string selector a callback can be specified. this must return a map. + * + * @example + * import {buildMap} from '@schukai/monster/source/data/buildmap.mjs'; + * + * let obj = { + * "data": [ + * { + * "id": 10, + * "name": "Cassandra", + * "enrichment": { + * variants: [ + * { + * sku: 1, label: "XXS", price: [ + * {vk: '12.12 €'}, + * {vk: '12.12 €'} + * ] + * }, + * { + * sku: 2, label: "XS", price: [ + * {vk: '22.12 €'}, + * {vk: '22.12 €'} + * ] + * }, + * { + * sku: 3, label: "S", price: [ + * {vk: '32.12 €'}, + * {vk: '32.12 €'} + * ] + * }, + * { + * sku: 4, label: "L", price: [ + * {vk: '42.12 €'}, + * {vk: '42.12 €'} + * ] + * } + * ] + * + * } + * }, + * { + * "id": 20, + * "name": "Yessey!", + * "enrichment": { + * variants: [ + * { + * sku: 1, label: "XXS", price: [ + * {vk: '12.12 €'}, + * {vk: '12.12 €'} + * ] + * }, + * { + * sku: 2, label: "XS", price: [ + * {vk: '22.12 €'}, + * {vk: '22.12 €'} + * ] + * }, + * { + * sku: 3, label: "S", price: [ + * {vk: '32.12 €'}, + * {vk: '32.12 €'} + * ] + * }, + * { + * sku: 4, label: "L", price: [ + * {vk: '42.12 €'}, + * {vk: '42.12 €'} + * ] + * } + * ] + * + * } + * } + * ] + * }; + * + * let callback = function (subject) { + * let m = new Map; + * + * for (const [i, b] of Object.entries(subject.data)) { + * + * let key1 = i; + * + * for (const [j, c] of Object.entries(b.enrichment.variants)) { + * let key2 = j; + * + * for (const [k, d] of Object.entries(c.price)) { + * + * let key3 = k; + * + * d.name = b.name; + * d.label = c.label; + * d.id = [key1, key2, key3].join('.'); + * + * m.set(d.id, d); + * } + * + * } + * } + * return m; + * } + * + * let map = buildMap(obj, callback, '${name} ${vk}', '${id}') + * + * // ↦ Map(3) { + * // "0.0.0":"Cassandra 12.12 €", + * // "0.0.1":"Cassandra 12.12 €", + * // "0.1.0":"Cassandra 22.12 €", + * // "0.1.1":"Cassandra 22.12 €", + * // "0.2.0":"Cassandra 32.12 €", + * // "0.2.1":"Cassandra 32.12 €", + * // "0.3.0":"Cassandra 42.12 €", + * // "0.3.1":"Cassandra 42.12 €", + * // "1.0.0":"Yessey! 12.12 €", + * // "1.0.1":"Yessey! 12.12 €", + * // "1.1.0":"Yessey! 22.12 €", + * // "1.1.1":"Yessey! 22.12 €", + * // "1.2.0":"Yessey! 32.12 €", + * // "1.2.1":"Yessey! 32.12 €", + * // "1.3.0":"Yessey! 42.12 €", + * // "1.3.1":"Yessey! 42.12 €" + * // } + * + * @callback Monster.Data~exampleSelectorCallback + * @param {*} subject subject + * @return Map + * @license AGPLv3 + * @since 1.17.0 + * @memberOf Monster.Data + * @see {@link Monster.Data.buildMap} + */ +/** + * An observer manages a callback function + * + * The update method is called with the subject object as this pointer. For this reason the callback should not + * be an arrow function, because it gets this pointer of its own context. + * + * ```js + * new Observer(()=>{ + * // this is not subject + * }) + * + * new Observer(function() { + * // this is subject + * }) + * ``` + * + * Additional arguments can be passed to the callback. To do this, simply specify them. + * + * ```js + * Observer(function(a, b, c) { + * console.log(a, b, c); // ↦ "a", 2, true + * }, "a", 2, true) + * ``` + * + * The callback function must have as many parameters as arguments are given. + * + * @externalExample ../../example/types/observer.mjs + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * An observer manages a callback function + * + * With the ProxyObserver you can attach observer for observation. + * With each change at the object to be observed an update takes place. + * + * This also applies to nested objects. + * + * @externalExample ../../example/types/proxyobserver.mjs + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Assembler class + * + * @license AGPLv3 + * @since 1.6.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @summary Allows you to build an html fragment + */ +/** + * Checks if an element has an object link + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {Symbol} symbol + * @return {boolean} + */ +/** + * Checks whether the value passed is a array + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-8.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @see https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray + */ +/** + * Checks whether the value passed is a boolean. + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-4.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Checks whether the value passed is a function + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-9.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Checks whether the value passed is a object + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-6.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Checks whether the value passed is a object and instance of instance. + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-7.mjs + * @param {*} value + * @param {*} instance + * @returns {boolean} + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Checks whether the value passed is a primitive (string, number, boolean, NaN, undefined, null or symbol) + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-2.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Checks whether the value passed is a string + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-5.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Checks whether the value passed is a symbol + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-3.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Checks whether the value passed is an integer. + * + * This method is used in the library to have consistent names. + * + * @externalExample ../../example/types/is-10.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.4.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * Constraints are used to define conditions that must be met by the value of a variable. + * + * The uniform API of the constraints allows chains to be formed. + * + * @externalExample ../../example/constraints/isobject.mjs + * @license AGPLv3 + * @since 1.3.0 + * @copyright schukai GmbH + * @memberOf Monster.Constraints + * @summary A constraint to check if a value is an object + */ +/** + * Constraints are used to define conditions that must be met by the value of a variable. + * + * The uniform API of the constraints allows chains to be formed. + * + * Operators allow you to link constraints together. for example, you can check whether a value is + * an object or an array. each operator has two operands that are linked together. + * + * @license AGPLv3 + * @since 1.3.0 + * @copyright schukai GmbH + * @memberOf Monster.Constraints + * @summary The abstract operator constraint + */ +/** + * Constraints are used to define conditions that must be met by the value of a variable. + * + * The uniform API of the constraints allows chains to be formed. + * + * The AndOperator is used to link several constraints. The constraint is fulfilled if all constraints of the operators are fulfilled. + * + * @externalExample ../../example/constraints/andoperator.mjs + * @license AGPLv3 + * @since 1.3.0 + * @copyright schukai GmbH + * @memberOf Monster.Constraints + * @summary A and operator constraint + */ +/** + * Constraints are used to define conditions that must be met by the value of a variable. + * + * The uniform API of the constraints allows chains to be formed. + * + * The OrOperator is used to link several constraints. The constraint is fulfilled if one of the constraints is fulfilled. + * + * @externalExample ../../example/constraints/oroperator.mjs + * @license AGPLv3 + * @since 1.3.0 + * @copyright schukai GmbH + * @memberOf Monster.Constraints + * @summary A or operator + */ +/** + * Constraints are used to define conditions that must be met by the value of a variable. + * + * The uniform API of the constraints allows chains to be formed. + * + * The invalid constraint allows an always invalid query to be performed. this constraint is mainly intended for testing. + * + * @externalExample ../../example/constraints/invalid.mjs + * @license AGPLv3 + * @since 1.3.0 + * @copyright schukai GmbH + * @memberOf Monster.Constraints + * @summary A constraint that always invalid + */ +/** + * Constraints are used to define conditions that must be met by the value of a variable. + * + * The uniform API of the constraints allows chains to be formed. + * + * The valid constraint allows an always valid query to be performed. this constraint is mainly intended for testing. + * + * @externalExample ../../example/constraints/valid.mjs + * @license AGPLv3 + * @since 1.3.0 + * @copyright schukai GmbH + * @memberOf Monster.Constraints + * @summary A constraint that always valid + */ +/** + * Constraints are used to define conditions that must be met by the value of a variable. + * + * The uniform API of the constraints allows chains to be formed. + * + * The abstract constraint defines the api for all constraints. mainly the method isValid() is defined. + * + * Derived classes must implement the method isValid(). + * + * @license AGPLv3 + * @since 1.3.0 + * @copyright schukai GmbH + * @memberOf Monster.Constraints + * @summary The abstract constraint + */ +/** + * Constraints are used to define conditions that must be met by the value of a variable. + * + * The uniform API of the constraints allows chains to be formed. + * + * @externalExample ../../example/constraints/isarray.mjs + * @license AGPLv3 + * @since 1.3.0 + * @copyright schukai GmbH + * @memberOf Monster.Constraints + * @summary A constraint to check if a value is an array + */ +/** + * Deep freeze a object + * + * @param {object} object object to be freeze + * @license AGPLv3 + * @since 1.0.0 + * @returns {object} + * @memberOf Monster.Util + * @copyright schukai GmbH + * @throws {TypeError} value is not a object + */ +/** + * Error message for API requests with extension of request and validation. + * + * @license AGPLv3 + * @since 1.24.0 + * @copyright schukai GmbH + * @memberOf Monster.Data.Datasource.RestAPI + * @summary the error is thrown by the rest api in case of error + */ +/** + * Extend copies all enumerable own properties from one or + * more source objects to a target object. It returns the modified target object. + * + * @param {object} target + * @param {object} + * @return {object} + * @license AGPLv3 + * @since 1.10.0 + * @copyright schukai GmbH + * @memberOf Monster.Data + * @throws {Error} unsupported argument + * @throws {Error} type mismatch + */ +/** + * Get the closest object link of a node + * + * if a node is specified without a object link, a recursive search upwards is performed until the corresponding + * object link is found, or undefined is returned. + * + * @param {HTMLElement} element + * @return {HTMLElement|undefined} + * @license AGPLv3 + * @since 1.10.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {TypeError} value is not an instance of HTMLElement + */ +/** + * Messages can be formatted with the formatter. To do this, an object with the values must be passed to the formatter. The message can then contain placeholders. + * + * Look at the example below. The placeholders use the logic of Pipe. + * + * ## Marker in marker + * + * Markers can be nested. Here, the inner marker is resolved first `${subkey} ↦ 1 = ${mykey2}` and then the outer marker `${mykey2}`. + * + * ``` + * const text = '${mykey${subkey}}'; + * let obj = { + * mykey2: "1", + * subkey: "2" + * }; + * + * new Formatter(obj).format(text); + * // ↦ 1 + * ``` + * + * ## Callbacks + * + * The values in a formatter can be adjusted via the commands of the `Transformer` or the`Pipe`. + * There is also the possibility to use callbacks. + * + * const formatter = new Formatter({x: '1'}, { + * callbacks: { + * quote: (value) => { + * return '"' + value + '"' + * } + * } + * }); + * + * formatter.format('${x | call:quote}')) + * // ↦ "1" + * + * ## Marker with parameter + * + * A string can also bring its own values. These must then be separated from the key by a separator `::`. + * The values themselves must be specified in key/value pairs. The key must be separated from the value by a separator `=`. + * + * When using a pipe, you must pay attention to the separators. + * + * @example + * + * import {Formatter} from '@schukai/monster/source/text/formatter.mjs'; + * + * new Formatter({ + * a: { + * b: { + * c: "Hello" + * }, + * d: "world", + * } + * }).format("${a.b.c} ${a.d | ucfirst}!"); // with pipe + * + * // ↦ Hello World! + * + * @license AGPLv3 + * @since 1.12.0 + * @copyright schukai GmbH + * @memberOf Monster.Text + */ +/** + * Parse local according to rfc4646 standard + * + * Limitations: The regex cannot handle multiple variants or private. + * + * You can call the method via the monster namespace `Monster.I18n.createLocale()`. + * + * ``` + * <script type="module"> + * import {Monster} from '@schukai/monster/source//monster.mjs'; + * new Monster.I18n.createLocale() + * <\/script> + * ``` + * + * Alternatively, you can also integrate this function individually. + * + * ``` + * <script type="module"> + * import {createLocale} from '@schukai/monster/source/i18n/locale.mjs'; + * createLocale() + * <\/script> + * ``` + * + * RFC + * + * ``` + * The syntax of the language tag in ABNF [RFC4234] is: + * + * Language-Tag = langtag + * / privateuse ; private use tag + * / grandfathered ; grandfathered registrations + * + * langtag = (language + * ["-" script] + * ["-" region] + * *("-" variant) + * *("-" extension) + * ["-" privateuse]) + * + * language = (2*3ALPHA [ extlang ]) ; shortest ISO 639 code + * / 4ALPHA ; reserved for future use + * / 5*8ALPHA ; registered language subtag + * + * extlang = *3("-" 3ALPHA) ; reserved for future use + * + * script = 4ALPHA ; ISO 15924 code + * + * region = 2ALPHA ; ISO 3166 code + * / 3DIGIT ; UN M.49 code + * + * variant = 5*8alphanum ; registered variants + * / (DIGIT 3alphanum) + * + * extension = singleton 1*("-" (2*8alphanum)) + * + * singleton = %x41-57 / %x59-5A / %x61-77 / %x79-7A / DIGIT + * ; "a"-"w" / "y"-"z" / "A"-"W" / "Y"-"Z" / "0"-"9" + * ; Single letters: x/X is reserved for private use + * + * privateuse = ("x"/"X") 1*("-" (1*8alphanum)) + * + * grandfathered = 1*3ALPHA 1*2("-" (2*8alphanum)) + * ; grandfathered registration + * ; Note: i is the only singleton + * ; that starts a grandfathered tag + * + * alphanum = (ALPHA / DIGIT) ; letters and numbers + * + * Figure 1: Language Tag ABNF + * ``` + * + * @param {string} locale + * @returns {Locale} + * @license AGPLv3 + * @since 1.14.0 + * @copyright schukai GmbH + * @memberOf Monster.I18n + * @throws {TypeError} value is not a string + * @throws {Error} unsupported locale + */ +/** + * Pathfinder is a class to find a path to an object. + * + * With the help of the pathfinder, values can be read and written from an object construct. + * + * ``` + * new Pathfinder({ + * a: { + * b: { + * f: [ + * { + * g: false, + * } + * ], + * } + * } + * }).getVia("a.b.f.0.g"); // ↦ false + * ``` + * + * if a value is not present or has the wrong type, a corresponding exception is thrown. + * + * ``` + * new Pathfinder({}).getVia("a.b.f.0.g"); // ↦ Error + * ``` + * + * The `Pathfinder.exists()` method can be used to check whether access to the path is possible. + * + * ``` + * new Pathfinder({}).exists("a.b.f.0.g"); // ↦ false + * ``` + * + * pathfinder can also be used to build object structures. to do this, the `Pathfinder.setVia()` method must be used. + * + * ``` + * obj = {}; + * new Pathfinder(obj).setVia('a.b.0.c', true); // ↦ {a:{b:[{c:true}]}} + * ``` + * + * @externalExample ../../example/data/pathfinder-1.mjs + * @externalExample ../../example/data/pathfinder-2.mjs + * @license AGPLv3 + * @since 1.4.0 + * @copyright schukai GmbH + * @memberOf Monster.Data + */ +/** + * Removes an object from an element + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {Symbol} symbol + * @return {boolean} + */ +/** + * Return global function or throw Error + * + * You can call the method via the monster namespace `Monster.Types.getGlobalFunction()`. + * + * ``` + * <script type="module"> + * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.30.0/dist/monster.mjs'; + * console.log(Monster.Types.getGlobalFunction('parseInt')) // ↦ f parseInt() { } + * <\/script> + * ``` + * + * Alternatively, you can also integrate this function individually. + * + * ``` + * <script type="module"> + * import {getGlobalFunction} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.30.0/dist/modules/types/global.mjs'; + * console.log(getGlobalFunction('parseInt')) // ↦ f parseInt() { } + * <\/script> + * ``` + * + * @license AGPLv3 + * @since 1.6.0 + * @memberOf Monster.Types + * @param {string} name + * @return {objec} + * @throws {TypeError} value is not a function + * @throws {Error} the function is not defined + * @throws {TypeError} value is not a string + */ +/** + * Return global object or throw Error + * + * You can call the method via the monster namespace `Monster.Types.getGlobalObject()`. + * + * ``` + * <script type="module"> + * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.30.0/dist/monster.mjs'; + * Monster.Types.getGlobalObject('document') + * // ↦ { } + * <\/script> + * ``` + * + * Alternatively, you can also integrate this function individually. + * + * ``` + * <script type="module"> + * import {getGlobalObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.30.0/dist/modules/types/global.mjs'; + * getGlobalObject('document') + * // ↦ { } + * <\/script> + * ``` + * + * @license AGPLv3 + * @since 1.6.0 + * @memberOf Monster.Types + * @param {string} name + * @returns {objec} + * @throws {Error} the object is not defined + * @throws {TypeError} value is not a object + * @throws {TypeError} value is not a string + */ +/** + * Return globalThis + * + * If globalThis is not available, it will be polyfilled + * + * @license AGPLv3 + * @since 1.6.0 + * @memberOf Monster.Types + * @returns {objec} globalThis + */ +/** + * The Formatter extends the Text.Formatter with the possibility to replace the key by a translation. + * + * @externalExample ../../example/i18n/formatter.mjs + * @license AGPLv3 + * @since 1.26.0 + * @copyright schukai GmbH + * @memberOf Monster.I18n + */ +/** + * The LocalStorage Datasource provides a data store in the browser localStorage. + * + * @license AGPLv3 + * @since 1.22.0 + * @copyright schukai GmbH + * @memberOf Monster.Data.Datasource.Storage + * @summary The LocalStorage class encapsulates the access to data objects. + */ +/** + * The Locale class is a base class for the language classes. + * + * RFC + * + * ``` + * A Language-Tag consists of: + * langtag ; generated tag + * -or- private-use ; a private use tag + * + * langtag = (language + * ["-" script] + * ["-" region] + * *("-" variant) + * *("-" extension) + * ["-" privateuse]) + * + * language = "en", "ale", or a registered value + * + * script = "Latn", "Cyrl", "Hant" ISO 15924 codes + * + * region = "US", "CS", "FR" ISO 3166 codes + * "419", "019", or UN M.49 codes + * + * variant = "rozaj", "nedis", "1996", multiple subtags can be used in a tag + * + * extension = single letter followed by additional subtags; more than one extension + * may be used in a language tag + * + * private-use = "x-" followed by additional subtags, as many as are required + * Note that these can start a tag or appear at the end (but not + * in the middle) + * ``` + * + * @license AGPLv3 + * @since 1.13.0 + * @copyright schukai GmbH + * @memberOf Monster.I18n + * @see https://datatracker.ietf.org/doc/html/rfc3066 + */ +/** + * The ObjectLink can be used to attach objects to HTMLElements. The elements are kept in a set under a unique + * symbol and can be read via an iterator {@see {@link getLinkedObjects}}. + * + * In addition, elements with an objectLink receive the attribute `data-monster-objectlink`. + * + * With the method {@see {@link addToObjectLink}} the objects can be added. + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {Symbol} symbol + * @return {Iterator} + * @throws {Error} there is no object link for symbol + */ +/** + * The ResourceManager is a singleton that manages all resources. + * + * @license AGPLv3 + * @since 1.25.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @summary A Resource class + */ +/** + * The RestAPI is a class that enables a REST API server. + * + * @externalExample ../../../example/data/storage/restapi.mjs + * @license AGPLv3 + * @since 1.22.0 + * @copyright schukai GmbH + * @memberOf Monster.Data.Datasource + * @summary The LocalStorage class encapsulates the access to data objects. + */ +/** + * The SessionStorage class provides a data source that uses the SessionStorage API on the client. + * + * @license AGPLv3 + * @since 1.22.0 + * @copyright schukai GmbH + * @memberOf Monster.Data.Datasource.Storage + * @summary The LocalStorage class encapsulates the access to data objects. + */ +/** + * The Theme class provides the functionality for the theme. + * + * @externalExample ../../example/dom/theme.mjs + * @license AGPLv3 + * @since 1.7.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @summary A theme class + */ +/** + * The UUID class makes it possible to get a unique UUID for an object. + * + * @license AGPLv3 + * @since 1.25.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {Error} unsupported + */ +/** + * The `RandomID` class provides a unique ID for an item. + * + * @license AGPLv3 + * @since 1.6.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @summary class to generate random numbers + */ +/** + * The built-in typeof method is known to have some historical weaknesses. This function tries to provide a better and more accurate result. + * + * @externalExample ../../example/types/typeof.mjs + * @param {*} value + * @return {string} + * @license AGPLv3 + * @since 1.7.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not a primitive + */ +/** + * The class represents a record. + * + * @license AGPLv3 + * @since 1.22.0 + * @copyright schukai GmbH + * @memberOf Monster.Data.Datasource + * @summary The Storage class encapsulates the access to data objects over WebStorageAPI. + */ +/** + * The comparator allows a comparison function to be abstracted. + * + * The following are some examples of the application of the class. + * + * ``` + * new Comparator().lessThanOrEqual(2, 5) // ↦ true + * new Comparator().greaterThan(4, 2) // ↦ true + * new Comparator().equal(4, 4) // ↦ true + * new Comparator().equal(4, 5) // ↦ false + * ``` + * + * You can also pass your own comparison function, and thus define the comparison function. + * + * ``` + * new Comparator(function (a, b) { + * if (a.v === b.v) return 0; + * return a.v < b.v ? -1 : 1; + * }).equal({v: 2}, {v: 2}); // ↦ true + * ``` + * + * @externalExample ../../example/util/comparator.mjs + * @license AGPLv3 + * @since 1.3.0 + * @memberOf Monster.Util + */ +/** + * The datasource class is the basis for dealing with different data sources. + * It provides a unified interface for accessing data + * @externalExample ../../example/data/datasource.mjs + * @license AGPLv3 + * @since 1.22.0 + * @copyright schukai GmbH + * @memberOf Monster.Data + * @summary The datasource class encapsulates the access to data objects. + */ +/** + * The dead man's switch allows to set a timer which can be reset again and again within a defined period of time. + * + * @externalExample ../../example/util/deadmansswitch.mjs + * @copyright schukai GmbH + * @license AGPLv3 + * @since 1.29.0 + * @memberOf Monster.Util + * @summary Class to be able to execute function chains + */ +/** + * The fetch provider retrieves a JSON file from the given URL and returns a translation object. + * + * @externalExample ../../../example/i18n/providers/fetch.mjs + * @license AGPLv3 + * @since 1.13.0 + * @copyright schukai GmbH + * @memberOf Monster.I18n.Providers + * @see {@link https://datatracker.ietf.org/doc/html/rfc3066} + * @tutorial i18n-locale-and-formatter + */ +/** + * The function sends an event + * + * @param {HTMLElement|HTMLCollection|NodeList} element + * @param {string} type + * @return {void} + * @license AGPLv3 + * @since 1.10.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {TypeError} value is not an instance of HTMLElement or HTMLCollection + * @summary Construct and send and event + */ +/** + * The log handler is the interface between the log entries and the log listeners. + * + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Logging + */ +/** + * The logger is a class that takes care of logging. + * + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Logging + */ +/** + * The pipe class makes it possible to combine several processing steps. + * + * A pipe consists of commands whose input and output are connected with the pipe symbol `|`. + * + * With the Pipe, processing steps can be combined. Here, the value of an object is accessed via the pathfinder (path command). + * the word is then converted to uppercase letters and a prefix Hello is added. the two backslash safe the space char. + * + * @externalExample ../../example/data/pipe.mjs + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Data + */ +/** + * The template class provides methods for creating templates. + * + * @license AGPLv3 + * @since 1.6.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @summary A template class + */ +/** + * The theming used in the document can be defined via the html-tag. + * The theming is specified via the attribute `data-monster-theme-name`. + * + * As name for a theme all characters are valid, which are also allowed for a HTMLElement-ID. + * + * ``` + * <html data-monster-theme-name="my-theme"> + * ``` + * + * the default theme name is `monster`. + * + * @return {Theme} + * @memberOf Monster.DOM + * @license AGPLv3 + * @since 1.7.0 + */ +/** + * The transformer class is a swiss army knife for manipulating values. especially in combination with the pipe, processing chains can be built up. + * + * A simple example is the conversion of all characters to lowercase. for this purpose the command `tolower` must be used. + * + * ``` + * let t = new Transformer('tolower').run('ABC'); // ↦ abc + * ``` + * + * **all commands** + * + * in the following table all commands, parameters and existing aliases are described. + * + * | command | parameter | alias | description | + * |:-------------|:---------------------------|:------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + * | to-base64 | | base64, btob | Converts the value to base64 | + * | from-base64 | | atob | Converts the value from base64 | + * | call | function:param1:param2:... | | Calling a callback function. The function can be defined in three places: either globally, in the context `addCallback` or in the passed object | + * | default | value:type | ?? | If the value is undefined the first argument is returned, otherwise the value. The third optional parameter specifies the desired type. If no type is specified, string is used. Valid types are bool, string, int, float, undefined and object. An object default value must be specified as a base64 encoded json string. (since 1.12.0) | + * | debug | | | the passed value is output (console) and returned | + * | empty | | | Return empty String "" | + * | first-key | default | | Can be applied to objects and returns the value of the first key. All keys of the object are fetched and sorted. (since 1.23.0) | + * | fromjson | | | Type conversion from a JSON string (since 1.12.0) | + * | if | statement1:statement2 | ? | Is the ternary operator, the first parameter is the valid statement, the second is the false part. To use the current value in the queue, you can set the value keyword. On the other hand, if you want to have the static string "value", you have to put one backslash \\ in front of it and write value. the follow values are true: 'on', true, 'true'. If you want to have a space, you also have to write \\ in front of the space. | + * | index | key:default | property, key | Fetches a value from an object, an array, a map or a set | + * | last-key | default | | Can be applied to objects and returns the value of the last key. All keys of the object are fetched and sorted. (since 1.23.0) | + * | length | | count | Length of the string or entries of an array or object | + * | nop | | | Do nothing | + * | nth-key | index:default | | Can be applied to objects and returns the value of the nth key. All keys of the object are fetched and sorted. (since 1.23.0) | + * | nth-last-key | index:default | | Can be applied to objects and returns the value of the nth key from behind. All keys of the object are fetched and sorted. (since 1.23.0) | + * | path | path | | The access to an object is done via a Pathfinder object | + * | path-exists | path | | Check if the specified path is available in the value (since 1.24.0) | + * | plaintext | | plain | All HTML tags are removed (*) | + * | prefix | text | | Adds a prefix | + * | rawurlencode | | | URL coding | + * | static | | none | The Arguments value is used and passed to the value. Special characters \ <space> and : can be quotet by a preceding \. | + * | substring | start:length | | Returns a substring | + * | suffix | text | | Adds a suffix | + * | tointeger | | | Type conversion to an integer value | + * | tojson | | | Type conversion to a JSON string (since 1.8.0) | + * | tolower | | strtolower, tolowercase | The input value is converted to lowercase letters | + * | tostring | | | Type conversion to a string. | + * | toupper | | strtoupper, touppercase | The input value is converted to uppercase letters | + * | trim | | | Remove spaces at the beginning and end | + * | ucfirst | | | First character large | + * | ucwords | | | Any word beginning large | + * | undefined | | | Return undefined | + * | uniqid | | | Creates a string with a unique value (**) + * + * (*) for this functionality the extension [jsdom](https://www.npmjs.com/package/jsdom) must be loaded in the nodejs context. + * + * ``` + * // polyfill + * if (typeof window !== "object") { + * const {window} = new JSDOM('', { + * url: 'http://example.com/', + * pretendToBeVisual: true + * }); + * + * [ + * 'self', + * 'document', + * 'Node', + * 'Element', + * 'HTMLElement', + * 'DocumentFragment', + * 'DOMParser', + * 'XMLSerializer', + * 'NodeFilter', + * 'InputEvent', + * 'CustomEvent' + * ].forEach(key => (global[key] = window[key])); + * } + * ``` + * + * (**) for this command the crypt library is necessary in the nodejs context. + * + * ``` + * import * as Crypto from "@peculiar/webcrypto"; + * global['crypto'] = new Crypto.Crypto(); + * ``` + * + * @externalExample ../../example/data/transformer.mjs + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Data + */ +/** + * The updater class connects an object with the dom. In this way, structures and contents in the DOM can be programmatically adapted via attributes. + * + * For example, to include a string from an object, the attribute `data-monster-replace` can be used. + * a further explanation can be found under {@tutorial dom-based-templating-implementation}. + * + * Changes to attributes are made only when the direct values are changed. If you want to assign changes to other values + * as well, you have to insert the attribute `data-monster-select-this`. This should be done with care, as it can reduce performance. + * + * @externalExample ../../example/dom/updater.mjs + * @license AGPLv3 + * @since 1.8.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {Error} the value is not iterable + * @throws {Error} pipes are not allowed when cloning a node. + * @throws {Error} no template was found with the specified key. + * @throws {Error} the maximum depth for the recursion is reached. + * @throws {TypeError} value is not a object + * @throws {TypeError} value is not an instance of HTMLElement + * @summary The updater class connects an object with the dom + */ +/** + * The version object contains a semantic version number + * + * @externalExample ../../example/types/version-1.mjs + * @license AGPLv3 + * @since 1.0.0 + * @author schukai GmbH + * @copyright schukai GmbH + * @memberOf Monster.Types + * @summary The version object contains a sematic version number + */ +/** + * This class allows to execute several functions in order. + * + * Functions and timeouts can be passed. If a timeout is passed, it applies to all further functions. + * In the example + * + * `timeout1, function1, function2, function3, timeout2, function4` + * + * the timeout1 is valid for the functions 1, 2 and 3 and the timeout2 for the function4. + * + * So the execution time is timeout1+timeout1+timeout1+timeout2 + * + * The result of `run()` is a promise. + * + * @externalExample ../../example/util/processing.mjs + * @copyright schukai GmbH + * @license AGPLv3 + * @since 1.21.0 + * @memberOf Monster.Util + * @summary Class to be able to execute function chains + */ +/** + * This class is the base class for all resources to be loaded. + * + * @license AGPLv3 + * @since 1.25.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @summary A Resource class + */ +/** + * This class is used by the resource manager to embed data. + * + * @license AGPLv3 + * @since 1.25.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM.Resource + * @summary A Data Resource class + */ +/** + * This class is used by the resource manager to embed external resources. + * + * @license AGPLv3 + * @since 1.25.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM.Resource + * @summary A Resource class + * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link + */ +/** + * This class is used by the resource manager to embed scripts. + * + * @license AGPLv3 + * @since 1.25.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM.Resource + * @summary A Resource class + */ +/** + * This function can be used to remove tokens from an attribute. + * + * Tokens are always separated by a space. + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {string} key + * @param {string} token + * @return {HTMLElement} + */ +/** + * This function gets the path `Event.composedPath()` from an event and tries to find the next element + * up the tree `element.closest()` with the attribute and value. If no value, or a value that is undefined or null, + * is specified, only the attribute is searched. + * + * @license AGPLv3 + * @since 1.14.0 + * @param {Event} event + * @param {string} attributeName + * @param {string|null|undefined} attributeValue + * @throws {Error} unsupported event + * @memberOf Monster.DOM + * @throws {TypeError} value is not a string + * @throws {TypeError} value is not an instance of HTMLElement + * @summary Help function to find the appropriate control + */ +/** + * This function prefixes all special characters that may appear in a regex with a slash. + * + * @param {string} value + * @return {string} + * @license AGPLv3 + * @since 1.26.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not a string + */ +/** + * This function searches, starting from an `HTMLElemement`, for the next element that has a certain attribute. + * + * ```html + * <div class="myclass" id="2"> + * <div id="1"></div> + * </div> + * ``` + * + * ```javascript + * // if no value is specified (undefined), then only the attribute is checked. + * findClosestByClass(document.getElementById('1'),'myclass'); // ↦ node with id 2 + * findClosestByClass(document.getElementById('2'),'myclass'); // ↦ node with id 2 + * ``` + * + * ``` + * <script type="module"> + * import {findClosestByClass} from '@schukai/monster/source/dom/attributes.mjs'; + * findClosestByClass(); + * <\/script> + * ``` + * + * @license AGPLv3 + * @since 1.27.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {string} className + * @return {HTMLElement|undefined} + * @summary find closest node + */ +/** + * This function searches, starting from an `HTMLElemement`, for the next element that has a certain attribute. + * + * ```html + * <div data-my-attribute="2" id="2"> + * <div id="1"></div> + * </div> + * ``` + * + * ```javascript + * // if no value is specified (undefined), then only the attribute is checked. + * findClosestByAttribute(document.getElementById('1'),'data-my-attribute'); // ↦ node with id 2 + * findClosestByAttribute(document.getElementById('2'),'data-my-attribute'); // ↦ node with id 2 + * + * // if a value is specified, for example an empty string, then the name and the value are checked. + * findClosestByAttribute(document.getElementById('1'),'data-my-attribute', ''); // ↦ undefined + * findClosestByAttribute(document.getElementById('1'),'data-my-attribute', '2'); // ↦ node with id 2 + * ``` + * + * @license AGPLv3 + * @since 1.14.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {string} key + * @param {string|undefined} value + * @return {HTMLElement|undefined} + * @summary find closest node + */ +/** + * This is the base class from which all monster classes are derived. + * + * The class was formerly called Object. + * + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * This is the base class with options from which some monster classes are derived. + * + * This class is actually only used as a base class. + * + * Classes that require the possibility of options can be derived directly from this class. + * Derived classes almost always override the `defaul` getter with their own values. + * + * @externalExample ../../example/types/basewithoptions.mjs + * @license AGPLv3 + * @since 1.13.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * This is the name of the attribute to pass options to a control + * + * @memberOf Monster.DOM + * @license AGPLv3 + * @since 1.30.0 + * @type {string} + */ +/** + * This is the name of the attribute to pass options to a control + * + * @memberOf Monster.DOM + * @license AGPLv3 + * @since 1.8.0 + * @type {string} + */ +/** + * This method can be used to add a token to an attribute. Tokens are always separated by a space. + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {string} key + * @param {string} token + * @return {HTMLElement} + */ +/** + * This method can be used to determine whether an attribute has a token. + * + * Tokens are always separated by a space. + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {string} key + * @param {string} token + * @return {boolean} + */ +/** + * This method checks if the type is an integer. this function is identical to isInteger() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validateFunction} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateInteger(true)) // ↦ TypeError + * console.log(validateInteger('2')) // ↦ TypeError + * console.log(validateInteger(2)) // ↦ value + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.4.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not an integer + */ +/** + * This method checks if the type matches the array type. this function is identical to isArray() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validateArray} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateArray('2')) // ↦ TypeError + * console.log(validateArray([])) // ↦ value + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not an array + */ +/** + * This method checks if the type matches the boolean type. this function is identical to isBoolean() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validateBoolean} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateBoolean(false)) // ↦ value + * console.log(validateBoolean('2')) // ↦ TypeError + * console.log(validateBoolean([])) // ↦ TypeError + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + + * @throws {TypeError} value is not primitive + */ +/** + * This method checks if the type matches the function type. this function is identical to isFunction() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validateFunction} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateFunction(()=>{})) // ↦ value + * console.log(validateFunction('2')) // ↦ TypeError + * console.log(validateFunction([])) // ↦ TypeError + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not a function + */ +/** + * This method checks if the type matches the object instance. + * + * ``` + * <script type="module"> + * import {validateInstance} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateInstance({}, Object)) // ↦ value + * console.log(validateInstance('2', Object)) // ↦ TypeError + * console.log(validateInstance([], Object)) // ↦ TypeError + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not an instance of + */ +/** + * This method checks if the type matches the object type. this function is identical to isObject() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validateObject} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateObject({})) // ↦ value + * console.log(validateObject('2')) // ↦ TypeError + * console.log(validateObject([])) // ↦ TypeError + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not a object + */ +/** + * This method checks if the type matches the primitive type. this function is identical to isPrimitive() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validateIterable} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateIterable('2')) // ↦ TypeError + * console.log(validateIterable([])) // ↦ value + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.2.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not a primitive + * @see {@link isPrimitive} + * @see {@link Monster.Types.isPrimitive} + * @see {@link Monster.Types#isPrimitive} + */ +/** + * This method checks if the type matches the primitive type. this function is identical to isPrimitive() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validatePrimitive} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validatePrimitive('2')) // ↦ value + * console.log(validatePrimitive([])) // ↦ TypeError + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not a primitive + * @see {@link isPrimitive} + * @see {@link Monster.Types.isPrimitive} + * @see {@link Monster.Types#isPrimitive} + */ +/** + * This method checks if the type matches the string type. this function is identical to isString() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validateString} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateString('2')) // ↦ value + * console.log(validateString([])) // ↦ TypeError + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not a string + */ +/** + * This method checks if the type matches the symbol type. this function is identical to isSymbol() except that a TypeError is thrown. + * + * ``` + * <script type="module"> + * import {validateSymbol} from '@schukai/monster/source/types/validate.mjs'; + * console.log(validateSymbol('2')) // ↦ TypeError + * console.log(validateSymbol()) // ↦ value + * <\/script> + * ``` + * + * @param {*} value + * @return {*} + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @throws {TypeError} value is not an symbol + */ +/** + * This method fetches the document object + * + * In nodejs this functionality can be performed with [jsdom](https://www.npmjs.com/package/jsdom). + * + * ``` + * import {JSDOM} from "jsdom" + * if (typeof window !== "object") { + * const {window} = new JSDOM('', { + * url: 'http://example.com/', + * pretendToBeVisual: true + * }); + * + * [ + * 'self', + * 'document', + * 'Document', + * 'Node', + * 'Element', + * 'HTMLElement', + * 'DocumentFragment', + * 'DOMParser', + * 'XMLSerializer', + * 'NodeFilter', + * 'InputEvent', + * 'CustomEvent' + * ].forEach(key => (getGlobal()[key] = window[key])); + * } + * ``` + * + * @returns {DocumentFragment} + * @license AGPLv3 + * @since 1.6.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {Error} not supported environment + * @throws {TypeError} value is not a string + */ +/** + * This method fetches the document object + * + * In nodejs this functionality can be performed with [jsdom](https://www.npmjs.com/package/jsdom). + * + * ``` + * import {JSDOM} from "jsdom" + * if (typeof window !== "object") { + * const {window} = new JSDOM('', { + * url: 'http://example.com/', + * pretendToBeVisual: true + * }); + * + * [ + * 'self', + * 'document', + * 'Document', + * 'Node', + * 'Element', + * 'HTMLElement', + * 'DocumentFragment', + * 'DOMParser', + * 'XMLSerializer', + * 'NodeFilter', + * 'InputEvent', + * 'CustomEvent' + * ].forEach(key => (getGlobal()[key] = window[key])); + * } + * ``` + * + * @returns {object} + * @license AGPLv3 + * @since 1.6.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {Error} not supported environment + */ +/** + * This method fetches the window object + * + * In nodejs this functionality can be performed with [jsdom](https://www.npmjs.com/package/jsdom). + * + * ``` + * import {JSDOM} from "jsdom" + * if (typeof window !== "object") { + * const {window} = new JSDOM('', { + * url: 'http://example.com/', + * pretendToBeVisual: true + * }); + * + * getGlobal()['window']=window; + * + * [ + * 'self', + * 'document', + * 'Document', + * 'Node', + * 'Element', + * 'HTMLElement', + * 'DocumentFragment', + * 'DOMParser', + * 'XMLSerializer', + * 'NodeFilter', + * 'InputEvent', + * 'CustomEvent' + * ].forEach(key => (getGlobal()[key] = window[key])); + * } + * ``` + * + * @returns {object} + * @license AGPLv3 + * @since 1.6.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {Error} not supported environment + */ +/** + * This method loads a template with the given ID and returns it. + * + * To do this, it first reads the theme of the document and looks for the `data-monster-theme-name` attribute in the HTML tag. + * + * ``` + * <html data-monster-theme-name="my-theme"> + * ``` + * + * If no theme was specified, the default theme is `monster`. + * + * Now it is looked if there is a template with the given ID and theme `id-theme` and if yes it is returned. + * If there is no template a search for a template with the given ID `id` is done. If this is also not found, an error is thrown. + * + * You can call the method via the monster namespace `Monster.DOM.findDocumentTemplate()`. + * + * ``` + * <script type="module"> + * import {findTemplate} from '@schukai/monster/source/dom/template.mjs'; + * findDocumentTemplate() + * <\/script> + * ``` + * + * @example + * + * import { findDocumentTemplate } from "https://cdn.jsdelivr.net/npm/@schukai/monster@latest/source/dom/template.mjs"; + * + * const template = document.createElement("template"); + * template.id = "myTemplate"; + * template.innerHTML = "<p>my default template</p>"; + * document.body.appendChild(template); + * + * const themedTemplate = document.createElement("template"); + * themedTemplate.id = "myTemplate-myTheme"; + * themedTemplate.innerHTML = "<p>my themed template</p>"; + * document.body.appendChild(themedTemplate); + * + * // loads the temple and since no theme is set the default template + * const template1 = findDocumentTemplate("myTemplate"); + * console.log(template1.createDocumentFragment()); + * // ↦ '<p>my default template</p>' + * + * // now we set our own theme + * document + * .querySelector("html") + * .setAttribute("data-monster-theme-name", "myTheme"); + * + * // now we don't get the default template, + * // but the template with the theme in the id + * const template2 = findDocumentTemplate("myTemplate"); + * console.log(template2.createDocumentFragment()); + * // ↦ '<p>my themed template</p>' + * + * @param {string} id + * @param {Node} currentNode + * @return {Monster.DOM.Template} + * @license AGPLv3 + * @since 1.7.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {Error} template id not found. + * @throws {TypeError} value is not a string + */ +/** + * This method registers a new element. The string returned by `CustomElement.getTag()` is used as the tag. + * + * @param {CustomElement} element + * @return {void} + * @license AGPLv3 + * @since 1.7.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {DOMException} Failed to execute 'define' on 'CustomElementRegistry': is not a valid custom element name + */ +/** + * This special trim function allows to trim spaces that have been protected by a special escape character. + * + * ``` + * <script type="module"> + * import {trimSpaces} from '@schukai/monster/source/util/trimspaces.mjs'; + * trimSpaces(' hello \\ ') + * <\/script> + * ``` + * + * Hint: One stroke is escaped by the javascript interpreter, the second stroke escapes the stroke. + * + * ```text + * a\ b ↦ a b + * a\\ b ↦ a\ b + * ``` + * + * @license AGPLv3 + * @since 1.24.0 + * @memberOf Monster.Util + * @copyright schukai GmbH + * @param {string} value + * @return {string} + * @throws {TypeError} value is not a string + */ +/** + * This variable is a promise that is fulfilled as soon as the dom is available. + * + * The DOMContentLoaded event is fired when the original HTML document is fully loaded and parsed + * without waiting for stylesheets, images, and subframes to finish loading. + * + * @license AGPLv3 + * @since 1.31.0 + * @memberOf Monster.DOM + * @summary variable to check if dom is ready + * @type {Promise} + * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event + * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState + */ +/** + * This variable is a promise that is fulfilled as soon as the windows is available. + * + * The load event fires when the entire page is loaded, including all dependent resources such as stylesheets, + * assets, and images. Unlike DOMContentLoaded, which fires as soon as the DOM of the page is loaded, + * without waiting for the resources to finish loading. + * + * @license AGPLv3 + * @since 1.31.0 + * @memberOf Monster.DOM + * @summary variable to check if window is ready + * @type {Promise} + * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event + * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState + */ +/** + * To define a new HTML control we need the power of CustomElement + * + * IMPORTANT: after defining a `CustomElement`, the `registerCustomElement` method must be called + * with the new class name. only then will the tag defined via the `getTag` method be made known to the DOM. + * + * <img src="./images/customcontrol-class.png"> + * + * This control uses `attachInternals()` to integrate the control into a form. + * If the target environment does not support this method, the [polyfill](https://www.npmjs.com/package/element-internals-polyfill ) can be used. + * + * You can create the object via the function `document.createElement()`. + * + * @startuml customcontrol-class.png + * skinparam monochrome true + * skinparam shadowing false + * HTMLElement <|-- CustomElement + * CustomElement <|-- CustomControl + * @enduml + * + * @summary A base class for customcontrols based on CustomElement + * @see {@link https://www.npmjs.com/package/element-internals-polyfill} + * @see {@link https://github.com/WICG/webcomponents} + * @see {@link https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements} + * @license AGPLv3 + * @since 1.14.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + */ +/** + * To define a new HTML element we need the power of CustomElement + * + * IMPORTANT: after defining a `CustomElement`, the `registerCustomElement` method must be called + * with the new class name. only then will the tag defined via the `getTag` method be made known to the DOM. + * + * <img src="./images/customelement-class.png"> + * + * You can create the object via the function `document.createElement()`. + * + * + * ## Interaction + * + * <img src="./images/customelement-sequencediagram.png"> + * + * ## Styling + * + * For optimal display of custom-elements the pseudo-class :defined can be used. + * + * To prevent the custom elements from being displayed and flickering until the control is registered, it is recommended to create a css directive. + * + * In the simplest case, you can simply hide the control. + * + * ``` + * <style> + * + * my-custom-element:not(:defined) { + * display: none; + * } + * + * my-custom-element:defined { + * display: flex; + * } + * + * </style> + * ``` + * + * Alternatively you can also display a loader + * + * ``` + * my-custom-element:not(:defined) { + * display: flex; + * box-shadow: 0 4px 10px 0 rgba(33, 33, 33, 0.15); + * border-radius: 4px; + * height: 200px; + * position: relative; + * overflow: hidden; + * } + * + * my-custom-element:not(:defined)::before { + * content: ''; + * display: block; + * position: absolute; + * left: -150px; + * top: 0; + * height: 100%; + * width: 150px; + * background: linear-gradient(to right, transparent 0%, #E8E8E8 50%, transparent 100%); + * animation: load 1s cubic-bezier(0.4, 0.0, 0.2, 1) infinite; + * } + * + * @keyframes load { + * from { + * left: -150px; + * } + * to { + * left: 100%; + * } + * } + * + * my-custom-element:defined { + * display: flex; + * } + * ``` + * + * @externalExample ../../example/dom/theme.mjs + * @see https://github.com/WICG/webcomponents + * @see https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements + * @license AGPLv3 + * @since 1.7.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @extends external:HTMLElement + * @summary A base class for HTML5 customcontrols + */ +/** + * Tokens are always separated by a space. + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {string} key + * @param {string} from + * @param {string} to + * @return {HTMLElement} + */ +/** + * Tokens are always separated by a space. + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {string} key + * @return {HTMLElement} + */ +/** + * Version of monster + * + * @externalExample ../../example/types/version-2.mjs + * @returns {Monster.Types.Version} + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @author schukai GmbH + * @memberOf Monster + */ +/** + * With the diff function you can perform the change of one object to another. The result shows the changes of the second object to the first object. + * + * The operator `add` means that something has been added to the second object. `delete` means that something has been deleted from the second object compared to the first object. + * + * @externalExample ../../example/data/diff.mjs + * @param {*} first + * @param {*} second + * @return {array} + * @license AGPLv3 + * @since 1.6.0 + * @copyright schukai GmbH + * @memberOf Monster.Data + */ +/** + * With the focusmanager the focus can be stored in a document, recalled and moved. + * + * @license AGPLv3 + * @since 1.25.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {Error} unsupported locale + * @summary Handle the focus + */ +/** + * With the help of the ObserverList class, observer can be managed. + * + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * With the help of the function `buildTree()`, nodes can be easily created from data objects. + * + * @param {*} subject + * @param {string|Monster.Data~exampleSelectorCallback} selector + * @param {string} idKey + * @param {string} parentIDKey + * @param {buildTreeOptions} [options] + * @return {*} + * @memberOf Monster.Data + * @throws {TypeError} value is neither a string nor a function + * @throws {TypeError} the selector callback must return a map + * @throws {Error} the object has no value for the specified id + * @license AGPLv3 + * @since 1.26.0 + */ +/** + * With the id class, sequences of ids can be created. for this purpose, an internal counter is incremented for each prefix. + * thus, the first id with the prefix `myid` will be `myid1` and the second id `myid2`. + * The ids are the same for every call, for example on a web page. + * + * So the ids can also be used for navigation. you just have to take care that the order stays the same. + * + * As of version 1.6.0 there is the new RandomID. this ID class is continuous from now on. + * + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @summary Automatic generation of ids + */ +/** + * With this class you can manage translations and access the keys. + * + * @externalExample ../../example/i18n/translations.mjs + * @license AGPLv3 + * @since 1.13.0 + * @copyright schukai GmbH + * @memberOf Monster.I18n + * @see https://datatracker.ietf.org/doc/html/rfc3066 + */ +/** + * With this function you can check if a value is iterable. + * + * This method is used in the library to have consistent names. + * + * You can call the method via the monster namespace `Monster.Types.isPrimitive()`. + * + * @externalExample ../../example/types/is-1.mjs + * @param {*} value + * @returns {boolean} + * @license AGPLv3 + * @since 1.2.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * With this function you can read the language version set by the document. + * For this the attribute `lang` in the html tag is read. If no attribute is set, `en` is used as default. + * + * ```html + * <html lang="en"> + * ``` + * + * You can call the function via the monster namespace `new Monster.DOM.getLocaleOfDocument()`. + * + * @license AGPLv3 + * @since 1.13.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {TypeError} value is not a string + * @throws {Error} unsupported locale + * @summary Tries to determine the locale used + */ +/** + * With this function, objects can be cloned. + * The entire object tree is run through. + * + * Proxy, Element, HTMLDocument and DocumentFragment instances are not cloned. + * Global objects such as windows are also not cloned, + * + * If an object has a method `getClone()`, this method is used to create the clone. + * + * @param {*} obj object to be cloned + * @returns {*} + * @license AGPLv3 + * @since 1.0.0 + * @memberOf Monster.Util + * @copyright schukai GmbH + * @throws {Error} unable to clone obj! its type isn't supported. + */ +/** + * With this method tokens in an attribute can be switched on or off. For example, classes can be switched on and off in the elements class attribute. + * + * Tokens are always separated by a space. + * + * @license AGPLv3 + * @since 1.9.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @param {HTMLElement} element + * @param {string} key + * @param {string} token + * @return {HTMLElement} + */ +/** + * You can call the function via the monster namespace `Monster.Types.fromBinary()`. + * + * @param {String} binary + * @return {String} + * @throws {TypeError} value is not a string + * @memberOf Monster.Types + * @license AGPLv3 + * @since 1.18.0 + */ +/** + * You can call the function via the monster namespace `Monster.Types.toBinary()`. + * + * @param {String} binary + * @return {String} + * @throws {TypeError} value is not a string + * @memberOf Monster.Types + * @license AGPLv3 + * @since 1.18.0 + */ +/** + * You can call the function via the monster namespace `new Monster.DOM.fireCustomEvent()`. + * + * @param {HTMLElement|HTMLCollection|NodeList} element + * @param {string} type + * @return {void} + * @license AGPLv3 + * @since 1.29.0 + * @copyright schukai GmbH + * @memberOf Monster.DOM + * @throws {TypeError} value is not an instance of HTMLElement or HTMLCollection + * @summary Construct and send and event + */ +/** + * You can call the method via the monster namespace `new Monster.Types.Queue()`. + * + * @license AGPLv3 + * @since 1.4.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * You can create an object of the class simply by using the namespace `new Monster.Logging.Handler.ConsoleHandler()`. + * + * @license AGPLv3 + * @since 1.5.0 + * @copyright schukai GmbH + * @memberOf Monster.Logging.Handler + */ +/** + * You can create an object via the monster namespace `new Monster.Types.DataUrl()`. + * + * @license AGPLv3 + * @since 1.8.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs + * @see https://datatracker.ietf.org/doc/html/rfc2397 + */ +/** + * You can create an object via the monster namespace `new Monster.Types.MediaType()`. + * + * @license AGPLv3 + * @since 1.8.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + */ +/** + * You can create the instance via the monster namespace `new Monster.Types.Node()`. + * + * @license AGPLv3 + * @since 1.26.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @summary A Node Class + * @see https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Iteration_protocols + */ +/** + * You can create the instance via the monster namespace `new Monster.Types.NodeList()`. + * + * @license AGPLv3 + * @since 1.26.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @summary A NodeList class + */ +/** + * You can create the instance via the monster namespace `new Monster.Types.NodeRecursiveIterator()`. + * + * @externalExample ../../example/types/noderecursiveiterator.mjs + * @license AGPLv3 + * @since 1.26.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @summary An iterator to run recursively through a tree of nodes + */ +/** + * You can create the instance via the monster namespace `new Monster.Types.Queue()`. + * + * @externalExample ../../example/types/queue.mjs + * @license AGPLv3 + * @since 1.4.0 + * @copyright schukai GmbH + * @memberOf Monster.Types + * @summary A Queue (Fifo) + */ +/** + * this function uses crypt and returns a random number. + * + * @param {number} min starting value of the definition set (default is 0) + * @param {number} max end value of the definition set (default is 1000000000) + * @returns {number} + * @memberOf Monster.Math + * @throws {Error} missing crypt + * @throws {Error} we cannot generate numbers larger than 53 bits. + * @throws {Error} the distance is too small to create a random number. + + * @license AGPLv3 + * @since 1.0.0 + * @copyright schukai GmbH + */ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fzc2VydGlvbi1lcnJvckAxLjEuMC9ub2RlX21vZHVsZXMvYXNzZXJ0aW9uLWVycm9yL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wYXRodmFsQDEuMS4xL25vZGVfbW9kdWxlcy9wYXRodmFsL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2ZsYWcuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvdGVzdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHlwZS1kZXRlY3RANC4wLjgvbm9kZV9tb2R1bGVzL3R5cGUtZGV0ZWN0L3R5cGUtZGV0ZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2V4cGVjdFR5cGVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2dldEFjdHVhbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZ2V0LWZ1bmMtbmFtZUAyLjAuMC9ub2RlX21vZHVsZXMvZ2V0LWZ1bmMtbmFtZS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdXRpbEAwLjEyLjQvbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vbG91cGVAMi4zLjQvbm9kZV9tb2R1bGVzL2xvdXBlL2xvdXBlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL2NvbmZpZy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9pbnNwZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL29iakRpc3BsYXkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvZ2V0TWVzc2FnZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy90cmFuc2ZlckZsYWdzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9kZWVwLWVxbEAzLjAuMS9ub2RlX21vZHVsZXMvZGVlcC1lcWwvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvaXNQcm94eUVuYWJsZWQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvYWRkUHJvcGVydHkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvYWRkTGVuZ3RoR3VhcmQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvZ2V0UHJvcGVydGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9wcm94aWZ5LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2FkZE1ldGhvZC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9vdmVyd3JpdGVQcm9wZXJ0eS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9vdmVyd3JpdGVNZXRob2QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvYWRkQ2hhaW5hYmxlTWV0aG9kLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9jb21wYXJlQnlJbnNwZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2dldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoZWNrLWVycm9yQDEuMC4yL25vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9pc05hTi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9nZXRPcGVyYXRvci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9hc3NlcnRpb24uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvY29yZS9hc3NlcnRpb25zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL2ludGVyZmFjZS9leHBlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANC4zLjYvbm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvaW50ZXJmYWNlL3Nob3VsZC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY2hhaUA0LjMuNi9ub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9pbnRlcmZhY2UvYXNzZXJ0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2luZGV4LmpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9iYXNlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaXMubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2dsb2JhbC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0YW50cy5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3R5cGVvZi5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvZXh0ZW5kLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaWQubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL2Nsb25lLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvc3RhY2subWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL3BhdGhmaW5kZXIubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL3RyYW5zZm9ybWVyLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9waXBlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2NvbnN0YW50cy5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3Rva2VubGlzdC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3F1ZXVlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdW5pcXVlcXVldWUubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9vYnNlcnZlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL29ic2VydmVybGlzdC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3Byb3h5b2JzZXJ2ZXIubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9tZWRpYXR5cGUubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kaWZmLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC90cmltc3BhY2VzLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3V0aWwubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vZXZlbnRzLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3RoZW1lLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3RlbXBsYXRlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3VwZGF0ZXIubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vYXR0cmlidXRlcy5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9jdXN0b21lbGVtZW50Lm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2N1c3RvbWNvbnRyb2wubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVhZHkubWpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wdnRzdXRpbHNAMS4zLjIvbm9kZV9tb2R1bGVzL3B2dHN1dGlscy9idWlsZC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHZ1dGlsc0AxLjEuMy9ub2RlX21vZHVsZXMvcHZ1dGlscy9idWlsZC91dGlscy5lcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYXNuMWpzQDMuMC41L25vZGVfbW9kdWxlcy9hc24xanMvYnVpbGQvaW5kZXguZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9lbnVtcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2NvbnZlcnRlcnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS90eXBlcy9iaXRfc3RyaW5nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjAvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvdHlwZXMvb2N0ZXRfc3RyaW5nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjAvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvdHlwZXMvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9oZWxwZXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9zY2hlbWEuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9zdG9yYWdlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjAvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvZGVjb3JhdG9ycy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2Vycm9ycy9zY2hlbWFfdmFsaWRhdGlvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2Vycm9ycy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L3BhcnNlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BwZWN1bGlhcithc24xLXNjaGVtYUAyLjMuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL2FzbjEtc2NoZW1hL2J1aWxkL2VzMjAxNS9vYmplY3RzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIrYXNuMS1zY2hlbWFAMi4zLjAvbm9kZV9tb2R1bGVzL0BwZWN1bGlhci9hc24xLXNjaGVtYS9idWlsZC9lczIwMTUvY29udmVydC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK2FzbjEtc2NoZW1hQDIuMy4wL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvYXNuMS1zY2hlbWEvYnVpbGQvZXMyMDE1L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS90c2xpYkAyLjQuMC9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3RzbGliQDIuNC4wL25vZGVfbW9kdWxlcy90c2xpYi9tb2R1bGVzL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AcGVjdWxpYXIranNvbi1zY2hlbWFAMS4xLjEyL25vZGVfbW9kdWxlcy9AcGVjdWxpYXIvanNvbi1zY2hlbWEvYnVpbGQvaW5kZXguZXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3dlYmNyeXB0by1jb3JlQDEuNy41L25vZGVfbW9kdWxlcy93ZWJjcnlwdG8tY29yZS9idWlsZC93ZWJjcnlwdG8tY29yZS5lcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHBlY3VsaWFyK3dlYmNyeXB0b0AxLjQuMC9ub2RlX21vZHVsZXMvQHBlY3VsaWFyL3dlYmNyeXB0by9idWlsZC93ZWJjcnlwdG8uZXMuanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL21hdGgvcmFuZG9tLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcmFuZG9taWQubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy91dWlkLm1qcyIsICJwcmVwYXJlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jaGFpQDQuMy42L25vZGVfbW9kdWxlcy9jaGFpL2luZGV4Lm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdmVyc2lvbi5tanMiLCAiLi4vY2FzZXMvbW9uc3Rlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvaGFuZGxlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvbG9nZW50cnkubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9sb2dnaW5nL2xvZ2dlci5tanMiLCAiLi4vY2FzZXMvbG9nZ2luZy9sb2dnZXIubWpzIiwgIi4uL2Nhc2VzL2xvZ2dpbmcvbG9nZW50cnkubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9sb2dnaW5nL2hhbmRsZXIvY29uc29sZS5tanMiLCAiLi4vY2FzZXMvbG9nZ2luZy9oYW5kbGVyL2NvbnNvbGUubWpzIiwgIi4uL2Nhc2VzL2xvZ2dpbmcvaGFuZGxlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3RleHQvZm9ybWF0dGVyLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qcyIsICIuLi9jYXNlcy90ZXh0L2Zvcm1hdHRlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9yZXNvdXJjZS9saW5rL3N0eWxlc2hlZXQubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVzb3VyY2UvbGluay5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9yZXNvdXJjZS5tanMiLCAiLi4vY2FzZXMvZG9tL3Jlc291cmNlL2xpbmsvc3R5bGVzaGVldC5tanMiLCAiLi4vdXRpbC9jaGFpLWRvbS5tanMiLCAiLi4vdXRpbC9jbGVhbnVwZG9tLm1qcyIsICIuLi91dGlsL2pzZG9tLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3Jlc291cmNlL2RhdGEubWpzIiwgIi4uL2Nhc2VzL2RvbS9yZXNvdXJjZS9kYXRhLm1qcyIsICIuLi9jYXNlcy9kb20vcmVzb3VyY2UvbGluay5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9yZXNvdXJjZS9zY3JpcHQubWpzIiwgIi4uL2Nhc2VzL2RvbS9yZXNvdXJjZS9zY3JpcHQubWpzIiwgIi4uL2Nhc2VzL2RvbS91cGRhdGVyLm1qcyIsICIuLi9jYXNlcy9kb20vY3VzdG9tY29udHJvbC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vbG9jYWxlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2xvY2FsZS5tanMiLCAiLi4vY2FzZXMvZG9tL2xvY2FsZS5tanMiLCAiLi4vY2FzZXMvZG9tL3RoZW1lLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3Jlc291cmNlbWFuYWdlci5tanMiLCAiLi4vY2FzZXMvZG9tL3Jlc291cmNlbWFuYWdlci5tanMiLCAiLi4vY2FzZXMvZG9tL3V0aWwubWpzIiwgIi4uL2Nhc2VzL2RvbS9jdXN0b21lbGVtZW50Lm1qcyIsICIuLi9jYXNlcy9kb20vYXR0cmlidXRlcy5tanMiLCAiLi4vY2FzZXMvZG9tL2V2ZW50cy5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS93b3JrZXIvZmFjdG9yeS5tanMiLCAiLi4vY2FzZXMvZG9tL3dvcmtlci9mYWN0b3J5Lm1qcyIsICIuLi9jYXNlcy9kb20vdGVtcGxhdGUubWpzIiwgIi4uL2Nhc2VzL2RvbS9yZWFkeS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9mb2N1c21hbmFnZXIubWpzIiwgIi4uL2Nhc2VzL2RvbS9mb2N1c21hbmFnZXIubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vYXNzZW1ibGVyLm1qcyIsICIuLi9jYXNlcy9kb20vYXNzZW1ibGVyLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzIiwgIi4uL2Nhc2VzL2kxOG4vdHJhbnNsYXRpb25zLm1qcyIsICIuLi9jYXNlcy9pMThuL2xvY2FsZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vZm9ybWF0dGVyLm1qcyIsICIuLi9jYXNlcy9pMThuL2Zvcm1hdHRlci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vcHJvdmlkZXJzL2ZldGNoLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi9wcm92aWRlci5tanMiLCAiLi4vY2FzZXMvaTE4bi9wcm92aWRlcnMvZmV0Y2gubWpzIiwgIi4uL2Nhc2VzL2kxOG4vcHJvdmlkZXIubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL21lZGlhdHlwZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvdHlwZW9mLm1qcyIsICIuLi9jYXNlcy90eXBlcy9vYnNlcnZlcmxpc3QubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3JhbmRvbWlkLm1qcyIsICIuLi9jYXNlcy90eXBlcy91dWlkLm1qcyIsICIuLi9jYXNlcy90eXBlcy9vYnNlcnZlci5tanMiLCAiLi4vY2FzZXMvdHlwZXMvdG9rZW5saXN0Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9xdWV1ZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvc3RhY2subWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9iaW5hcnkubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2JpbmFyeS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcmVnZXgubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3JlZ2V4Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9wcm94eW9ic2VydmVyLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvbm9kZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qcyIsICIuLi9jYXNlcy90eXBlcy9ub2RlbGlzdC5tanMiLCAiLi4vY2FzZXMvdHlwZXMvdmVyc2lvbi5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVyZWN1cnNpdmVpdGVyYXRvci5tanMiLCAiLi4vY2FzZXMvdHlwZXMvbm9kZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvbm9kZXJlY3Vyc2l2ZWl0ZXJhdG9yLm1qcyIsICIuLi9jYXNlcy90eXBlcy9nbG9iYWwubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2RhdGF1cmwubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL3ZhbGlkYXRlLm1qcyIsICIuLi9jYXNlcy90eXBlcy91bmlxdWVxdWV1ZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvYmFzZS5tanMiLCAiLi4vY2FzZXMvdHlwZXMvaXMubWpzIiwgIi4uL2Nhc2VzL3R5cGVzL2lkLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvaXNvYmplY3QubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9jb25zdHJhaW50cy9hYnN0cmFjdC5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9pc29iamVjdC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzIiwgIi4uL2Nhc2VzL2NvbnN0cmFpbnQvaW52YWxpZC5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL3ZhbGlkLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvYWJzdHJhY3RvcGVyYXRvci5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2FuZG9wZXJhdG9yLm1qcyIsICIuLi9jYXNlcy9jb25zdHJhaW50L2FuZG9wZXJhdG9yLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvb3JvcGVyYXRvci5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9vcm9wZXJhdG9yLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvaXNhcnJheS5tanMiLCAiLi4vY2FzZXMvY29uc3RyYWludC9pc2FycmF5Lm1qcyIsICIuLi9jYXNlcy9jb25zdHJhaW50L3ZhbGlkLm1qcyIsICIuLi9jYXNlcy91dGlsL3RyaW1zcGFjZXMubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL2RlYWRtYW5zc3dpdGNoLm1qcyIsICIuLi9jYXNlcy91dGlsL2RlYWRtYW5zc3dpdGNoLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9mcmVlemUubWpzIiwgIi4uL2Nhc2VzL3V0aWwvZnJlZXplLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9jb21wYXJhdG9yLm1qcyIsICIuLi9jYXNlcy91dGlsL2NvbXBhcmF0b3IubWpzIiwgIi4uL2Nhc2VzL3V0aWwvY2xvbmUubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL3Byb2Nlc3NpbmcubWpzIiwgIi4uL2Nhc2VzL3V0aWwvcHJvY2Vzc2luZy5tanMiLCAiLi4vY2FzZXMvZGF0YS9leHRlbmQubWpzIiwgIi4uL2Nhc2VzL2RhdGEvcGlwZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvYnVpbGRtYXAubWpzIiwgIi4uL2Nhc2VzL2RhdGEvYnVpbGRtYXAubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvYnVpbGR0cmVlLm1qcyIsICIuLi9jYXNlcy9kYXRhL2J1aWxkdHJlZS5tanMiLCAiLi4vY2FzZXMvZGF0YS90cmFuc2Zvcm1lci5tanMiLCAiLi4vY2FzZXMvZGF0YS9wYXRoZmluZGVyLm1qcyIsICIuLi9jYXNlcy9kYXRhL2RpZmYubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UvcmVzdGFwaS5tanMiLCAiLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9yZXN0YXBpL3dyaXRlZXJyb3IubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS9yZXN0YXBpLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2Uvc2Vzc2lvbnN0b3JhZ2UubWpzIiwgIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZS5tanMiLCAiLi4vdXRpbC9sb2NhbHN0b3JhZ2UubWpzIiwgIi4uL2Nhc2VzL2RhdGEvZGF0YXNvdXJjZS9zdG9yYWdlL3Nlc3Npb25zdG9yYWdlLm1qcyIsICIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2UvbG9jYWxzdG9yYWdlLm1qcyIsICIuLi9jYXNlcy9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZS9sb2NhbHN0b3JhZ2UubWpzIiwgIi4uL2Nhc2VzL21hdGgvcmFuZG9tLm1qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohXG4gKiBhc3NlcnRpb24tZXJyb3JcbiAqIENvcHlyaWdodChjKSAyMDEzIEpha2UgTHVlciA8amFrZUBxdWFsaWFuY3kuY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHdpbGwgY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIG9uZSBvYmplY3QgdG8gYW5vdGhlciBleGNsdWRpbmcgYW55IG9yaWdpbmFsbHlcbiAqIGxpc3RlZC4gUmV0dXJuZWQgZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSBuZXcgYHt9YC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXhjbHVkZWQgcHJvcGVydGllcyAuLi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5cbmZ1bmN0aW9uIGV4Y2x1ZGUgKCkge1xuICB2YXIgZXhjbHVkZXMgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgZnVuY3Rpb24gZXhjbHVkZVByb3BzIChyZXMsIG9iaikge1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoIX5leGNsdWRlcy5pbmRleE9mKGtleSkpIHJlc1trZXldID0gb2JqW2tleV07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gZXh0ZW5kRXhjbHVkZSAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICAgICwgaSA9IDBcbiAgICAgICwgcmVzID0ge307XG5cbiAgICBmb3IgKDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4Y2x1ZGVQcm9wcyhyZXMsIGFyZ3NbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG59O1xuXG4vKiFcbiAqIFByaW1hcnkgRXhwb3J0c1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gQXNzZXJ0aW9uRXJyb3I7XG5cbi8qKlxuICogIyMjIEFzc2VydGlvbkVycm9yXG4gKlxuICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBKYXZhU2NyaXB0IGBFcnJvcmAgY29uc3RydWN0b3IgZm9yXG4gKiBhc3NlcnRpb24gYW5kIHZhbGlkYXRpb24gc2NlbmFyaW9zLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyB0byBpbmNsdWRlIChvcHRpb25hbClcbiAqIEBwYXJhbSB7Y2FsbGVlfSBzdGFydCBzdGFjayBmdW5jdGlvbiAob3B0aW9uYWwpXG4gKi9cblxuZnVuY3Rpb24gQXNzZXJ0aW9uRXJyb3IgKG1lc3NhZ2UsIF9wcm9wcywgc3NmKSB7XG4gIHZhciBleHRlbmQgPSBleGNsdWRlKCduYW1lJywgJ21lc3NhZ2UnLCAnc3RhY2snLCAnY29uc3RydWN0b3InLCAndG9KU09OJylcbiAgICAsIHByb3BzID0gZXh0ZW5kKF9wcm9wcyB8fCB7fSk7XG5cbiAgLy8gZGVmYXVsdCB2YWx1ZXNcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVW5zcGVjaWZpZWQgQXNzZXJ0aW9uRXJyb3InO1xuICB0aGlzLnNob3dEaWZmID0gZmFsc2U7XG5cbiAgLy8gY29weSBmcm9tIHByb3BlcnRpZXNcbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgdGhpc1trZXldID0gcHJvcHNba2V5XTtcbiAgfVxuXG4gIC8vIGNhcHR1cmUgc3RhY2sgdHJhY2VcbiAgc3NmID0gc3NmIHx8IEFzc2VydGlvbkVycm9yO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzc2YpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBlLnN0YWNrO1xuICAgIH1cbiAgfVxufVxuXG4vKiFcbiAqIEluaGVyaXQgZnJvbSBFcnJvci5wcm90b3R5cGVcbiAqL1xuXG5Bc3NlcnRpb25FcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5cbi8qIVxuICogU3RhdGljYWxseSBzZXQgbmFtZVxuICovXG5cbkFzc2VydGlvbkVycm9yLnByb3RvdHlwZS5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcblxuLyohXG4gKiBFbnN1cmUgY29ycmVjdCBjb25zdHJ1Y3RvclxuICovXG5cbkFzc2VydGlvbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFzc2VydGlvbkVycm9yO1xuXG4vKipcbiAqIEFsbG93IGVycm9ycyB0byBiZSBjb252ZXJ0ZWQgdG8gSlNPTiBmb3Igc3RhdGljIHRyYW5zZmVyLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5jbHVkZSBzdGFjayAoZGVmYXVsdDogYHRydWVgKVxuICogQHJldHVybiB7T2JqZWN0fSBvYmplY3QgdGhhdCBjYW4gYmUgYEpTT04uc3RyaW5naWZ5YFxuICovXG5cbkFzc2VydGlvbkVycm9yLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgdmFyIGV4dGVuZCA9IGV4Y2x1ZGUoJ2NvbnN0cnVjdG9yJywgJ3RvSlNPTicsICdzdGFjaycpXG4gICAgLCBwcm9wcyA9IGV4dGVuZCh7IG5hbWU6IHRoaXMubmFtZSB9LCB0aGlzKTtcblxuICAvLyBpbmNsdWRlIHN0YWNrIGlmIGV4aXN0cyBhbmQgbm90IHR1cm5lZCBvZmZcbiAgaWYgKGZhbHNlICE9PSBzdGFjayAmJiB0aGlzLnN0YWNrKSB7XG4gICAgcHJvcHMuc3RhY2sgPSB0aGlzLnN0YWNrO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIENoYWkgLSBwYXRodmFsIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpY2FscGFyYWRveC9maWx0clxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmhhc1Byb3BlcnR5KG9iamVjdCwgbmFtZSlcbiAqXG4gKiBUaGlzIGFsbG93cyBjaGVja2luZyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgb3duXG4gKiBvciBpbmhlcml0ZWQgZnJvbSBwcm90b3R5cGUgY2hhaW4gbmFtZWQgcHJvcGVydHkuXG4gKlxuICogQmFzaWNhbGx5IGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGBpbmBcbiAqIG9wZXJhdG9yIGJ1dCB3b3JrcyBwcm9wZXJseSB3aXRoIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICogYW5kIG90aGVyIHByaW1pdGl2ZXMuXG4gKlxuICogICAgIHZhciBvYmogPSB7XG4gKiAgICAgICAgIGFycjogWydhJywgJ2InLCAnYyddXG4gKiAgICAgICAsIHN0cjogJ0hlbGxvJ1xuICogICAgIH1cbiAqXG4gKiBUaGUgZm9sbG93aW5nIHdvdWxkIGJlIHRoZSByZXN1bHRzLlxuICpcbiAqICAgICBoYXNQcm9wZXJ0eShvYmosICdzdHInKTsgIC8vIHRydWVcbiAqICAgICBoYXNQcm9wZXJ0eShvYmosICdjb25zdHJ1Y3RvcicpOyAgLy8gdHJ1ZVxuICogICAgIGhhc1Byb3BlcnR5KG9iaiwgJ2JhcicpOyAgLy8gZmFsc2VcbiAqXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgJ2xlbmd0aCcpOyAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgMSk7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgNSk7ICAvLyBmYWxzZVxuICpcbiAqICAgICBoYXNQcm9wZXJ0eShvYmouYXJyLCAnbGVuZ3RoJyk7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLmFyciwgMik7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLmFyciwgMyk7ICAvLyBmYWxzZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfFN5bWJvbH0gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgaXQgZXhpc3RzXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBoYXNQcm9wZXJ0eVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmosIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRoZSBgaW5gIG9wZXJhdG9yIGRvZXMgbm90IHdvcmsgd2l0aCBwcmltaXRpdmVzLlxuICByZXR1cm4gbmFtZSBpbiBPYmplY3Qob2JqKTtcbn1cblxuLyogIVxuICogIyMgcGFyc2VQYXRoKHBhdGgpXG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gcGFyc2Ugc3RyaW5nIG9iamVjdFxuICogcGF0aHMuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIGBpbnRlcm5hbEdldFBhdGhWYWx1ZWAuXG4gKlxuICogICAgICB2YXIgcGFyc2VkID0gcGFyc2VQYXRoKCdteW9iamVjdC5wcm9wZXJ0eS5zdWJwcm9wJyk7XG4gKlxuICogIyMjIFBhdGhzOlxuICpcbiAqICogQ2FuIGJlIGluZmluaXRlbHkgZGVlcCBhbmQgbmVzdGVkLlxuICogKiBBcnJheXMgYXJlIGFsc28gdmFsaWQgdXNpbmcgdGhlIGZvcm1hbCBgbXlvYmplY3QuZG9jdW1lbnRbM10ucHJvcGVydHlgLlxuICogKiBMaXRlcmFsIGRvdHMgYW5kIGJyYWNrZXRzIChub3QgZGVsaW1pdGVyKSBtdXN0IGJlIGJhY2tzbGFzaC1lc2NhcGVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBwYXJzZWRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIHZhciBzdHIgPSBwYXRoLnJlcGxhY2UoLyhbXlxcXFxdKVxcWy9nLCAnJDEuWycpO1xuICB2YXIgcGFydHMgPSBzdHIubWF0Y2goLyhcXFxcXFwufFteLl0rPykrL2cpO1xuICByZXR1cm4gcGFydHMubWFwKGZ1bmN0aW9uIG1hcE1hdGNoZXModmFsdWUpIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gJ2NvbnN0cnVjdG9yJyB8fFxuICAgICAgdmFsdWUgPT09ICdfX3Byb3RvX18nIHx8XG4gICAgICB2YWx1ZSA9PT0gJ3Byb3RvdHlwZSdcbiAgICApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgdmFyIHJlZ2V4cCA9IC9eXFxbKFxcZCspXFxdJC87XG4gICAgdmFyIG1BcnIgPSByZWdleHAuZXhlYyh2YWx1ZSk7XG4gICAgdmFyIHBhcnNlZCA9IG51bGw7XG4gICAgaWYgKG1BcnIpIHtcbiAgICAgIHBhcnNlZCA9IHsgaTogcGFyc2VGbG9hdChtQXJyWzFdKSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWQgPSB7IHA6IHZhbHVlLnJlcGxhY2UoL1xcXFwoWy5bXFxdXSkvZywgJyQxJykgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9KTtcbn1cblxuLyogIVxuICogIyMgaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWRbLCBwYXRoRGVwdGhdKVxuICpcbiAqIEhlbHBlciBjb21wYW5pb24gZnVuY3Rpb24gZm9yIGAucGFyc2VQYXRoYCB0aGF0IHJldHVybnNcbiAqIHRoZSB2YWx1ZSBsb2NhdGVkIGF0IHRoZSBwYXJzZWQgYWRkcmVzcy5cbiAqXG4gKiAgICAgIHZhciB2YWx1ZSA9IGdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0byBzZWFyY2ggYWdhaW5zdFxuICogQHBhcmFtIHtPYmplY3R9IHBhcnNlZCBkZWZpbml0aW9uIGZyb20gYHBhcnNlUGF0aGAuXG4gKiBAcGFyYW0ge051bWJlcn0gZGVwdGggKG5lc3RpbmcgbGV2ZWwpIG9mIHRoZSBwcm9wZXJ0eSB3ZSB3YW50IHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7T2JqZWN0fFVuZGVmaW5lZH0gdmFsdWVcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkLCBwYXRoRGVwdGgpIHtcbiAgdmFyIHRlbXBvcmFyeVZhbHVlID0gb2JqO1xuICB2YXIgcmVzID0gbnVsbDtcbiAgcGF0aERlcHRoID0gdHlwZW9mIHBhdGhEZXB0aCA9PT0gJ3VuZGVmaW5lZCcgPyBwYXJzZWQubGVuZ3RoIDogcGF0aERlcHRoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICB2YXIgcGFydCA9IHBhcnNlZFtpXTtcbiAgICBpZiAodGVtcG9yYXJ5VmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydC5wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRlbXBvcmFyeVZhbHVlW3BhcnQuaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRlbXBvcmFyeVZhbHVlW3BhcnQucF07XG4gICAgICB9XG5cbiAgICAgIGlmIChpID09PSBwYXRoRGVwdGggLSAxKSB7XG4gICAgICAgIHJlcyA9IHRlbXBvcmFyeVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbi8qICFcbiAqICMjIGludGVybmFsU2V0UGF0aFZhbHVlKG9iaiwgdmFsdWUsIHBhcnNlZClcbiAqXG4gKiBDb21wYW5pb24gZnVuY3Rpb24gZm9yIGBwYXJzZVBhdGhgIHRoYXQgc2V0c1xuICogdGhlIHZhbHVlIGxvY2F0ZWQgYXQgYSBwYXJzZWQgYWRkcmVzcy5cbiAqXG4gKiAgaW50ZXJuYWxTZXRQYXRoVmFsdWUob2JqLCAndmFsdWUnLCBwYXJzZWQpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdG8gc2VhcmNoIGFuZCBkZWZpbmUgb25cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgdG8gdXNlIHVwb24gc2V0XG4gKiBAcGFyYW0ge09iamVjdH0gcGFyc2VkIGRlZmluaXRpb24gZnJvbSBgcGFyc2VQYXRoYFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaW50ZXJuYWxTZXRQYXRoVmFsdWUob2JqLCB2YWwsIHBhcnNlZCkge1xuICB2YXIgdGVtcE9iaiA9IG9iajtcbiAgdmFyIHBhdGhEZXB0aCA9IHBhcnNlZC5sZW5ndGg7XG4gIHZhciBwYXJ0ID0gbnVsbDtcbiAgLy8gSGVyZSB3ZSBpdGVyYXRlIHRocm91Z2ggZXZlcnkgcGFydCBvZiB0aGUgcGF0aFxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhEZXB0aDsgaSsrKSB7XG4gICAgdmFyIHByb3BOYW1lID0gbnVsbDtcbiAgICB2YXIgcHJvcFZhbCA9IG51bGw7XG4gICAgcGFydCA9IHBhcnNlZFtpXTtcblxuICAgIC8vIElmIGl0J3MgdGhlIGxhc3QgcGFydCBvZiB0aGUgcGF0aCwgd2Ugc2V0IHRoZSAncHJvcE5hbWUnIHZhbHVlIHdpdGggdGhlIHByb3BlcnR5IG5hbWVcbiAgICBpZiAoaSA9PT0gcGF0aERlcHRoIC0gMSkge1xuICAgICAgcHJvcE5hbWUgPSB0eXBlb2YgcGFydC5wID09PSAndW5kZWZpbmVkJyA/IHBhcnQuaSA6IHBhcnQucDtcbiAgICAgIC8vIE5vdyB3ZSBzZXQgdGhlIHByb3BlcnR5IHdpdGggdGhlIG5hbWUgaGVsZCBieSAncHJvcE5hbWUnIG9uIG9iamVjdCB3aXRoIHRoZSBkZXNpcmVkIHZhbFxuICAgICAgdGVtcE9ialtwcm9wTmFtZV0gPSB2YWw7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFydC5wICE9PSAndW5kZWZpbmVkJyAmJiB0ZW1wT2JqW3BhcnQucF0pIHtcbiAgICAgIHRlbXBPYmogPSB0ZW1wT2JqW3BhcnQucF07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFydC5pICE9PSAndW5kZWZpbmVkJyAmJiB0ZW1wT2JqW3BhcnQuaV0pIHtcbiAgICAgIHRlbXBPYmogPSB0ZW1wT2JqW3BhcnQuaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBvYmogZG9lc24ndCBoYXZlIHRoZSBwcm9wZXJ0eSB3ZSBjcmVhdGUgb25lIHdpdGggdGhhdCBuYW1lIHRvIGRlZmluZSBpdFxuICAgICAgdmFyIG5leHQgPSBwYXJzZWRbaSArIDFdO1xuICAgICAgLy8gSGVyZSB3ZSBzZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIHdpbGwgYmUgZGVmaW5lZFxuICAgICAgcHJvcE5hbWUgPSB0eXBlb2YgcGFydC5wID09PSAndW5kZWZpbmVkJyA/IHBhcnQuaSA6IHBhcnQucDtcbiAgICAgIC8vIEhlcmUgd2UgZGVjaWRlIGlmIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBhbiBhcnJheSBvciBhIG5ldyBvYmplY3RcbiAgICAgIHByb3BWYWwgPSB0eXBlb2YgbmV4dC5wID09PSAndW5kZWZpbmVkJyA/IFtdIDoge307XG4gICAgICB0ZW1wT2JqW3Byb3BOYW1lXSA9IHByb3BWYWw7XG4gICAgICB0ZW1wT2JqID0gdGVtcE9ialtwcm9wTmFtZV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogIyMjIC5nZXRQYXRoSW5mbyhvYmplY3QsIHBhdGgpXG4gKlxuICogVGhpcyBhbGxvd3MgdGhlIHJldHJpZXZhbCBvZiBwcm9wZXJ0eSBpbmZvIGluIGFuXG4gKiBvYmplY3QgZ2l2ZW4gYSBzdHJpbmcgcGF0aC5cbiAqXG4gKiBUaGUgcGF0aCBpbmZvIGNvbnNpc3RzIG9mIGFuIG9iamVjdCB3aXRoIHRoZVxuICogZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogKiBwYXJlbnQgLSBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGUgcHJvcGVydHkgcmVmZXJlbmNlZCBieSBgcGF0aGBcbiAqICogbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaW5hbCBwcm9wZXJ0eSwgYSBudW1iZXIgaWYgaXQgd2FzIGFuIGFycmF5IGluZGV4ZXJcbiAqICogdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgdW5kZWZpbmVkYFxuICogKiBleGlzdHMgLSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdHMgb3Igbm90XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEByZXR1cm5zIHtPYmplY3R9IGluZm9cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldFBhdGhJbmZvXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGdldFBhdGhJbmZvKG9iaiwgcGF0aCkge1xuICB2YXIgcGFyc2VkID0gcGFyc2VQYXRoKHBhdGgpO1xuICB2YXIgbGFzdCA9IHBhcnNlZFtwYXJzZWQubGVuZ3RoIC0gMV07XG4gIHZhciBpbmZvID0ge1xuICAgIHBhcmVudDpcbiAgICAgIHBhcnNlZC5sZW5ndGggPiAxID9cbiAgICAgICAgaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQsIHBhcnNlZC5sZW5ndGggLSAxKSA6XG4gICAgICAgIG9iaixcbiAgICBuYW1lOiBsYXN0LnAgfHwgbGFzdC5pLFxuICAgIHZhbHVlOiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCksXG4gIH07XG4gIGluZm8uZXhpc3RzID0gaGFzUHJvcGVydHkoaW5mby5wYXJlbnQsIGluZm8ubmFtZSk7XG5cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogIyMjIC5nZXRQYXRoVmFsdWUob2JqZWN0LCBwYXRoKVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgdmFsdWVzIGluIGFuXG4gKiBvYmplY3QgZ2l2ZW4gYSBzdHJpbmcgcGF0aC5cbiAqXG4gKiAgICAgdmFyIG9iaiA9IHtcbiAqICAgICAgICAgcHJvcDE6IHtcbiAqICAgICAgICAgICAgIGFycjogWydhJywgJ2InLCAnYyddXG4gKiAgICAgICAgICAgLCBzdHI6ICdIZWxsbydcbiAqICAgICAgICAgfVxuICogICAgICAgLCBwcm9wMjoge1xuICogICAgICAgICAgICAgYXJyOiBbIHsgbmVzdGVkOiAnVW5pdmVyc2UnIH0gXVxuICogICAgICAgICAgICwgc3RyOiAnSGVsbG8gYWdhaW4hJ1xuICogICAgICAgICB9XG4gKiAgICAgfVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgd291bGQgYmUgdGhlIHJlc3VsdHMuXG4gKlxuICogICAgIGdldFBhdGhWYWx1ZShvYmosICdwcm9wMS5zdHInKTsgLy8gSGVsbG9cbiAqICAgICBnZXRQYXRoVmFsdWUob2JqLCAncHJvcDEuYXR0WzJdJyk7IC8vIGJcbiAqICAgICBnZXRQYXRoVmFsdWUob2JqLCAncHJvcDIuYXJyWzBdLm5lc3RlZCcpOyAvLyBVbml2ZXJzZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB2YWx1ZSBvciBgdW5kZWZpbmVkYFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0UGF0aFZhbHVlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGdldFBhdGhWYWx1ZShvYmosIHBhdGgpIHtcbiAgdmFyIGluZm8gPSBnZXRQYXRoSW5mbyhvYmosIHBhdGgpO1xuICByZXR1cm4gaW5mby52YWx1ZTtcbn1cblxuLyoqXG4gKiAjIyMgLnNldFBhdGhWYWx1ZShvYmplY3QsIHBhdGgsIHZhbHVlKVxuICpcbiAqIERlZmluZSB0aGUgdmFsdWUgaW4gYW4gb2JqZWN0IGF0IGEgZ2l2ZW4gc3RyaW5nIHBhdGguXG4gKlxuICogYGBganNcbiAqIHZhciBvYmogPSB7XG4gKiAgICAgcHJvcDE6IHtcbiAqICAgICAgICAgYXJyOiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgICwgc3RyOiAnSGVsbG8nXG4gKiAgICAgfVxuICogICAsIHByb3AyOiB7XG4gKiAgICAgICAgIGFycjogWyB7IG5lc3RlZDogJ1VuaXZlcnNlJyB9IF1cbiAqICAgICAgICwgc3RyOiAnSGVsbG8gYWdhaW4hJ1xuICogICAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIHdvdWxkIGJlIGFjY2VwdGFibGUuXG4gKlxuICogYGBganNcbiAqIHZhciBwcm9wZXJ0aWVzID0gcmVxdWlyZSgndGVhLXByb3BlcnRpZXMnKTtcbiAqIHByb3BlcnRpZXMuc2V0KG9iaiwgJ3Byb3AxLnN0cicsICdIZWxsbyBVbml2ZXJzZSEnKTtcbiAqIHByb3BlcnRpZXMuc2V0KG9iaiwgJ3Byb3AxLmFyclsyXScsICdCJyk7XG4gKiBwcm9wZXJ0aWVzLnNldChvYmosICdwcm9wMi5hcnJbMF0ubmVzdGVkLnZhbHVlJywgeyBoZWxsbzogJ3VuaXZlcnNlJyB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2V0UGF0aFZhbHVlKG9iaiwgcGF0aCwgdmFsKSB7XG4gIHZhciBwYXJzZWQgPSBwYXJzZVBhdGgocGF0aCk7XG4gIGludGVybmFsU2V0UGF0aFZhbHVlKG9iaiwgdmFsLCBwYXJzZWQpO1xuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaGFzUHJvcGVydHk6IGhhc1Byb3BlcnR5LFxuICBnZXRQYXRoSW5mbzogZ2V0UGF0aEluZm8sXG4gIGdldFBhdGhWYWx1ZTogZ2V0UGF0aFZhbHVlLFxuICBzZXRQYXRoVmFsdWU6IHNldFBhdGhWYWx1ZSxcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gZmxhZyB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmZsYWcob2JqZWN0LCBrZXksIFt2YWx1ZV0pXG4gKlxuICogR2V0IG9yIHNldCBhIGZsYWcgdmFsdWUgb24gYW4gb2JqZWN0LiBJZiBhXG4gKiB2YWx1ZSBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIHNldCwgZWxzZSBpdCB3aWxsXG4gKiByZXR1cm4gdGhlIGN1cnJlbnRseSBzZXQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgaWZcbiAqIHRoZSB2YWx1ZSBpcyBub3Qgc2V0LlxuICpcbiAqICAgICB1dGlscy5mbGFnKHRoaXMsICdmb28nLCAnYmFyJyk7IC8vIHNldHRlclxuICogICAgIHV0aWxzLmZsYWcodGhpcywgJ2ZvbycpOyAvLyBnZXR0ZXIsIHJldHVybnMgYGJhcmBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IGNvbnN0cnVjdGVkIEFzc2VydGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgKG9wdGlvbmFsKVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZmxhZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmbGFnKG9iaiwga2V5LCB2YWx1ZSkge1xuICB2YXIgZmxhZ3MgPSBvYmouX19mbGFncyB8fCAob2JqLl9fZmxhZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBmbGFnc1trZXldID0gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZsYWdzW2tleV07XG4gIH1cbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gdGVzdCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcblxuLyoqXG4gKiAjIyMgLnRlc3Qob2JqZWN0LCBleHByZXNzaW9uKVxuICpcbiAqIFRlc3QgYW5kIG9iamVjdCBmb3IgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IChjb25zdHJ1Y3RlZCBBc3NlcnRpb24pXG4gKiBAcGFyYW0ge0FyZ3VtZW50c30gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmFzc2VydCBhcmd1bWVudHNcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIHRlc3RcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRlc3Qob2JqLCBhcmdzKSB7XG4gIHZhciBuZWdhdGUgPSBmbGFnKG9iaiwgJ25lZ2F0ZScpXG4gICAgLCBleHByID0gYXJnc1swXTtcbiAgcmV0dXJuIG5lZ2F0ZSA/ICFleHByIDogZXhwcjtcbn07XG4iLCAiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuXHQoZ2xvYmFsLnR5cGVEZXRlY3QgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIHR5cGUtZGV0ZWN0XG4gKiBDb3B5cmlnaHQoYykgMjAxMyBqYWtlIGx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG52YXIgcHJvbWlzZUV4aXN0cyA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xudmFyIGdsb2JhbE9iamVjdCA9IHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyA/IHNlbGYgOiBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaWQtYmxhY2tsaXN0XG5cbnZhciBzeW1ib2xFeGlzdHMgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbnZhciBtYXBFeGlzdHMgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJztcbnZhciBzZXRFeGlzdHMgPSB0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJztcbnZhciB3ZWFrTWFwRXhpc3RzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnO1xudmFyIHdlYWtTZXRFeGlzdHMgPSB0eXBlb2YgV2Vha1NldCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgZGF0YVZpZXdFeGlzdHMgPSB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbEl0ZXJhdG9yRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgIT09ICd1bmRlZmluZWQnO1xudmFyIHNldEVudHJpZXNFeGlzdHMgPSBzZXRFeGlzdHMgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbnZhciBtYXBFbnRyaWVzRXhpc3RzID0gbWFwRXhpc3RzICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XG52YXIgc2V0SXRlcmF0b3JQcm90b3R5cGUgPSBzZXRFbnRyaWVzRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgU2V0KCkuZW50cmllcygpKTtcbnZhciBtYXBJdGVyYXRvclByb3RvdHlwZSA9IG1hcEVudHJpZXNFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBNYXAoKS5lbnRyaWVzKCkpO1xudmFyIGFycmF5SXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG52YXIgYXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgc3RyaW5nSXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgU3RyaW5nLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xudmFyIHN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlID0gc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgdG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGggPSA4O1xudmFyIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCA9IC0xO1xuLyoqXG4gKiAjIyMgdHlwZU9mIChvYmopXG4gKlxuICogVXNlcyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIG9iamVjdCxcbiAqIG5vcm1hbGlzaW5nIGJlaGF2aW91ciBhY3Jvc3MgZW5naW5lIHZlcnNpb25zICYgd2VsbCBvcHRpbWlzZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IG9iamVjdCB0eXBlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiB0eXBlRGV0ZWN0KG9iaikge1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAgKiBQcmU6XG4gICAqICAgc3RyaW5nIGxpdGVyYWwgICAgIHggMywwMzksMDM1IG9wcy9zZWMgXHUwMEIxMS42MiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAxLDQyNCwxMzggb3BzL3NlYyBcdTAwQjE0LjU0JSAoNzUgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDEsNjUzLDE1MyBvcHMvc2VjIFx1MDBCMTEuOTElICg4MiBydW5zIHNhbXBsZWQpXG4gICAqICAgdW5kZWZpbmVkICAgICAgICAgIHggOSw5NzgsNjYwIG9wcy9zZWMgXHUwMEIxMS45MiUgKDc1IHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAyLDU1Niw3Njkgb3BzL3NlYyBcdTAwQjExLjczJSAoNzcgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIHN0cmluZyBsaXRlcmFsICAgICB4IDM4LDU2NCw3OTYgb3BzL3NlYyBcdTAwQjExLjE1JSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIGJvb2xlYW4gbGl0ZXJhbCAgICB4IDMxLDE0OCw5NDAgb3BzL3NlYyBcdTAwQjExLjEwJSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDMyLDY3OSwzMzAgb3BzL3NlYyBcdTAwQjExLjkwJSAoNzggcnVucyBzYW1wbGVkKVxuICAgKiAgIHVuZGVmaW5lZCAgICAgICAgICB4IDMyLDM2MywzNjggb3BzL3NlYyBcdTAwQjExLjA3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiAgIGZ1bmN0aW9uICAgICAgICAgICB4IDMxLDI5Niw4NzAgb3BzL3NlYyBcdTAwQjEwLjk2JSAoODMgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgdmFyIHR5cGVvZk9iaiA9IHR5cGVvZiBvYmo7XG4gIGlmICh0eXBlb2ZPYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHR5cGVvZk9iajtcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAyOCw2NDUsNzY1IG9wcy9zZWMgXHUwMEIxMS4xNyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogUG9zdDpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAzNiw0MjgsOTYyIG9wcy9zZWMgXHUwMEIxMS4zNyUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgICovXG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93KWBgXG4gICAqICAtIE5vZGUgPT09IFwiW29iamVjdCBnbG9iYWxdXCJcbiAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gUGhhbnRvbUpTID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBJRSAxMSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBJRSBFZGdlID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcylgYFxuICAgKiAgLSBDaHJvbWUgV29ya2VyID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIEZpcmVmb3ggV29ya2VyID09PSBcIltvYmplY3QgRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICogIC0gU2FmYXJpIFdvcmtlciA9PT0gXCJbb2JqZWN0IERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIElFIDExIFdvcmtlciA9PT0gXCJbb2JqZWN0IFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIElFIEVkZ2UgV29ya2VyID09PSBcIltvYmplY3QgV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICovXG4gIGlmIChvYmogPT09IGdsb2JhbE9iamVjdCkge1xuICAgIHJldHVybiAnZ2xvYmFsJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBhcnJheSBsaXRlcmFsICAgICAgeCAyLDg4OCwzNTIgb3BzL3NlYyBcdTAwQjEwLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIGFycmF5IGxpdGVyYWwgICAgICB4IDIyLDQ3OSw2NTAgb3BzL3NlYyBcdTAwQjEwLjk2JSAoODEgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkob2JqKSAmJlxuICAgIChzeW1ib2xUb1N0cmluZ1RhZ0V4aXN0cyA9PT0gZmFsc2UgfHwgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gb2JqKSlcbiAgKSB7XG4gICAgcmV0dXJuICdBcnJheSc7XG4gIH1cblxuICAvLyBOb3QgY2FjaGluZyBleGlzdGVuY2Ugb2YgYHdpbmRvd2AgYW5kIHJlbGF0ZWQgcHJvcGVydGllcyBkdWUgdG8gcG90ZW50aWFsXG4gIC8vIGZvciBgd2luZG93YCB0byBiZSB1bnNldCBiZWZvcmUgdGVzdHMgaW4gcXVhc2ktYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cgIT09IG51bGwpIHtcbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNsb2NhdGlvbilcbiAgICAgKiBXaGF0V0cgSFRNTCQ3LjcuMyAtIFRoZSBgTG9jYXRpb25gIGludGVyZmFjZVxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93LmxvY2F0aW9uKWBgXG4gICAgICogIC0gSUUgPD0xMSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAqICAtIElFIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmxvY2F0aW9uID09PSAnb2JqZWN0JyAmJiBvYmogPT09IHdpbmRvdy5sb2NhdGlvbikge1xuICAgICAgcmV0dXJuICdMb2NhdGlvbic7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvY3VtZW50KVxuICAgICAqIFdoYXRXRyBIVE1MJDMuMS4xIC0gVGhlIGBEb2N1bWVudGAgb2JqZWN0XG4gICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICogICAgICAgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1IVE1ML2h0bWwuaHRtbCNJRC0yNjgwOTI2OClcbiAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICogICAgICAgV2hhdFdHIEhUTUwgc3RhdGVzOlxuICAgICAqICAgICAgICAgPiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBXaW5kb3cgb2JqZWN0cyBtdXN0IGFsc28gaGF2ZSBhXG4gICAgICogICAgICAgICA+IHdyaXRhYmxlLCBjb25maWd1cmFibGUsIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVkXG4gICAgICogICAgICAgICA+IEhUTUxEb2N1bWVudCB3aG9zZSB2YWx1ZSBpcyB0aGUgRG9jdW1lbnQgaW50ZXJmYWNlIG9iamVjdC5cbiAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50KWBgXG4gICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBEb2N1bWVudF1cIlxuICAgICAqICAtIElFIDExID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgRWRnZSA8PTEzID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgPT09ICdvYmplY3QnICYmIG9iaiA9PT0gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gJ0RvY3VtZW50JztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjbWltZXR5cGVhcnJheSlcbiAgICAgICAqIFdoYXRXRyBIVE1MJDguNi4xLjUgLSBQbHVnaW5zIC0gSW50ZXJmYWNlIE1pbWVUeXBlQXJyYXlcbiAgICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLm1pbWVUeXBlcylgYFxuICAgICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IE1TTWltZVR5cGVzQ29sbGVjdGlvbl1cIlxuICAgICAgICovXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubWltZVR5cGVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIG9iaiA9PT0gd2luZG93Lm5hdmlnYXRvci5taW1lVHlwZXMpIHtcbiAgICAgICAgcmV0dXJuICdNaW1lVHlwZUFycmF5JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3BsdWdpbmFycmF5KVxuICAgICAgICogV2hhdFdHIEhUTUwkOC42LjEuNSAtIFBsdWdpbnMgLSBJbnRlcmZhY2UgUGx1Z2luQXJyYXlcbiAgICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLnBsdWdpbnMpYGBcbiAgICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBNU1BsdWdpbnNDb2xsZWN0aW9uXVwiXG4gICAgICAgKi9cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm5hdmlnYXRvci5wbHVnaW5zID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIG9iaiA9PT0gd2luZG93Lm5hdmlnYXRvci5wbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiAnUGx1Z2luQXJyYXknO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgodHlwZW9mIHdpbmRvdy5IVE1MRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2Ygd2luZG93LkhUTUxFbGVtZW50ID09PSAnb2JqZWN0JykgJiZcbiAgICAgICAgb2JqIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSB7XG4gICAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNwbHVnaW5hcnJheSlcbiAgICAgICogV2hhdFdHIEhUTUwkNC40LjQgLSBUaGUgYGJsb2NrcXVvdGVgIGVsZW1lbnQgLSBJbnRlcmZhY2UgYEhUTUxRdW90ZUVsZW1lbnRgXG4gICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYmxvY2txdW90ZScpKWBgXG4gICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBIVE1MQmxvY2tFbGVtZW50XVwiXG4gICAgICAqL1xuICAgICAgaWYgKG9iai50YWdOYW1lID09PSAnQkxPQ0tRVU9URScpIHtcbiAgICAgICAgcmV0dXJuICdIVE1MUXVvdGVFbGVtZW50JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlZGF0YWNlbGxlbGVtZW50KVxuICAgICAgICogV2hhdFdHIEhUTUwkNC45LjkgLSBUaGUgYHRkYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnRgXG4gICAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgICAqICAgICAgIChodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItSFRNTC9odG1sLmh0bWwjSUQtODI5MTUwNzUpXG4gICAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgICAqIFRlc3Q6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpKVxuICAgICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqL1xuICAgICAgaWYgKG9iai50YWdOYW1lID09PSAnVEQnKSB7XG4gICAgICAgIHJldHVybiAnSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50JztcbiAgICAgIH1cblxuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlaGVhZGVyY2VsbGVsZW1lbnQpXG4gICAgICAgKiBXaGF0V0cgSFRNTCQ0LjkuOSAtIFRoZSBgdGRgIGVsZW1lbnQgLSBJbnRlcmZhY2UgYEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50YFxuICAgICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTgyOTE1MDc1KVxuICAgICAgICogICAgICAgd2hpY2ggc3VnZ2VzdHMgdGhhdCBicm93c2VycyBzaG91bGQgdXNlIEhUTUxUYWJsZUNlbGxFbGVtZW50IGZvclxuICAgICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICAgKiBUZXN0OiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKSlcbiAgICAgICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKi9cbiAgICAgIGlmIChvYmoudGFnTmFtZSA9PT0gJ1RIJykge1xuICAgICAgICByZXR1cm4gJ0hUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50JztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDYyNSw2NDQgb3BzL3NlYyBcdTAwQjExLjU4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggMSwyNzksODUyIG9wcy9zZWMgXHUwMEIxMi45MSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQzMkFycmF5ICAgICAgICB4IDEsMTc4LDE4NSBvcHMvc2VjIFx1MDBCMTEuOTUlICg4MyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCAxLDAwOCwzODAgb3BzL3NlYyBcdTAwQjEyLjI1JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggMSwxMjgsMDQwIG9wcy9zZWMgXHUwMEIxMi4xMSUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDMyQXJyYXkgICAgICAgICB4IDEsMTcwLDExOSBvcHMvc2VjIFx1MDBCMTIuODglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCAxLDE3NiwzNDggb3BzL3NlYyBcdTAwQjE1Ljc5JSAoODYgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggMSwwNTgsNzA3IG9wcy9zZWMgXHUwMEIxNC45NCUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4Q2xhbXBlZEFycmF5ICB4IDEsMTEwLDYzMyBvcHMvc2VjIFx1MDBCMTQuMjAlICg4MCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDcsMTA1LDY3MSBvcHMvc2VjIFx1MDBCMTEzLjQ3JSAoNjQgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggNSw4ODcsOTEyIG9wcy9zZWMgXHUwMEIxMS40NiUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQzMkFycmF5ICAgICAgICB4IDYsNDkxLDY2MSBvcHMvc2VjIFx1MDBCMTEuNzYlICg3OSBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCA2LDU1OSw3OTUgb3BzL3NlYyBcdTAwQjExLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggNiw0NjMsOTY2IG9wcy9zZWMgXHUwMEIxMS40MyUgKDg1IHJ1bnMgc2FtcGxlZClcbiAgKiAgIEludDMyQXJyYXkgICAgICAgICB4IDUsNjQxLDg0MSBvcHMvc2VjIFx1MDBCMTMuNDklICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCA2LDU4Myw1MTEgb3BzL3NlYyBcdTAwQjExLjk4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggNiw2MDYsMDc4IG9wcy9zZWMgXHUwMEIxMS43NCUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiAgIFVpbnQ4Q2xhbXBlZEFycmF5ICB4IDYsNjAyLDIyNCBvcHMvc2VjIFx1MDBCMTEuNzclICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIHZhciBzdHJpbmdUYWcgPSAoc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgJiYgb2JqW1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICBpZiAodHlwZW9mIHN0cmluZ1RhZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG5cbiAgdmFyIG9ialByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHJlZ2V4IGxpdGVyYWwgICAgICB4IDEsNzcyLDM4NSBvcHMvc2VjIFx1MDBCMTEuODUlICg3NyBydW5zIHNhbXBsZWQpXG4gICogICByZWdleCBjb25zdHJ1Y3RvciAgeCAyLDE0Myw2MzQgb3BzL3NlYyBcdTAwQjEyLjQ2JSAoNzggcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICByZWdleCBsaXRlcmFsICAgICAgeCAzLDkyOCwwMDkgb3BzL3NlYyBcdTAwQjEwLjY1JSAoNzggcnVucyBzYW1wbGVkKVxuICAqICAgcmVnZXggY29uc3RydWN0b3IgIHggMyw5MzEsMTA4IG9wcy9zZWMgXHUwMEIxMC41OCUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gUmVnRXhwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUmVnRXhwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMiwxMzAsMDc0IG9wcy9zZWMgXHUwMEIxNC40MiUgKDY4IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMyw5NTMsNzc5IG9wcy9zZWMgXHUwMEIxMS4zNSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gRGF0ZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGUnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLXByb21pc2UucHJvdG90eXBlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyNS40LjUuNCAtIFByb21pc2UucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlByb21pc2VcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQcm9taXNlLnJlc29sdmUoKSlgYFxuICAgKiAgLSBDaHJvbWUgPD00NyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKiAgLSBFZGdlIDw9MjAgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICogIC0gRmlyZWZveCAyOS1MYXRlc3QgPT09IFwiW29iamVjdCBQcm9taXNlXVwiXG4gICAqICAtIFNhZmFyaSA3LjEtTGF0ZXN0ID09PSBcIltvYmplY3QgUHJvbWlzZV1cIlxuICAgKi9cbiAgaWYgKHByb21pc2VFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBQcm9taXNlLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUHJvbWlzZSc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDIsMjIyLDE4NiBvcHMvc2VjIFx1MDBCMTEuMzElICg4MiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDQsNTQ1LDg3OSBvcHMvc2VjIFx1MDBCMTEuMTMlICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChzZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBTZXQucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdTZXQnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCAyLDM5Niw4NDIgb3BzL3NlYyBcdTAwQjExLjU5JSAoODEgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCA0LDE4Myw5NDUgb3BzL3NlYyBcdTAwQjE2LjU5JSAoODIgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAobWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gTWFwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnTWFwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggMSwzMjMsMjIwIG9wcy9zZWMgXHUwMEIxMi4xNyUgKDc2IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggNCwyMzcsNTEwIG9wcy9zZWMgXHUwMEIxMi4wMSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHdlYWtTZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBXZWFrU2V0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnV2Vha1NldCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDEsNTAwLDI2MCBvcHMvc2VjIFx1MDBCMTIuMDIlICg3OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDMsODgxLDM4NCBvcHMvc2VjIFx1MDBCMTEuNDUlICg4MiBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmICh3ZWFrTWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gV2Vha01hcC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1dlYWtNYXAnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWRhdGF2aWV3LnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjQuMi40LjIxIC0gRGF0YVZpZXcucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIkRhdGFWaWV3XCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoZGF0YVZpZXdFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBEYXRhVmlldy5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGFWaWV3JztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lbWFwaXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMy4xLjUuMi4yIC0gJU1hcEl0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJNYXAgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgTWFwKCkuZW50cmllcygpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKG1hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IG1hcEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdNYXAgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVzZXRpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIzLjIuNS4yLjIgLSAlU2V0SXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlNldCBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ldyBTZXQoKS5lbnRyaWVzKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoc2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gc2V0SXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1NldCBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMi4xLjUuMi4yIC0gJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIkFycmF5IEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoW11bU3ltYm9sLml0ZXJhdG9yXSgpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBhcnJheUl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdBcnJheSBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjEuMS41LjIuMiAtICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiU3RyaW5nIEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoJydbU3ltYm9sLml0ZXJhdG9yXSgpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKHN0cmluZ0l0ZXJhdG9yRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gc3RyaW5nSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1N0cmluZyBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDIsNDI0LDMyMCBvcHMvc2VjIFx1MDBCMTEuNjclICg3NiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDUsODM4LDAwMCBvcHMvc2VjIFx1MDBCMTAuOTklICg4NCBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChvYmpQcm90b3R5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0XG4gICAgLnByb3RvdHlwZVxuICAgIC50b1N0cmluZ1xuICAgIC5jYWxsKG9iailcbiAgICAuc2xpY2UodG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGgsIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCk7XG59XG5cbnJldHVybiB0eXBlRGV0ZWN0O1xuXG59KSkpO1xuIiwgIi8qIVxuICogQ2hhaSAtIGV4cGVjdFR5cGVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZXhwZWN0VHlwZXMob2JqLCB0eXBlcylcbiAqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQgYWdhaW5zdCBpcyBvZiBhIHZhbGlkIHR5cGUuXG4gKlxuICogICAgIHV0aWxzLmV4cGVjdFR5cGVzKHRoaXMsIFsnYXJyYXknLCAnb2JqZWN0JywgJ3N0cmluZyddKTtcbiAqXG4gKiBAcGFyYW0ge01peGVkfSBvYmogY29uc3RydWN0ZWQgQXNzZXJ0aW9uXG4gKiBAcGFyYW0ge0FycmF5fSB0eXBlIEEgbGlzdCBvZiBhbGxvd2VkIHR5cGVzIGZvciB0aGlzIGFzc2VydGlvblxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZXhwZWN0VHlwZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIEFzc2VydGlvbkVycm9yID0gcmVxdWlyZSgnYXNzZXJ0aW9uLWVycm9yJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIHR5cGUgPSByZXF1aXJlKCd0eXBlLWRldGVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4cGVjdFR5cGVzKG9iaiwgdHlwZXMpIHtcbiAgdmFyIGZsYWdNc2cgPSBmbGFnKG9iaiwgJ21lc3NhZ2UnKTtcbiAgdmFyIHNzZmkgPSBmbGFnKG9iaiwgJ3NzZmknKTtcblxuICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG5cbiAgb2JqID0gZmxhZyhvYmosICdvYmplY3QnKTtcbiAgdHlwZXMgPSB0eXBlcy5tYXAoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTsgfSk7XG4gIHR5cGVzLnNvcnQoKTtcblxuICAvLyBUcmFuc2Zvcm1zIFsnbG9yZW0nLCAnaXBzdW0nXSBpbnRvICdhIGxvcmVtLCBvciBhbiBpcHN1bSdcbiAgdmFyIHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbiAodCwgaW5kZXgpIHtcbiAgICB2YXIgYXJ0ID0gflsgJ2EnLCAnZScsICdpJywgJ28nLCAndScgXS5pbmRleE9mKHQuY2hhckF0KDApKSA/ICdhbicgOiAnYSc7XG4gICAgdmFyIG9yID0gdHlwZXMubGVuZ3RoID4gMSAmJiBpbmRleCA9PT0gdHlwZXMubGVuZ3RoIC0gMSA/ICdvciAnIDogJyc7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgJyAnICsgdDtcbiAgfSkuam9pbignLCAnKTtcblxuICB2YXIgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbiAoZXhwZWN0ZWQpIHsgcmV0dXJuIG9ialR5cGUgPT09IGV4cGVjdGVkOyB9KSkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIGZsYWdNc2cgKyAnb2JqZWN0IHRlc3RlZCBtdXN0IGJlICcgKyBzdHIgKyAnLCBidXQgJyArIG9ialR5cGUgKyAnIGdpdmVuJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG59O1xuIiwgIi8qIVxuICogQ2hhaSAtIGdldEFjdHVhbCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmdldEFjdHVhbChvYmplY3QsIFthY3R1YWxdKVxuICpcbiAqIFJldHVybnMgdGhlIGBhY3R1YWxgIHZhbHVlIGZvciBhbiBBc3NlcnRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAoY29uc3RydWN0ZWQgQXNzZXJ0aW9uKVxuICogQHBhcmFtIHtBcmd1bWVudHN9IGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZS5hc3NlcnQgYXJndW1lbnRzXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBnZXRBY3R1YWxcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldEFjdHVhbChvYmosIGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbNF0gOiBvYmouX29iajtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiAhXG4gKiBDaGFpIC0gZ2V0RnVuY05hbWUgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNiBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5nZXRGdW5jTmFtZShjb25zdHJ1Y3RvckZuKVxuICpcbiAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbi5cbiAqIFdoZW4gYSBub24tZnVuY3Rpb24gaW5zdGFuY2UgaXMgcGFzc2VkLCByZXR1cm5zIGBudWxsYC5cbiAqIFRoaXMgYWxzbyBpbmNsdWRlcyBhIHBvbHlmaWxsIGZ1bmN0aW9uIGlmIGBhRnVuYy5uYW1lYCBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAbmFtZSBnZXRGdW5jTmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3RcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIHRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmN0aW9uTmFtZU1hdGNoID0gL1xccypmdW5jdGlvbig/Olxcc3xcXHMqXFwvXFwqW14oPzoqXFwvKV0rXFwqXFwvXFxzKikqKFteXFxzXFwoXFwvXSspLztcbmZ1bmN0aW9uIGdldEZ1bmNOYW1lKGFGdW5jKSB7XG4gIGlmICh0eXBlb2YgYUZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBuYW1lID0gJyc7XG4gIGlmICh0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlLm5hbWUgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBhRnVuYy5uYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEhlcmUgd2UgcnVuIGEgcG9seWZpbGwgaWYgRnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYG5hbWVgIHByb3BlcnR5IGFuZCBpZiBhRnVuYy5uYW1lIGlzIG5vdCBkZWZpbmVkXG4gICAgdmFyIG1hdGNoID0gdG9TdHJpbmcuY2FsbChhRnVuYykubWF0Y2goZnVuY3Rpb25OYW1lTWF0Y2gpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbmFtZSA9IG1hdGNoWzFdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB3ZSd2ZSBnb3QgYSBgbmFtZWAgcHJvcGVydHkgd2UganVzdCB1c2UgaXRcbiAgICBuYW1lID0gYUZ1bmMubmFtZTtcbiAgfVxuXG4gIHJldHVybiBuYW1lO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEZ1bmNOYW1lO1xuIiwgIiIsICIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLmxvdXBlID0ge30pKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICAgIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG4gIH1cblxuICBmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjtcbiAgICB2YXIgX2FyciA9IFtdO1xuICAgIHZhciBfbiA9IHRydWU7XG4gICAgdmFyIF9kID0gZmFsc2U7XG4gICAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZCA9IHRydWU7XG4gICAgICBfZSA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2FycjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgICBpZiAoIW8pIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICAgIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gICAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgICByZXR1cm4gYXJyMjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHZhciBhbnNpQ29sb3JzID0ge1xuICAgIGJvbGQ6IFsnMScsICcyMiddLFxuICAgIGRpbTogWycyJywgJzIyJ10sXG4gICAgaXRhbGljOiBbJzMnLCAnMjMnXSxcbiAgICB1bmRlcmxpbmU6IFsnNCcsICcyNCddLFxuICAgIC8vIDUgJiA2IGFyZSBibGlua2luZ1xuICAgIGludmVyc2U6IFsnNycsICcyNyddLFxuICAgIGhpZGRlbjogWyc4JywgJzI4J10sXG4gICAgc3RyaWtlOiBbJzknLCAnMjknXSxcbiAgICAvLyAxMC0yMCBhcmUgZm9udHNcbiAgICAvLyAyMS0yOSBhcmUgcmVzZXRzIGZvciAxLTlcbiAgICBibGFjazogWyczMCcsICczOSddLFxuICAgIHJlZDogWyczMScsICczOSddLFxuICAgIGdyZWVuOiBbJzMyJywgJzM5J10sXG4gICAgeWVsbG93OiBbJzMzJywgJzM5J10sXG4gICAgYmx1ZTogWyczNCcsICczOSddLFxuICAgIG1hZ2VudGE6IFsnMzUnLCAnMzknXSxcbiAgICBjeWFuOiBbJzM2JywgJzM5J10sXG4gICAgd2hpdGU6IFsnMzcnLCAnMzknXSxcbiAgICBicmlnaHRibGFjazogWyczMDsxJywgJzM5J10sXG4gICAgYnJpZ2h0cmVkOiBbJzMxOzEnLCAnMzknXSxcbiAgICBicmlnaHRncmVlbjogWyczMjsxJywgJzM5J10sXG4gICAgYnJpZ2h0eWVsbG93OiBbJzMzOzEnLCAnMzknXSxcbiAgICBicmlnaHRibHVlOiBbJzM0OzEnLCAnMzknXSxcbiAgICBicmlnaHRtYWdlbnRhOiBbJzM1OzEnLCAnMzknXSxcbiAgICBicmlnaHRjeWFuOiBbJzM2OzEnLCAnMzknXSxcbiAgICBicmlnaHR3aGl0ZTogWyczNzsxJywgJzM5J10sXG4gICAgZ3JleTogWyc5MCcsICczOSddXG4gIH07XG4gIHZhciBzdHlsZXMgPSB7XG4gICAgc3BlY2lhbDogJ2N5YW4nLFxuICAgIG51bWJlcjogJ3llbGxvdycsXG4gICAgYmlnaW50OiAneWVsbG93JyxcbiAgICBib29sZWFuOiAneWVsbG93JyxcbiAgICB1bmRlZmluZWQ6ICdncmV5JyxcbiAgICBudWxsOiAnYm9sZCcsXG4gICAgc3RyaW5nOiAnZ3JlZW4nLFxuICAgIHN5bWJvbDogJ2dyZWVuJyxcbiAgICBkYXRlOiAnbWFnZW50YScsXG4gICAgcmVnZXhwOiAncmVkJ1xuICB9O1xuICB2YXIgdHJ1bmNhdG9yID0gJ1x1MjAyNic7XG5cbiAgZnVuY3Rpb24gY29sb3Jpc2UodmFsdWUsIHN0eWxlVHlwZSkge1xuICAgIHZhciBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXTtcblxuICAgIGlmICghY29sb3IpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBcIlxceDFCW1wiLmNvbmNhdChjb2xvclswXSwgXCJtXCIpLmNvbmNhdChTdHJpbmcodmFsdWUpLCBcIlxceDFCW1wiKS5jb25jYXQoY29sb3JbMV0sIFwibVwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBfcmVmJHNob3dIaWRkZW4gPSBfcmVmLnNob3dIaWRkZW4sXG4gICAgICAgIHNob3dIaWRkZW4gPSBfcmVmJHNob3dIaWRkZW4gPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzaG93SGlkZGVuLFxuICAgICAgICBfcmVmJGRlcHRoID0gX3JlZi5kZXB0aCxcbiAgICAgICAgZGVwdGggPSBfcmVmJGRlcHRoID09PSB2b2lkIDAgPyAyIDogX3JlZiRkZXB0aCxcbiAgICAgICAgX3JlZiRjb2xvcnMgPSBfcmVmLmNvbG9ycyxcbiAgICAgICAgY29sb3JzID0gX3JlZiRjb2xvcnMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRjb2xvcnMsXG4gICAgICAgIF9yZWYkY3VzdG9tSW5zcGVjdCA9IF9yZWYuY3VzdG9tSW5zcGVjdCxcbiAgICAgICAgY3VzdG9tSW5zcGVjdCA9IF9yZWYkY3VzdG9tSW5zcGVjdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkY3VzdG9tSW5zcGVjdCxcbiAgICAgICAgX3JlZiRzaG93UHJveHkgPSBfcmVmLnNob3dQcm94eSxcbiAgICAgICAgc2hvd1Byb3h5ID0gX3JlZiRzaG93UHJveHkgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzaG93UHJveHksXG4gICAgICAgIF9yZWYkbWF4QXJyYXlMZW5ndGggPSBfcmVmLm1heEFycmF5TGVuZ3RoLFxuICAgICAgICBtYXhBcnJheUxlbmd0aCA9IF9yZWYkbWF4QXJyYXlMZW5ndGggPT09IHZvaWQgMCA/IEluZmluaXR5IDogX3JlZiRtYXhBcnJheUxlbmd0aCxcbiAgICAgICAgX3JlZiRicmVha0xlbmd0aCA9IF9yZWYuYnJlYWtMZW5ndGgsXG4gICAgICAgIGJyZWFrTGVuZ3RoID0gX3JlZiRicmVha0xlbmd0aCA9PT0gdm9pZCAwID8gSW5maW5pdHkgOiBfcmVmJGJyZWFrTGVuZ3RoLFxuICAgICAgICBfcmVmJHNlZW4gPSBfcmVmLnNlZW4sXG4gICAgICAgIHNlZW4gPSBfcmVmJHNlZW4gPT09IHZvaWQgMCA/IFtdIDogX3JlZiRzZWVuLFxuICAgICAgICBfcmVmJHRydW5jYXRlID0gX3JlZi50cnVuY2F0ZSxcbiAgICAgICAgdHJ1bmNhdGUgPSBfcmVmJHRydW5jYXRlID09PSB2b2lkIDAgPyBJbmZpbml0eSA6IF9yZWYkdHJ1bmNhdGUsXG4gICAgICAgIF9yZWYkc3R5bGl6ZSA9IF9yZWYuc3R5bGl6ZSxcbiAgICAgICAgc3R5bGl6ZSA9IF9yZWYkc3R5bGl6ZSA9PT0gdm9pZCAwID8gU3RyaW5nIDogX3JlZiRzdHlsaXplO1xuXG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBzaG93SGlkZGVuOiBCb29sZWFuKHNob3dIaWRkZW4pLFxuICAgICAgZGVwdGg6IE51bWJlcihkZXB0aCksXG4gICAgICBjb2xvcnM6IEJvb2xlYW4oY29sb3JzKSxcbiAgICAgIGN1c3RvbUluc3BlY3Q6IEJvb2xlYW4oY3VzdG9tSW5zcGVjdCksXG4gICAgICBzaG93UHJveHk6IEJvb2xlYW4oc2hvd1Byb3h5KSxcbiAgICAgIG1heEFycmF5TGVuZ3RoOiBOdW1iZXIobWF4QXJyYXlMZW5ndGgpLFxuICAgICAgYnJlYWtMZW5ndGg6IE51bWJlcihicmVha0xlbmd0aCksXG4gICAgICB0cnVuY2F0ZTogTnVtYmVyKHRydW5jYXRlKSxcbiAgICAgIHNlZW46IHNlZW4sXG4gICAgICBzdHlsaXplOiBzdHlsaXplXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLmNvbG9ycykge1xuICAgICAgb3B0aW9ucy5zdHlsaXplID0gY29sb3Jpc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbiAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgpIHtcbiAgICB2YXIgdGFpbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1bmNhdG9yO1xuICAgIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICAgIHZhciB0YWlsTGVuZ3RoID0gdGFpbC5sZW5ndGg7XG4gICAgdmFyIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICBpZiAodGFpbExlbmd0aCA+IGxlbmd0aCAmJiBzdHJpbmdMZW5ndGggPiB0YWlsTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFpbDtcbiAgICB9XG5cbiAgICBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdChzdHJpbmcuc2xpY2UoMCwgbGVuZ3RoIC0gdGFpbExlbmd0aCkpLmNvbmNhdCh0YWlsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cbiAgZnVuY3Rpb24gaW5zcGVjdExpc3QobGlzdCwgb3B0aW9ucywgaW5zcGVjdEl0ZW0pIHtcbiAgICB2YXIgc2VwYXJhdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAnLCAnO1xuICAgIGluc3BlY3RJdGVtID0gaW5zcGVjdEl0ZW0gfHwgb3B0aW9ucy5pbnNwZWN0O1xuICAgIHZhciBzaXplID0gbGlzdC5sZW5ndGg7XG4gICAgaWYgKHNpemUgPT09IDApIHJldHVybiAnJztcbiAgICB2YXIgb3JpZ2luYWxMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlO1xuICAgIHZhciBvdXRwdXQgPSAnJztcbiAgICB2YXIgcGVlayA9ICcnO1xuICAgIHZhciB0cnVuY2F0ZWQgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxKSB7XG4gICAgICB2YXIgbGFzdCA9IGkgKyAxID09PSBsaXN0Lmxlbmd0aDtcbiAgICAgIHZhciBzZWNvbmRUb0xhc3QgPSBpICsgMiA9PT0gbGlzdC5sZW5ndGg7XG4gICAgICB0cnVuY2F0ZWQgPSBcIlwiLmNvbmNhdCh0cnVuY2F0b3IsIFwiKFwiKS5jb25jYXQobGlzdC5sZW5ndGggLSBpLCBcIilcIik7XG4gICAgICB2YXIgdmFsdWUgPSBsaXN0W2ldOyAvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHJlbWFpbmluZyB3ZSBuZWVkIHRvIGFjY291bnQgZm9yIGEgc2VwYXJhdG9yIG9mIGAsIGBcblxuICAgICAgb3B0aW9ucy50cnVuY2F0ZSA9IG9yaWdpbmFsTGVuZ3RoIC0gb3V0cHV0Lmxlbmd0aCAtIChsYXN0ID8gMCA6IHNlcGFyYXRvci5sZW5ndGgpO1xuICAgICAgdmFyIHN0cmluZyA9IHBlZWsgfHwgaW5zcGVjdEl0ZW0odmFsdWUsIG9wdGlvbnMpICsgKGxhc3QgPyAnJyA6IHNlcGFyYXRvcik7XG4gICAgICB2YXIgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgICAgdmFyIHRydW5jYXRlZExlbmd0aCA9IG5leHRMZW5ndGggKyB0cnVuY2F0ZWQubGVuZ3RoOyAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGVsZW1lbnQsIGFuZCBhZGRpbmcgaXQgd291bGRcbiAgICAgIC8vIHRha2UgdXMgb3ZlciBsZW5ndGgsIGJ1dCBhZGRpbmcgdGhlIHRydW5jYXRvciB3b3VsZG4ndCAtIHRoZW4gYnJlYWsgbm93XG5cbiAgICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBvciBzZWNvbmQgdG8gbGFzdCBlbGVtZW50IHRvIHNjYW4sXG4gICAgICAvLyBidXQgdGhlIHN0cmluZyBpcyBhbHJlYWR5IG92ZXIgbGVuZ3RoIHRoZW4gYnJlYWsgaGVyZVxuXG5cbiAgICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBQZWVrIGF0IHRoZSBuZXh0IHN0cmluZyB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkXG4gICAgICAvLyBicmVhayBlYXJseSBiZWZvcmUgYWRkaW5nIHRoaXMgaXRlbSB0byB0aGUgb3V0cHV0XG5cblxuICAgICAgcGVlayA9IGxhc3QgPyAnJyA6IGluc3BlY3RJdGVtKGxpc3RbaSArIDFdLCBvcHRpb25zKSArIChzZWNvbmRUb0xhc3QgPyAnJyA6IHNlcGFyYXRvcik7IC8vIElmIHdlIGhhdmUgb25lIGVsZW1lbnQgbGVmdCwgYnV0IHRoaXMgZWxlbWVudCBhbmRcbiAgICAgIC8vIHRoZSBuZXh0IHRha2VzIG92ZXIgbGVuZ3RoLCB0aGUgYnJlYWsgZWFybHlcblxuICAgICAgaWYgKCFsYXN0ICYmIHNlY29uZFRvTGFzdCAmJiB0cnVuY2F0ZWRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBuZXh0TGVuZ3RoICsgcGVlay5sZW5ndGggPiBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgb3V0cHV0ICs9IHN0cmluZzsgLy8gSWYgdGhlIG5leHQgZWxlbWVudCB0YWtlcyB1cyB0byBsZW5ndGggLVxuICAgICAgLy8gYnV0IHRoZXJlIGFyZSBtb3JlIGFmdGVyIHRoYXQsIHRoZW4gd2Ugc2hvdWxkIHRydW5jYXRlIG5vd1xuXG4gICAgICBpZiAoIWxhc3QgJiYgIXNlY29uZFRvTGFzdCAmJiBuZXh0TGVuZ3RoICsgcGVlay5sZW5ndGggPj0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgICAgdHJ1bmNhdGVkID0gXCJcIi5jb25jYXQodHJ1bmNhdG9yLCBcIihcIikuY29uY2F0KGxpc3QubGVuZ3RoIC0gaSAtIDEsIFwiKVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRydW5jYXRlZCA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiLmNvbmNhdChvdXRwdXQpLmNvbmNhdCh0cnVuY2F0ZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVvdGVDb21wbGV4S2V5KGtleSkge1xuICAgIGlmIChrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aXzAtOV0qJC8pKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShrZXkpLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RQcm9wZXJ0eShfcmVmMiwgb3B0aW9ucykge1xuICAgIHZhciBfcmVmMyA9IF9zbGljZWRUb0FycmF5KF9yZWYyLCAyKSxcbiAgICAgICAga2V5ID0gX3JlZjNbMF0sXG4gICAgICAgIHZhbHVlID0gX3JlZjNbMV07XG5cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDI7XG5cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGtleSA9IHF1b3RlQ29tcGxleEtleShrZXkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSAhPT0gJ251bWJlcicpIHtcbiAgICAgIGtleSA9IFwiW1wiLmNvbmNhdChvcHRpb25zLmluc3BlY3Qoa2V5LCBvcHRpb25zKSwgXCJdXCIpO1xuICAgIH1cblxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI6IFwiKS5jb25jYXQodmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gICAgLy8gT2JqZWN0LmtleXMgd2lsbCBhbHdheXMgb3V0cHV0IHRoZSBBcnJheSBpbmRpY2VzIGZpcnN0LCBzbyB3ZSBjYW4gc2xpY2UgYnlcbiAgICAvLyBgYXJyYXkubGVuZ3RoYCB0byBnZXQgbm9uLWluZGV4IHByb3BlcnRpZXNcbiAgICB2YXIgbm9uSW5kZXhQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoYXJyYXkpLnNsaWNlKGFycmF5Lmxlbmd0aCk7XG4gICAgaWYgKCFhcnJheS5sZW5ndGggJiYgIW5vbkluZGV4UHJvcGVydGllcy5sZW5ndGgpIHJldHVybiAnW10nO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAgICB2YXIgbGlzdENvbnRlbnRzID0gaW5zcGVjdExpc3QoYXJyYXksIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbGlzdENvbnRlbnRzLmxlbmd0aDtcbiAgICB2YXIgcHJvcGVydHlDb250ZW50cyA9ICcnO1xuXG4gICAgaWYgKG5vbkluZGV4UHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIFtrZXksIGFycmF5W2tleV1dO1xuICAgICAgfSksIG9wdGlvbnMsIGluc3BlY3RQcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiWyBcIi5jb25jYXQobGlzdENvbnRlbnRzKS5jb25jYXQocHJvcGVydHlDb250ZW50cyA/IFwiLCBcIi5jb25jYXQocHJvcGVydHlDb250ZW50cykgOiAnJywgXCIgXVwiKTtcbiAgfVxuXG4gIC8qICFcbiAgICogQ2hhaSAtIGdldEZ1bmNOYW1lIHV0aWxpdHlcbiAgICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNiBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAgICogTUlUIExpY2Vuc2VkXG4gICAqL1xuXG4gIC8qKlxuICAgKiAjIyMgLmdldEZ1bmNOYW1lKGNvbnN0cnVjdG9yRm4pXG4gICAqXG4gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbi5cbiAgICogV2hlbiBhIG5vbi1mdW5jdGlvbiBpbnN0YW5jZSBpcyBwYXNzZWQsIHJldHVybnMgYG51bGxgLlxuICAgKiBUaGlzIGFsc28gaW5jbHVkZXMgYSBwb2x5ZmlsbCBmdW5jdGlvbiBpZiBgYUZ1bmMubmFtZWAgaXMgbm90IGRlZmluZWQuXG4gICAqXG4gICAqIEBuYW1lIGdldEZ1bmNOYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0XG4gICAqIEBuYW1lc3BhY2UgVXRpbHNcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmFyIHRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuICB2YXIgZnVuY3Rpb25OYW1lTWF0Y2ggPSAvXFxzKmZ1bmN0aW9uKD86XFxzfFxccypcXC9cXCpbXig/OipcXC8pXStcXCpcXC9cXHMqKSooW15cXHNcXChcXC9dKykvO1xuICBmdW5jdGlvbiBnZXRGdW5jTmFtZShhRnVuYykge1xuICAgIGlmICh0eXBlb2YgYUZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBuYW1lID0gJyc7XG4gICAgaWYgKHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGUubmFtZSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFGdW5jLm5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBIZXJlIHdlIHJ1biBhIHBvbHlmaWxsIGlmIEZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGBuYW1lYCBwcm9wZXJ0eSBhbmQgaWYgYUZ1bmMubmFtZSBpcyBub3QgZGVmaW5lZFxuICAgICAgdmFyIG1hdGNoID0gdG9TdHJpbmcuY2FsbChhRnVuYykubWF0Y2goZnVuY3Rpb25OYW1lTWF0Y2gpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIG5hbWUgPSBtYXRjaFsxXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgd2UndmUgZ290IGEgYG5hbWVgIHByb3BlcnR5IHdlIGp1c3QgdXNlIGl0XG4gICAgICBuYW1lID0gYUZ1bmMubmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIHZhciBnZXRGdW5jTmFtZV8xID0gZ2V0RnVuY05hbWU7XG5cbiAgdmFyIGdldEFycmF5TmFtZSA9IGZ1bmN0aW9uIGdldEFycmF5TmFtZShhcnJheSkge1xuICAgIC8vIFdlIG5lZWQgdG8gc3BlY2lhbCBjYXNlIE5vZGUuanMnIEJ1ZmZlcnMsIHdoaWNoIHJlcG9ydCB0byBiZSBVaW50OEFycmF5XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgIHJldHVybiAnQnVmZmVyJztcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgICAgcmV0dXJuIGFycmF5W1N5bWJvbC50b1N0cmluZ1RhZ107XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldEZ1bmNOYW1lXzEoYXJyYXkuY29uc3RydWN0b3IpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGluc3BlY3RUeXBlZEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gICAgdmFyIG5hbWUgPSBnZXRBcnJheU5hbWUoYXJyYXkpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGggKyA0OyAvLyBPYmplY3Qua2V5cyB3aWxsIGFsd2F5cyBvdXRwdXQgdGhlIEFycmF5IGluZGljZXMgZmlyc3QsIHNvIHdlIGNhbiBzbGljZSBieVxuICAgIC8vIGBhcnJheS5sZW5ndGhgIHRvIGdldCBub24taW5kZXggcHJvcGVydGllc1xuXG4gICAgdmFyIG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICAgIGlmICghYXJyYXkubGVuZ3RoICYmICFub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSByZXR1cm4gXCJcIi5jb25jYXQobmFtZSwgXCJbXVwiKTsgLy8gQXMgd2Uga25vdyBUeXBlZEFycmF5cyBvbmx5IGNvbnRhaW4gVW5zaWduZWQgSW50ZWdlcnMsIHdlIGNhbiBza2lwIGluc3BlY3RpbmcgZWFjaCBvbmUgYW5kIHNpbXBseVxuICAgIC8vIHN0eWxpc2UgdGhlIHRvU3RyaW5nKCkgdmFsdWUgb2YgdGhlbVxuXG4gICAgdmFyIG91dHB1dCA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0cmluZyA9IFwiXCIuY29uY2F0KG9wdGlvbnMuc3R5bGl6ZSh0cnVuY2F0ZShhcnJheVtpXSwgb3B0aW9ucy50cnVuY2F0ZSksICdudW1iZXInKSkuY29uY2F0KGkgPT09IGFycmF5Lmxlbmd0aCAtIDEgPyAnJyA6ICcsICcpO1xuICAgICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgICAgb3V0cHV0ICs9IFwiXCIuY29uY2F0KHRydW5jYXRvciwgXCIoXCIpLmNvbmNhdChhcnJheS5sZW5ndGggLSBhcnJheVtpXSArIDEsIFwiKVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG91dHB1dCArPSBzdHJpbmc7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5Q29udGVudHMgPSAnJztcblxuICAgIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3Qobm9uSW5kZXhQcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBba2V5LCBhcnJheVtrZXldXTtcbiAgICAgIH0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiLmNvbmNhdChuYW1lLCBcIlsgXCIpLmNvbmNhdChvdXRwdXQpLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzID8gXCIsIFwiLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzKSA6ICcnLCBcIiBdXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdERhdGUoZGF0ZU9iamVjdCwgb3B0aW9ucykge1xuICAgIC8vIElmIHdlIG5lZWQgdG8gLSB0cnVuY2F0ZSB0aGUgdGltZSBwb3J0aW9uLCBidXQgbmV2ZXIgdGhlIGRhdGVcbiAgICB2YXIgc3BsaXQgPSBkYXRlT2JqZWN0LnRvSlNPTigpLnNwbGl0KCdUJyk7XG4gICAgdmFyIGRhdGUgPSBzcGxpdFswXTtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiXCIuY29uY2F0KGRhdGUsIFwiVFwiKS5jb25jYXQodHJ1bmNhdGUoc3BsaXRbMV0sIG9wdGlvbnMudHJ1bmNhdGUgLSBkYXRlLmxlbmd0aCAtIDEpKSwgJ2RhdGUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RGdW5jdGlvbihmdW5jLCBvcHRpb25zKSB7XG4gICAgdmFyIG5hbWUgPSBnZXRGdW5jTmFtZV8xKGZ1bmMpO1xuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdbRnVuY3Rpb25dJywgJ3NwZWNpYWwnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiW0Z1bmN0aW9uIFwiLmNvbmNhdCh0cnVuY2F0ZShuYW1lLCBvcHRpb25zLnRydW5jYXRlIC0gMTEpLCBcIl1cIiksICdzcGVjaWFsJyk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoX3JlZiwgb3B0aW9ucykge1xuICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICBrZXkgPSBfcmVmMlswXSxcbiAgICAgICAgdmFsdWUgPSBfcmVmMlsxXTtcblxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAgICBrZXkgPSBvcHRpb25zLmluc3BlY3Qoa2V5LCBvcHRpb25zKTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IGtleS5sZW5ndGg7XG4gICAgdmFsdWUgPSBvcHRpb25zLmluc3BlY3QodmFsdWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXksIFwiID0+IFwiKS5jb25jYXQodmFsdWUpO1xuICB9IC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IGBtYXAuZW50cmllcygpYFxuXG5cbiAgZnVuY3Rpb24gbWFwVG9FbnRyaWVzKG1hcCkge1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIH0pO1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdE1hcChtYXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2l6ZSA9IG1hcC5zaXplIC0gMTtcblxuICAgIGlmIChzaXplIDw9IDApIHtcbiAgICAgIHJldHVybiAnTWFwe30nO1xuICAgIH1cblxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgICByZXR1cm4gXCJNYXB7IFwiLmNvbmNhdChpbnNwZWN0TGlzdChtYXBUb0VudHJpZXMobWFwKSwgb3B0aW9ucywgaW5zcGVjdE1hcEVudHJ5KSwgXCIgfVwiKTtcbiAgfVxuXG4gIHZhciBpc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpICE9PSBpO1xuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuXG5cbiAgZnVuY3Rpb24gaW5zcGVjdE51bWJlcihudW1iZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZSgnTmFOJywgJ251bWJlcicpO1xuICAgIH1cblxuICAgIGlmIChudW1iZXIgPT09IEluZmluaXR5KSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdJbmZpbml0eScsICdudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyID09PSAtSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoJy1JbmZpbml0eScsICdudW1iZXInKTtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKDEgLyBudW1iZXIgPT09IEluZmluaXR5ID8gJyswJyA6ICctMCcsICdudW1iZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKG51bWJlciwgb3B0aW9ucy50cnVuY2F0ZSksICdudW1iZXInKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RCaWdJbnQobnVtYmVyLCBvcHRpb25zKSB7XG4gICAgdmFyIG51bXMgPSB0cnVuY2F0ZShudW1iZXIudG9TdHJpbmcoKSwgb3B0aW9ucy50cnVuY2F0ZSAtIDEpO1xuICAgIGlmIChudW1zICE9PSB0cnVuY2F0b3IpIG51bXMgKz0gJ24nO1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUobnVtcywgJ2JpZ2ludCcpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdFJlZ0V4cCh2YWx1ZSwgb3B0aW9ucykge1xuICAgIHZhciBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy8nKVsyXTtcbiAgICB2YXIgc291cmNlTGVuZ3RoID0gb3B0aW9ucy50cnVuY2F0ZSAtICgyICsgZmxhZ3MubGVuZ3RoKTtcbiAgICB2YXIgc291cmNlID0gdmFsdWUuc291cmNlO1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCIvXCIuY29uY2F0KHRydW5jYXRlKHNvdXJjZSwgc291cmNlTGVuZ3RoKSwgXCIvXCIpLmNvbmNhdChmbGFncyksICdyZWdleHAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFycmF5RnJvbVNldChzZXQpIHtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RTZXQoc2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKHNldC5zaXplID09PSAwKSByZXR1cm4gJ1NldHt9JztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gICAgcmV0dXJuIFwiU2V0eyBcIi5jb25jYXQoaW5zcGVjdExpc3QoYXJyYXlGcm9tU2V0KHNldCksIG9wdGlvbnMpLCBcIiB9XCIpO1xuICB9XG5cbiAgdmFyIHN0cmluZ0VzY2FwZUNoYXJzID0gbmV3IFJlZ0V4cChcIlsnXFxcXHUwMDAwLVxcXFx1MDAxZlxcXFx1MDA3Zi1cXFxcdTAwOWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XCIgKyBcIlxcXFx1MjAwYy1cXFxcdTIwMGZcXFxcdTIwMjgtXFxcXHUyMDJmXFxcXHUyMDYwLVxcXFx1MjA2ZlxcXFx1ZmVmZlxcXFx1ZmZmMC1cXFxcdWZmZmZdXCIsICdnJyk7XG4gIHZhciBlc2NhcGVDaGFyYWN0ZXJzID0ge1xuICAgICdcXGInOiAnXFxcXGInLFxuICAgICdcXHQnOiAnXFxcXHQnLFxuICAgICdcXG4nOiAnXFxcXG4nLFxuICAgICdcXGYnOiAnXFxcXGYnLFxuICAgICdcXHInOiAnXFxcXHInLFxuICAgIFwiJ1wiOiBcIlxcXFwnXCIsXG4gICAgJ1xcXFwnOiAnXFxcXFxcXFwnXG4gIH07XG4gIHZhciBoZXggPSAxNjtcbiAgdmFyIHVuaWNvZGVMZW5ndGggPSA0O1xuXG4gIGZ1bmN0aW9uIGVzY2FwZShjaGFyKSB7XG4gICAgcmV0dXJuIGVzY2FwZUNoYXJhY3RlcnNbY2hhcl0gfHwgXCJcXFxcdVwiLmNvbmNhdChcIjAwMDBcIi5jb25jYXQoY2hhci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKGhleCkpLnNsaWNlKC11bmljb2RlTGVuZ3RoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0cmluZywgb3B0aW9ucykge1xuICAgIGlmIChzdHJpbmdFc2NhcGVDaGFycy50ZXN0KHN0cmluZykpIHtcbiAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHN0cmluZ0VzY2FwZUNoYXJzLCBlc2NhcGUpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCInXCIuY29uY2F0KHRydW5jYXRlKHN0cmluZywgb3B0aW9ucy50cnVuY2F0ZSAtIDIpLCBcIidcIiksICdzdHJpbmcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3RTeW1ib2wodmFsdWUpIHtcbiAgICBpZiAoJ2Rlc2NyaXB0aW9uJyBpbiBTeW1ib2wucHJvdG90eXBlKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZGVzY3JpcHRpb24gPyBcIlN5bWJvbChcIi5jb25jYXQodmFsdWUuZGVzY3JpcHRpb24sIFwiKVwiKSA6ICdTeW1ib2woKSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cblxuICB2YXIgZ2V0UHJvbWlzZVZhbHVlID0gZnVuY3Rpb24gZ2V0UHJvbWlzZVZhbHVlKCkge1xuICAgIHJldHVybiAnUHJvbWlzZXtcdTIwMjZ9JztcbiAgfTtcblxuICB0cnkge1xuICAgIHZhciBfcHJvY2VzcyRiaW5kaW5nID0gcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyksXG4gICAgICAgIGdldFByb21pc2VEZXRhaWxzID0gX3Byb2Nlc3MkYmluZGluZy5nZXRQcm9taXNlRGV0YWlscyxcbiAgICAgICAga1BlbmRpbmcgPSBfcHJvY2VzcyRiaW5kaW5nLmtQZW5kaW5nLFxuICAgICAgICBrUmVqZWN0ZWQgPSBfcHJvY2VzcyRiaW5kaW5nLmtSZWplY3RlZDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGdldFByb21pc2VEZXRhaWxzKFByb21pc2UucmVzb2x2ZSgpKSkpIHtcbiAgICAgIGdldFByb21pc2VWYWx1ZSA9IGZ1bmN0aW9uIGdldFByb21pc2VWYWx1ZSh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2dldFByb21pc2VEZXRhaWxzID0gZ2V0UHJvbWlzZURldGFpbHModmFsdWUpLFxuICAgICAgICAgICAgX2dldFByb21pc2VEZXRhaWxzMiA9IF9zbGljZWRUb0FycmF5KF9nZXRQcm9taXNlRGV0YWlscywgMiksXG4gICAgICAgICAgICBzdGF0ZSA9IF9nZXRQcm9taXNlRGV0YWlsczJbMF0sXG4gICAgICAgICAgICBpbm5lclZhbHVlID0gX2dldFByb21pc2VEZXRhaWxzMlsxXTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IGtQZW5kaW5nKSB7XG4gICAgICAgICAgcmV0dXJuICdQcm9taXNlezxwZW5kaW5nPn0nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiUHJvbWlzZVwiLmNvbmNhdChzdGF0ZSA9PT0ga1JlamVjdGVkID8gJyEnIDogJycsIFwie1wiKS5jb25jYXQob3B0aW9ucy5pbnNwZWN0KGlubmVyVmFsdWUsIG9wdGlvbnMpLCBcIn1cIik7XG4gICAgICB9O1xuICAgIH1cbiAgfSBjYXRjaCAobm90Tm9kZSkge1xuICAgIC8qIGlnbm9yZSAqL1xuICB9XG5cbiAgdmFyIGluc3BlY3RQcm9taXNlID0gZ2V0UHJvbWlzZVZhbHVlO1xuXG4gIGZ1bmN0aW9uIGluc3BlY3RPYmplY3Qob2JqZWN0LCBvcHRpb25zKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmplY3QpO1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KSA6IFtdO1xuXG4gICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID09PSAwICYmIHN5bWJvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ3t9JztcbiAgICB9XG5cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gICAgb3B0aW9ucy5zZWVuID0gb3B0aW9ucy5zZWVuIHx8IFtdO1xuXG4gICAgaWYgKG9wdGlvbnMuc2Vlbi5pbmRleE9mKG9iamVjdCkgPj0gMCkge1xuICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBvcHRpb25zLnNlZW4ucHVzaChvYmplY3QpO1xuICAgIHZhciBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgICB2YXIgc3ltYm9sQ29udGVudHMgPSBpbnNwZWN0TGlzdChzeW1ib2xzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIG9wdGlvbnMuc2Vlbi5wb3AoKTtcbiAgICB2YXIgc2VwID0gJyc7XG5cbiAgICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgICAgc2VwID0gJywgJztcbiAgICB9XG5cbiAgICByZXR1cm4gXCJ7IFwiLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzKS5jb25jYXQoc2VwKS5jb25jYXQoc3ltYm9sQ29udGVudHMsIFwiIH1cIik7XG4gIH1cblxuICB2YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiBmYWxzZTtcbiAgZnVuY3Rpb24gaW5zcGVjdENsYXNzKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgdmFyIG5hbWUgPSAnJztcblxuICAgIGlmICh0b1N0cmluZ1RhZyAmJiB0b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgICAgbmFtZSA9IHZhbHVlW3RvU3RyaW5nVGFnXTtcbiAgICB9XG5cbiAgICBuYW1lID0gbmFtZSB8fCBnZXRGdW5jTmFtZV8xKHZhbHVlLmNvbnN0cnVjdG9yKTsgLy8gQmFiZWwgdHJhbnNmb3JtcyBhbm9ueW1vdXMgY2xhc3NlcyB0byB0aGUgbmFtZSBgX2NsYXNzYFxuXG4gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT09ICdfY2xhc3MnKSB7XG4gICAgICBuYW1lID0gJzxBbm9ueW1vdXMgQ2xhc3M+JztcbiAgICB9XG5cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChuYW1lKS5jb25jYXQoaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucykpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdEFyZ3VtZW50cyhhcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gJ0FyZ3VtZW50c1tdJztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDEzO1xuICAgIHJldHVybiBcIkFyZ3VtZW50c1sgXCIuY29uY2F0KGluc3BlY3RMaXN0KGFyZ3MsIG9wdGlvbnMpLCBcIiBdXCIpO1xuICB9XG5cbiAgdmFyIGVycm9yS2V5cyA9IFsnc3RhY2snLCAnbGluZScsICdjb2x1bW4nLCAnbmFtZScsICdtZXNzYWdlJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnY29sdW1uTnVtYmVyJywgJ251bWJlcicsICdkZXNjcmlwdGlvbiddO1xuICBmdW5jdGlvbiBpbnNwZWN0T2JqZWN0JDEoZXJyb3IsIG9wdGlvbnMpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIGVycm9yS2V5cy5pbmRleE9mKGtleSkgPT09IC0xO1xuICAgIH0pO1xuICAgIHZhciBuYW1lID0gZXJyb3IubmFtZTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoO1xuICAgIHZhciBtZXNzYWdlID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlID0gdHJ1bmNhdGUoZXJyb3IubWVzc2FnZSwgb3B0aW9ucy50cnVuY2F0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BlcnRpZXMudW5zaGlmdCgnbWVzc2FnZScpO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlID8gXCI6IFwiLmNvbmNhdChtZXNzYWdlKSA6ICcnO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbWVzc2FnZS5sZW5ndGggKyA1O1xuICAgIHZhciBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIGVycm9yW2tleV1dO1xuICAgIH0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChuYW1lKS5jb25jYXQobWVzc2FnZSkuY29uY2F0KHByb3BlcnR5Q29udGVudHMgPyBcIiB7IFwiLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzLCBcIiB9XCIpIDogJycpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zcGVjdEF0dHJpYnV0ZShfcmVmLCBvcHRpb25zKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIGtleSA9IF9yZWYyWzBdLFxuICAgICAgICB2YWx1ZSA9IF9yZWYyWzFdO1xuXG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSAzO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KG9wdGlvbnMuc3R5bGl6ZShrZXksICd5ZWxsb3cnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KG9wdGlvbnMuc3R5bGl6ZShrZXksICd5ZWxsb3cnKSwgXCI9XCIpLmNvbmNhdChvcHRpb25zLnN0eWxpemUoXCJcXFwiXCIuY29uY2F0KHZhbHVlLCBcIlxcXCJcIiksICdzdHJpbmcnKSk7XG4gIH1cbiAgZnVuY3Rpb24gaW5zcGVjdEhUTUxDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdEhUTUwsICdcXG4nKTtcbiAgfVxuICBmdW5jdGlvbiBpbnNwZWN0SFRNTChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgdmFyIG5hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgaGVhZCA9IG9wdGlvbnMuc3R5bGl6ZShcIjxcIi5jb25jYXQobmFtZSksICdzcGVjaWFsJyk7XG4gICAgdmFyIGhlYWRDbG9zZSA9IG9wdGlvbnMuc3R5bGl6ZShcIj5cIiwgJ3NwZWNpYWwnKTtcbiAgICB2YXIgdGFpbCA9IG9wdGlvbnMuc3R5bGl6ZShcIjwvXCIuY29uY2F0KG5hbWUsIFwiPlwiKSwgJ3NwZWNpYWwnKTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoICogMiArIDU7XG4gICAgdmFyIHByb3BlcnR5Q29udGVudHMgPSAnJztcblxuICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb3BlcnR5Q29udGVudHMgKz0gJyAnO1xuICAgICAgcHJvcGVydHlDb250ZW50cyArPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBba2V5LCBlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpXTtcbiAgICAgIH0pLCBvcHRpb25zLCBpbnNwZWN0QXR0cmlidXRlLCAnICcpO1xuICAgIH1cblxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gcHJvcGVydHlDb250ZW50cy5sZW5ndGg7XG4gICAgdmFyIHRydW5jYXRlID0gb3B0aW9ucy50cnVuY2F0ZTtcbiAgICB2YXIgY2hpbGRyZW4gPSBpbnNwZWN0SFRNTENvbGxlY3Rpb24oZWxlbWVudC5jaGlsZHJlbiwgb3B0aW9ucyk7XG5cbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gdHJ1bmNhdGUpIHtcbiAgICAgIGNoaWxkcmVuID0gXCJcIi5jb25jYXQodHJ1bmNhdG9yLCBcIihcIikuY29uY2F0KGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoLCBcIilcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCIuY29uY2F0KGhlYWQpLmNvbmNhdChwcm9wZXJ0eUNvbnRlbnRzKS5jb25jYXQoaGVhZENsb3NlKS5jb25jYXQoY2hpbGRyZW4pLmNvbmNhdCh0YWlsKTtcbiAgfVxuXG4gIHZhciBzeW1ib2xzU3VwcG9ydGVkID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLmZvciA9PT0gJ2Z1bmN0aW9uJztcbiAgdmFyIGNoYWlJbnNwZWN0ID0gc3ltYm9sc1N1cHBvcnRlZCA/IFN5bWJvbC5mb3IoJ2NoYWkvaW5zcGVjdCcpIDogJ0BAY2hhaS9pbnNwZWN0JztcbiAgdmFyIG5vZGVJbnNwZWN0ID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICB2YXIgbm9kZVV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbiAgICBub2RlSW5zcGVjdCA9IG5vZGVVdGlsLmluc3BlY3QgPyBub2RlVXRpbC5pbnNwZWN0LmN1c3RvbSA6IGZhbHNlO1xuICB9IGNhdGNoIChub05vZGVJbnNwZWN0KSB7XG4gICAgbm9kZUluc3BlY3QgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBjb25zdHJ1Y3Rvck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciBzdHJpbmdUYWdNYXAgPSB7fTtcbiAgdmFyIGJhc2VUeXBlc01hcCA9IHtcbiAgICB1bmRlZmluZWQ6IGZ1bmN0aW9uIHVuZGVmaW5lZCQxKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gICAgfSxcbiAgICBudWxsOiBmdW5jdGlvbiBfbnVsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShudWxsLCAnbnVsbCcpO1xuICAgIH0sXG4gICAgYm9vbGVhbjogZnVuY3Rpb24gYm9vbGVhbih2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZSh2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgICB9LFxuICAgIEJvb2xlYW46IGZ1bmN0aW9uIEJvb2xlYW4odmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUodmFsdWUsICdib29sZWFuJyk7XG4gICAgfSxcbiAgICBudW1iZXI6IGluc3BlY3ROdW1iZXIsXG4gICAgTnVtYmVyOiBpbnNwZWN0TnVtYmVyLFxuICAgIGJpZ2ludDogaW5zcGVjdEJpZ0ludCxcbiAgICBCaWdJbnQ6IGluc3BlY3RCaWdJbnQsXG4gICAgc3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICAgIFN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgICBmdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICAgIEZ1bmN0aW9uOiBpbnNwZWN0RnVuY3Rpb24sXG4gICAgc3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICAgIC8vIEEgU3ltYm9sIHBvbHlmaWxsIHdpbGwgcmV0dXJuIGBTeW1ib2xgIG5vdCBgc3ltYm9sYCBmcm9tIHR5cGVkZXRlY3RcbiAgICBTeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gICAgQXJyYXk6IGluc3BlY3RBcnJheSxcbiAgICBEYXRlOiBpbnNwZWN0RGF0ZSxcbiAgICBNYXA6IGluc3BlY3RNYXAsXG4gICAgU2V0OiBpbnNwZWN0U2V0LFxuICAgIFJlZ0V4cDogaW5zcGVjdFJlZ0V4cCxcbiAgICBQcm9taXNlOiBpbnNwZWN0UHJvbWlzZSxcbiAgICAvLyBXZWFrU2V0LCBXZWFrTWFwIGFyZSB0b3RhbGx5IG9wYXF1ZSB0byB1c1xuICAgIFdlYWtTZXQ6IGZ1bmN0aW9uIFdlYWtTZXQodmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoJ1dlYWtTZXR7XHUyMDI2fScsICdzcGVjaWFsJyk7XG4gICAgfSxcbiAgICBXZWFrTWFwOiBmdW5jdGlvbiBXZWFrTWFwKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdXZWFrTWFwe1x1MjAyNn0nLCAnc3BlY2lhbCcpO1xuICAgIH0sXG4gICAgQXJndW1lbnRzOiBpbnNwZWN0QXJndW1lbnRzLFxuICAgIEludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgVWludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEludDE2QXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIFVpbnQxNkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBJbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBVaW50MzJBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgRmxvYXQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBGbG9hdDY0QXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEdlbmVyYXRvcjogZnVuY3Rpb24gR2VuZXJhdG9yKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0sXG4gICAgRGF0YVZpZXc6IGZ1bmN0aW9uIERhdGFWaWV3KCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0sXG4gICAgQXJyYXlCdWZmZXI6IGZ1bmN0aW9uIEFycmF5QnVmZmVyKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0sXG4gICAgRXJyb3I6IGluc3BlY3RPYmplY3QkMSxcbiAgICBIVE1MQ29sbGVjdGlvbjogaW5zcGVjdEhUTUxDb2xsZWN0aW9uLFxuICAgIE5vZGVMaXN0OiBpbnNwZWN0SFRNTENvbGxlY3Rpb25cbiAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuICB2YXIgaW5zcGVjdEN1c3RvbSA9IGZ1bmN0aW9uIGluc3BlY3RDdXN0b20odmFsdWUsIG9wdGlvbnMsIHR5cGUpIHtcbiAgICBpZiAoY2hhaUluc3BlY3QgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlW2NoYWlJbnNwZWN0XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlW2NoYWlJbnNwZWN0XShvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZUluc3BlY3QgJiYgbm9kZUluc3BlY3QgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlW25vZGVJbnNwZWN0XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlW25vZGVJbnNwZWN0XShvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoJ2luc3BlY3QnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaW5zcGVjdChvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoJ2NvbnN0cnVjdG9yJyBpbiB2YWx1ZSAmJiBjb25zdHJ1Y3Rvck1hcC5oYXModmFsdWUuY29uc3RydWN0b3IpKSB7XG4gICAgICByZXR1cm4gY29uc3RydWN0b3JNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHN0cmluZ1RhZ01hcFt0eXBlXSkge1xuICAgICAgcmV0dXJuIHN0cmluZ1RhZ01hcFt0eXBlXSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIHZhciB0b1N0cmluZyQxID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG5vcm1hbGlzZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgb3B0aW9ucy5pbnNwZWN0ID0gaW5zcGVjdDtcbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICBjdXN0b21JbnNwZWN0ID0gX29wdGlvbnMuY3VzdG9tSW5zcGVjdDtcbiAgICB2YXIgdHlwZSA9IHZhbHVlID09PSBudWxsID8gJ251bGwnIDogX3R5cGVvZih2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHR5cGUgPSB0b1N0cmluZyQxLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKTtcbiAgICB9IC8vIElmIGl0IGlzIGEgYmFzZSB2YWx1ZSB0aGF0IHdlIGFscmVhZHkgc3VwcG9ydCwgdGhlbiB1c2UgTG91cGUncyBpbnNwZWN0b3JcblxuXG4gICAgaWYgKGJhc2VUeXBlc01hcFt0eXBlXSkge1xuICAgICAgcmV0dXJuIGJhc2VUeXBlc01hcFt0eXBlXSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfSAvLyBJZiBgb3B0aW9ucy5jdXN0b21JbnNwZWN0YCBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHRyeSB0byB1c2UgdGhlIGN1c3RvbSBpbnNwZWN0b3JcblxuXG4gICAgaWYgKGN1c3RvbUluc3BlY3QgJiYgdmFsdWUpIHtcbiAgICAgIHZhciBvdXRwdXQgPSBpbnNwZWN0Q3VzdG9tKHZhbHVlLCBvcHRpb25zLCB0eXBlKTtcblxuICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIHJldHVybiBpbnNwZWN0KG91dHB1dCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gdmFsdWUgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpIDogZmFsc2U7IC8vIElmIGl0J3MgYSBwbGFpbiBPYmplY3QgdGhlbiB1c2UgTG91cGUncyBpbnNwZWN0b3JcblxuICAgIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGluc3BlY3RPYmplY3QodmFsdWUsIG9wdGlvbnMpO1xuICAgIH0gLy8gU3BlY2lmaWNhbGx5IGFjY291bnQgZm9yIEhUTUxFbGVtZW50c1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBpbnNwZWN0SFRNTCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKCdjb25zdHJ1Y3RvcicgaW4gdmFsdWUpIHtcbiAgICAgIC8vIElmIGl0IGlzIGEgY2xhc3MsIGluc3BlY3QgaXQgbGlrZSBhbiBvYmplY3QgYnV0IGFkZCB0aGUgY29uc3RydWN0b3IgbmFtZVxuICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICB9IC8vIElmIGl0IGlzIGFuIG9iamVjdCB3aXRoIGFuIGFub255bW91cyBwcm90b3R5cGUsIGRpc3BsYXkgaXQgYXMgYW4gb2JqZWN0LlxuXG5cbiAgICAgIHJldHVybiBpbnNwZWN0T2JqZWN0KHZhbHVlLCBvcHRpb25zKTtcbiAgICB9IC8vIGxhc3QgY2hhbmNlIHRvIGNoZWNrIGlmIGl0J3MgYW4gb2JqZWN0XG5cblxuICAgIGlmICh2YWx1ZSA9PT0gT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGluc3BlY3RPYmplY3QodmFsdWUsIG9wdGlvbnMpO1xuICAgIH0gLy8gV2UgaGF2ZSBydW4gb3V0IG9mIG9wdGlvbnMhIEp1c3Qgc3RyaW5naWZ5IHRoZSB2YWx1ZVxuXG5cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIHR5cGUpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyQ29uc3RydWN0b3IoY29uc3RydWN0b3IsIGluc3BlY3Rvcikge1xuICAgIGlmIChjb25zdHJ1Y3Rvck1hcC5oYXMoY29uc3RydWN0b3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3JNYXAuYWRkKGNvbnN0cnVjdG9yLCBpbnNwZWN0b3IpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU3RyaW5nVGFnKHN0cmluZ1RhZywgaW5zcGVjdG9yKSB7XG4gICAgaWYgKHN0cmluZ1RhZyBpbiBzdHJpbmdUYWdNYXApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdHJpbmdUYWdNYXBbc3RyaW5nVGFnXSA9IGluc3BlY3RvcjtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgY3VzdG9tID0gY2hhaUluc3BlY3Q7XG5cbiAgZXhwb3J0cy5jdXN0b20gPSBjdXN0b207XG4gIGV4cG9ydHMuZGVmYXVsdCA9IGluc3BlY3Q7XG4gIGV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG4gIGV4cG9ydHMucmVnaXN0ZXJDb25zdHJ1Y3RvciA9IHJlZ2lzdGVyQ29uc3RydWN0b3I7XG4gIGV4cG9ydHMucmVnaXN0ZXJTdHJpbmdUYWcgPSByZWdpc3RlclN0cmluZ1RhZztcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwgIm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmluY2x1ZGVTdGFja1xuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgaW5mbHVlbmNlcyB3aGV0aGVyIHN0YWNrIHRyYWNlXG4gICAqIGlzIGluY2x1ZGVkIGluIEFzc2VydGlvbiBlcnJvciBtZXNzYWdlLiBEZWZhdWx0IG9mIGZhbHNlXG4gICAqIHN1cHByZXNzZXMgc3RhY2sgdHJhY2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgPSB0cnVlOyAgLy8gZW5hYmxlIHN0YWNrIG9uIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgaW5jbHVkZVN0YWNrOiBmYWxzZSxcblxuICAvKipcbiAgICogIyMjIGNvbmZpZy5zaG93RGlmZlxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgaW5mbHVlbmNlcyB3aGV0aGVyIG9yIG5vdFxuICAgKiB0aGUgYHNob3dEaWZmYCBmbGFnIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgdGhyb3duXG4gICAqIEFzc2VydGlvbkVycm9ycy4gYGZhbHNlYCB3aWxsIGFsd2F5cyBiZSBgZmFsc2VgOyBgdHJ1ZWBcbiAgICogd2lsbCBiZSB0cnVlIHdoZW4gdGhlIGFzc2VydGlvbiBoYXMgcmVxdWVzdGVkIGEgZGlmZlxuICAgKiBiZSBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBzaG93RGlmZjogdHJ1ZSxcblxuICAvKipcbiAgICogIyMjIGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZFxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgc2V0cyBsZW5ndGggdGhyZXNob2xkIGZvciBhY3R1YWwgYW5kXG4gICAqIGV4cGVjdGVkIHZhbHVlcyBpbiBhc3NlcnRpb24gZXJyb3JzLiBJZiB0aGlzIHRocmVzaG9sZCBpcyBleGNlZWRlZCwgZm9yXG4gICAqIGV4YW1wbGUgZm9yIGxhcmdlIGRhdGEgc3RydWN0dXJlcywgdGhlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nXG4gICAqIGxpa2UgYFsgQXJyYXkoMykgXWAgb3IgYHsgT2JqZWN0IChwcm9wMSwgcHJvcDIpIH1gLlxuICAgKlxuICAgKiBTZXQgaXQgdG8gemVybyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRydW5jYXRpbmcgYWx0b2dldGhlci5cbiAgICpcbiAgICogVGhpcyBpcyBlc3BlY2lhbGx5IHVzZXJmdWwgd2hlbiBkb2luZyBhc3NlcnRpb25zIG9uIGFycmF5czogaGF2aW5nIHRoaXNcbiAgICogc2V0IHRvIGEgcmVhc29uYWJsZSBsYXJnZSB2YWx1ZSBtYWtlcyB0aGUgZmFpbHVyZSBtZXNzYWdlcyByZWFkaWx5XG4gICAqIGluc3BlY3RhYmxlLlxuICAgKlxuICAgKiAgICAgY2hhaS5jb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgPSAwOyAgLy8gZGlzYWJsZSB0cnVuY2F0aW5nXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB0cnVuY2F0ZVRocmVzaG9sZDogNDAsXG5cbiAgLyoqXG4gICAqICMjIyBjb25maWcudXNlUHJveHlcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgaWYgY2hhaSB3aWxsIHVzZSBhIFByb3h5IHRvIHRocm93XG4gICAqIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnQgcHJvcGVydHkgaXMgcmVhZCwgd2hpY2ggcHJvdGVjdHMgdXNlcnNcbiAgICogZnJvbSB0eXBvcyB3aGVuIHVzaW5nIHByb3BlcnR5LWJhc2VkIGFzc2VydGlvbnMuXG4gICAqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cbiAgICpcbiAgICogICAgIGNoYWkuY29uZmlnLnVzZVByb3h5ID0gZmFsc2U7ICAvLyBkaXNhYmxlIHVzZSBvZiBQcm94eVxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlnIHZhbHVlXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IGRvbid0IHN1cHBvcnQgcHJveGllcy5cbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICB1c2VQcm94eTogdHJ1ZSxcblxuICAvKipcbiAgICogIyMjIGNvbmZpZy5wcm94eUV4Y2x1ZGVkS2V5c1xuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgZGVmaW5lcyB3aGljaCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlIGFzc2VydGlvbi5cbiAgICogVGhpcyBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIGVudmlyb25tZW50IENoYWkgaXMgcnVubmluZyBpbiBzdXBwb3J0cyBwcm94aWVzIGFuZFxuICAgKiBpZiB0aGUgYHVzZVByb3h5YCBjb25maWd1cmF0aW9uIHNldHRpbmcgaXMgZW5hYmxlZC5cbiAgICogQnkgZGVmYXVsdCwgYHRoZW5gIGFuZCBgaW5zcGVjdGAgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlXG4gICAqIGFzc2VydGlvbiBvYmplY3QgYmVjYXVzZSB0aGUgYC5pbnNwZWN0YCBwcm9wZXJ0eSBpcyByZWFkIGJ5IGB1dGlsLmluc3BlY3RgIChmb3IgZXhhbXBsZSwgd2hlblxuICAgKiB1c2luZyBgY29uc29sZS5sb2dgIG9uIHRoZSBhc3NlcnRpb24gb2JqZWN0KSBhbmQgYC50aGVuYCBpcyBuZWNlc3NhcnkgZm9yIHByb21pc2UgdHlwZS1jaGVja2luZy5cbiAgICpcbiAgICogICAgIC8vIEJ5IGRlZmF1bHQgdGhlc2Uga2V5cyB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciBpZiB0aGV5IGRvIG5vdCBleGlzdCBvbiB0aGUgYXNzZXJ0aW9uIG9iamVjdFxuICAgKiAgICAgY2hhaS5jb25maWcucHJveHlFeGNsdWRlZEtleXMgPSBbJ3RoZW4nLCAnaW5zcGVjdCddO1xuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBwcm94eUV4Y2x1ZGVkS2V5czogWyd0aGVuJywgJ2NhdGNoJywgJ2luc3BlY3QnLCAndG9KU09OJ11cbn07XG4iLCAiLy8gVGhpcyBpcyAoYWxtb3N0KSBkaXJlY3RseSBmcm9tIE5vZGUuanMgdXRpbHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9ibG9iL2Y4YzMzNWQwY2FmNDdmMTZkMzE0MTNmODlhYTI4ZWRhMzg3OGUzYWEvbGliL3V0aWwuanNcblxudmFyIGdldE5hbWUgPSByZXF1aXJlKCdnZXQtZnVuYy1uYW1lJyk7XG52YXIgbG91cGUgPSByZXF1aXJlKCdsb3VwZScpO1xudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluc3BlY3Q7XG5cbi8qKlxuICogIyMjIC5pbnNwZWN0KG9iaiwgW3Nob3dIaWRkZW5dLCBbZGVwdGhdLCBbY29sb3JzXSlcbiAqXG4gKiBFY2hvZXMgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyaWVzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNob3dIaWRkZW4gRmxhZyB0aGF0IHNob3dzIGhpZGRlbiAobm90IGVudW1lcmFibGUpXG4gKiAgICBwcm9wZXJ0aWVzIG9mIG9iamVjdHMuIERlZmF1bHQgaXMgZmFsc2UuXG4gKiBAcGFyYW0ge051bWJlcn0gZGVwdGggRGVwdGggaW4gd2hpY2ggdG8gZGVzY2VuZCBpbiBvYmplY3QuIERlZmF1bHQgaXMgMi5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gY29sb3JzIEZsYWcgdG8gdHVybiBvbiBBTlNJIGVzY2FwZSBjb2RlcyB0byBjb2xvciB0aGVcbiAqICAgIG91dHB1dC4gRGVmYXVsdCBpcyBmYWxzZSAobm8gY29sb3JpbmcpLlxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgaW5zcGVjdFxuICovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycykge1xuICB2YXIgb3B0aW9ucyA9IHtcbiAgICBjb2xvcnM6IGNvbG9ycyxcbiAgICBkZXB0aDogKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcgPyAyIDogZGVwdGgpLFxuICAgIHNob3dIaWRkZW46IHNob3dIaWRkZW4sXG4gICAgdHJ1bmNhdGU6IGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA/IGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA6IEluZmluaXR5LFxuICB9O1xuICByZXR1cm4gbG91cGUuaW5zcGVjdChvYmosIG9wdGlvbnMpO1xufVxuIiwgIi8qIVxuICogQ2hhaSAtIGZsYWcgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qIVxuICogTW9kdWxlIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnLi9pbnNwZWN0Jyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cbi8qKlxuICogIyMjIC5vYmpEaXNwbGF5KG9iamVjdClcbiAqXG4gKiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBvciBhbiBhcnJheSBtYXRjaGVzXG4gKiBjcml0ZXJpYSB0byBiZSBpbnNwZWN0ZWQgaW4tbGluZSBmb3IgZXJyb3JcbiAqIG1lc3NhZ2VzIG9yIHNob3VsZCBiZSB0cnVuY2F0ZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gamF2YXNjcmlwdCBvYmplY3QgdG8gaW5zcGVjdFxuICogQG5hbWUgb2JqRGlzcGxheVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9iakRpc3BsYXkob2JqKSB7XG4gIHZhciBzdHIgPSBpbnNwZWN0KG9iailcbiAgICAsIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcblxuICBpZiAoY29uZmlnLnRydW5jYXRlVGhyZXNob2xkICYmIHN0ci5sZW5ndGggPj0gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkKSB7XG4gICAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScpIHtcbiAgICAgIHJldHVybiAhb2JqLm5hbWUgfHwgb2JqLm5hbWUgPT09ICcnXG4gICAgICAgID8gJ1tGdW5jdGlvbl0nXG4gICAgICAgIDogJ1tGdW5jdGlvbjogJyArIG9iai5uYW1lICsgJ10nO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgcmV0dXJuICdbIEFycmF5KCcgKyBvYmoubGVuZ3RoICsgJykgXSc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICwga3N0ciA9IGtleXMubGVuZ3RoID4gMlxuICAgICAgICAgID8ga2V5cy5zcGxpY2UoMCwgMikuam9pbignLCAnKSArICcsIC4uLidcbiAgICAgICAgICA6IGtleXMuam9pbignLCAnKTtcbiAgICAgIHJldHVybiAneyBPYmplY3QgKCcgKyBrc3RyICsgJykgfSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gbWVzc2FnZSBjb21wb3NpdGlvbiB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKVxuICAsIGdldEFjdHVhbCA9IHJlcXVpcmUoJy4vZ2V0QWN0dWFsJylcbiAgLCBvYmpEaXNwbGF5ID0gcmVxdWlyZSgnLi9vYmpEaXNwbGF5Jyk7XG5cbi8qKlxuICogIyMjIC5nZXRNZXNzYWdlKG9iamVjdCwgbWVzc2FnZSwgbmVnYXRlTWVzc2FnZSlcbiAqXG4gKiBDb25zdHJ1Y3QgdGhlIGVycm9yIG1lc3NhZ2UgYmFzZWQgb24gZmxhZ3NcbiAqIGFuZCB0ZW1wbGF0ZSB0YWdzLiBUZW1wbGF0ZSB0YWdzIHdpbGwgcmV0dXJuXG4gKiBhIHN0cmluZ2lmaWVkIGluc3BlY3Rpb24gb2YgdGhlIG9iamVjdCByZWZlcmVuY2VkLlxuICpcbiAqIE1lc3NhZ2UgdGVtcGxhdGUgdGFnczpcbiAqIC0gYCN7dGhpc31gIGN1cnJlbnQgYXNzZXJ0ZWQgb2JqZWN0XG4gKiAtIGAje2FjdH1gIGFjdHVhbCB2YWx1ZVxuICogLSBgI3tleHB9YCBleHBlY3RlZCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgKGNvbnN0cnVjdGVkIEFzc2VydGlvbilcbiAqIEBwYXJhbSB7QXJndW1lbnRzfSBjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUuYXNzZXJ0IGFyZ3VtZW50c1xuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0TWVzc2FnZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE1lc3NhZ2Uob2JqLCBhcmdzKSB7XG4gIHZhciBuZWdhdGUgPSBmbGFnKG9iaiwgJ25lZ2F0ZScpXG4gICAgLCB2YWwgPSBmbGFnKG9iaiwgJ29iamVjdCcpXG4gICAgLCBleHBlY3RlZCA9IGFyZ3NbM11cbiAgICAsIGFjdHVhbCA9IGdldEFjdHVhbChvYmosIGFyZ3MpXG4gICAgLCBtc2cgPSBuZWdhdGUgPyBhcmdzWzJdIDogYXJnc1sxXVxuICAgICwgZmxhZ01zZyA9IGZsYWcob2JqLCAnbWVzc2FnZScpO1xuXG4gIGlmKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIikgbXNnID0gbXNnKCk7XG4gIG1zZyA9IG1zZyB8fCAnJztcbiAgbXNnID0gbXNnXG4gICAgLnJlcGxhY2UoLyNcXHt0aGlzXFx9L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9iakRpc3BsYXkodmFsKTsgfSlcbiAgICAucmVwbGFjZSgvI1xce2FjdFxcfS9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBvYmpEaXNwbGF5KGFjdHVhbCk7IH0pXG4gICAgLnJlcGxhY2UoLyNcXHtleHBcXH0vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JqRGlzcGxheShleHBlY3RlZCk7IH0pO1xuXG4gIHJldHVybiBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgKyBtc2cgOiBtc2c7XG59O1xuIiwgIi8qIVxuICogQ2hhaSAtIHRyYW5zZmVyRmxhZ3MgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC50cmFuc2ZlckZsYWdzKGFzc2VydGlvbiwgb2JqZWN0LCBpbmNsdWRlQWxsID0gdHJ1ZSlcbiAqXG4gKiBUcmFuc2ZlciBhbGwgdGhlIGZsYWdzIGZvciBgYXNzZXJ0aW9uYCB0byBgb2JqZWN0YC4gSWZcbiAqIGBpbmNsdWRlQWxsYCBpcyBzZXQgdG8gYGZhbHNlYCwgdGhlbiB0aGUgYmFzZSBDaGFpXG4gKiBhc3NlcnRpb24gZmxhZ3MgKG5hbWVseSBgb2JqZWN0YCwgYHNzZmlgLCBgbG9ja1NzZmlgLFxuICogYW5kIGBtZXNzYWdlYCkgd2lsbCBub3QgYmUgdHJhbnNmZXJyZWQuXG4gKlxuICpcbiAqICAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICogICAgIHV0aWxzLnRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBuZXdBc3NlcnRpb24pO1xuICpcbiAqICAgICB2YXIgYW5vdGhlckFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24obXlPYmopO1xuICogICAgIHV0aWxzLnRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBhbm90aGVyQXNzZXJ0aW9uLCBmYWxzZSk7XG4gKlxuICogQHBhcmFtIHtBc3NlcnRpb259IGFzc2VydGlvbiB0aGUgYXNzZXJ0aW9uIHRvIHRyYW5zZmVyIHRoZSBmbGFncyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRoZSBvYmplY3QgdG8gdHJhbnNmZXIgdGhlIGZsYWdzIHRvOyB1c3VhbGx5IGEgbmV3IGFzc2VydGlvblxuICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlQWxsXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSB0cmFuc2ZlckZsYWdzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBvYmplY3QsIGluY2x1ZGVBbGwpIHtcbiAgdmFyIGZsYWdzID0gYXNzZXJ0aW9uLl9fZmxhZ3MgfHwgKGFzc2VydGlvbi5fX2ZsYWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbiAgaWYgKCFvYmplY3QuX19mbGFncykge1xuICAgIG9iamVjdC5fX2ZsYWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIGluY2x1ZGVBbGwgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gaW5jbHVkZUFsbCA6IHRydWU7XG5cbiAgZm9yICh2YXIgZmxhZyBpbiBmbGFncykge1xuICAgIGlmIChpbmNsdWRlQWxsIHx8XG4gICAgICAgIChmbGFnICE9PSAnb2JqZWN0JyAmJiBmbGFnICE9PSAnc3NmaScgJiYgZmxhZyAhPT0gJ2xvY2tTc2ZpJyAmJiBmbGFnICE9ICdtZXNzYWdlJykpIHtcbiAgICAgIG9iamVjdC5fX2ZsYWdzW2ZsYWddID0gZmxhZ3NbZmxhZ107XG4gICAgfVxuICB9XG59O1xuIiwgIid1c2Ugc3RyaWN0Jztcbi8qIGdsb2JhbHMgU3ltYm9sOiBmYWxzZSwgVWludDhBcnJheTogZmFsc2UsIFdlYWtNYXA6IGZhbHNlICovXG4vKiFcbiAqIGRlZXAtZXFsXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciB0eXBlID0gcmVxdWlyZSgndHlwZS1kZXRlY3QnKTtcbmZ1bmN0aW9uIEZha2VNYXAoKSB7XG4gIHRoaXMuX2tleSA9ICdjaGFpL2RlZXAtZXFsX18nICsgTWF0aC5yYW5kb20oKSArIERhdGUubm93KCk7XG59XG5cbkZha2VNYXAucHJvdG90eXBlID0ge1xuICBnZXQ6IGZ1bmN0aW9uIGdldE1hcChrZXkpIHtcbiAgICByZXR1cm4ga2V5W3RoaXMuX2tleV07XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gc2V0TWFwKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoa2V5LCB0aGlzLl9rZXksIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG59O1xuXG52YXIgTWVtb2l6ZU1hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IEZha2VNYXA7XG4vKiFcbiAqIENoZWNrIHRvIHNlZSBpZiB0aGUgTWVtb2l6ZU1hcCBoYXMgcmVjb3JkZWQgYSByZXN1bHQgb2YgdGhlIHR3byBvcGVyYW5kc1xuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNZW1vaXplTWFwfSBtZW1vaXplTWFwXG4gKiBAcmV0dXJucyB7Qm9vbGVhbnxudWxsfSByZXN1bHRcbiovXG5mdW5jdGlvbiBtZW1vaXplQ29tcGFyZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG1lbW9pemVNYXApIHtcbiAgLy8gVGVjaG5pY2FsbHksIFdlYWtNYXAga2V5cyBjYW4gKm9ubHkqIGJlIG9iamVjdHMsIG5vdCBwcmltaXRpdmVzLlxuICBpZiAoIW1lbW9pemVNYXAgfHwgaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsZWZ0SGFuZE1hcCA9IG1lbW9pemVNYXAuZ2V0KGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZE1hcCkge1xuICAgIHZhciByZXN1bHQgPSBsZWZ0SGFuZE1hcC5nZXQocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qIVxuICogU2V0IHRoZSByZXN1bHQgb2YgdGhlIGVxdWFsaXR5IGludG8gdGhlIE1lbW9pemVNYXBcbiAqXG4gKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWl4ZWR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWVtb2l6ZU1hcH0gbWVtb2l6ZU1hcFxuICogQHBhcmFtIHtCb29sZWFufSByZXN1bHRcbiovXG5mdW5jdGlvbiBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCwgcmVzdWx0KSB7XG4gIC8vIFRlY2huaWNhbGx5LCBXZWFrTWFwIGtleXMgY2FuICpvbmx5KiBiZSBvYmplY3RzLCBub3QgcHJpbWl0aXZlcy5cbiAgaWYgKCFtZW1vaXplTWFwIHx8IGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxlZnRIYW5kTWFwID0gbWVtb2l6ZU1hcC5nZXQobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kTWFwKSB7XG4gICAgbGVmdEhhbmRNYXAuc2V0KHJpZ2h0SGFuZE9wZXJhbmQsIHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgbGVmdEhhbmRNYXAgPSBuZXcgTWVtb2l6ZU1hcCgpO1xuICAgIGxlZnRIYW5kTWFwLnNldChyaWdodEhhbmRPcGVyYW5kLCByZXN1bHQpO1xuICAgIG1lbW9pemVNYXAuc2V0KGxlZnRIYW5kT3BlcmFuZCwgbGVmdEhhbmRNYXApO1xuICB9XG59XG5cbi8qIVxuICogUHJpbWFyeSBFeHBvcnRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZXBFcXVhbDtcbm1vZHVsZS5leHBvcnRzLk1lbW9pemVNYXAgPSBNZW1vaXplTWFwO1xuXG4vKipcbiAqIEFzc2VydCBkZWVwbHkgbmVzdGVkIHNhbWVWYWx1ZSBlcXVhbGl0eSBiZXR3ZWVuIHR3byBvYmplY3RzIG9mIGFueSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAob3B0aW9uYWwpIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMuY29tcGFyYXRvcl0gKG9wdGlvbmFsKSBPdmVycmlkZSBkZWZhdWx0IGFsZ29yaXRobSwgZGV0ZXJtaW5pbmcgY3VzdG9tIGVxdWFsaXR5LlxuICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMubWVtb2l6ZV0gKG9wdGlvbmFsKSBQcm92aWRlIGEgY3VzdG9tIG1lbW9pemF0aW9uIG9iamVjdCB3aGljaCB3aWxsIGNhY2hlIHRoZSByZXN1bHRzIG9mXG4gICAgY29tcGxleCBvYmplY3RzIGZvciBhIHNwZWVkIGJvb3N0LiBCeSBwYXNzaW5nIGBmYWxzZWAgeW91IGNhbiBkaXNhYmxlIG1lbW9pemF0aW9uLCBidXQgdGhpcyB3aWxsIGNhdXNlIGNpcmN1bGFyXG4gICAgcmVmZXJlbmNlcyB0byBibG93IHRoZSBzdGFjay5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGVxdWFsIG1hdGNoXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgLy8gSWYgd2UgaGF2ZSBhIGNvbXBhcmF0b3IsIHdlIGNhbid0IGFzc3VtZSBhbnl0aGluZzsgc28gYmFpbCB0byBpdHMgY2hlY2sgZmlyc3QuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgIHJldHVybiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxuXG4gIHZhciBzaW1wbGVSZXN1bHQgPSBzaW1wbGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpO1xuICBpZiAoc2ltcGxlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHNpbXBsZVJlc3VsdDtcbiAgfVxuXG4gIC8vIERlZXBlciBjb21wYXJpc29ucyBhcmUgcHVzaGVkIHRocm91Z2ggdG8gYSBsYXJnZXIgZnVuY3Rpb25cbiAgcmV0dXJuIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIE1hbnkgY29tcGFyaXNvbnMgY2FuIGJlIGNhbmNlbGVkIG91dCBlYXJseSB2aWEgc2ltcGxlIGVxdWFsaXR5IG9yIHByaW1pdGl2ZSBjaGVja3MuXG4gKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWl4ZWR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEByZXR1cm4ge0Jvb2xlYW58bnVsbH0gZXF1YWwgbWF0Y2hcbiAqL1xuZnVuY3Rpb24gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKSB7XG4gIC8vIEVxdWFsIHJlZmVyZW5jZXMgKGV4Y2VwdCBmb3IgTnVtYmVycykgY2FuIGJlIHJldHVybmVkIGVhcmx5XG4gIGlmIChsZWZ0SGFuZE9wZXJhbmQgPT09IHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgICAvLyBIYW5kbGUgKy0wIGNhc2VzXG4gICAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZCAhPT0gMCB8fCAxIC8gbGVmdEhhbmRPcGVyYW5kID09PSAxIC8gcmlnaHRIYW5kT3BlcmFuZDtcbiAgfVxuXG4gIC8vIGhhbmRsZSBOYU4gY2FzZXNcbiAgaWYgKFxuICAgIGxlZnRIYW5kT3BlcmFuZCAhPT0gbGVmdEhhbmRPcGVyYW5kICYmIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmlnaHRIYW5kT3BlcmFuZCAhPT0gcmlnaHRIYW5kT3BlcmFuZCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEFueXRoaW5nIHRoYXQgaXMgbm90IGFuICdvYmplY3QnLCBpLmUuIHN5bWJvbHMsIGZ1bmN0aW9ucywgYm9vbGVhbnMsIG51bWJlcnMsXG4gIC8vIHN0cmluZ3MsIGFuZCB1bmRlZmluZWQsIGNhbiBiZSBjb21wYXJlZCBieSByZWZlcmVuY2UuXG4gIGlmIChpc1ByaW1pdGl2ZShsZWZ0SGFuZE9wZXJhbmQpIHx8IGlzUHJpbWl0aXZlKHJpZ2h0SGFuZE9wZXJhbmQpKSB7XG4gICAgLy8gRWFzeSBvdXQgYi9jIGl0IHdvdWxkIGhhdmUgcGFzc2VkIHRoZSBmaXJzdCBlcXVhbGl0eSBjaGVja1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyohXG4gKiBUaGUgbWFpbiBsb2dpYyBvZiB0aGUgYGRlZXBFcXVhbGAgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChvcHRpb25hbCkgQWRkaXRpb25hbCBvcHRpb25zXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5jb21wYXJhdG9yXSAob3B0aW9uYWwpIE92ZXJyaWRlIGRlZmF1bHQgYWxnb3JpdGhtLCBkZXRlcm1pbmluZyBjdXN0b20gZXF1YWxpdHkuXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5tZW1vaXplXSAob3B0aW9uYWwpIFByb3ZpZGUgYSBjdXN0b20gbWVtb2l6YXRpb24gb2JqZWN0IHdoaWNoIHdpbGwgY2FjaGUgdGhlIHJlc3VsdHMgb2ZcbiAgICBjb21wbGV4IG9iamVjdHMgZm9yIGEgc3BlZWQgYm9vc3QuIEJ5IHBhc3NpbmcgYGZhbHNlYCB5b3UgY2FuIGRpc2FibGUgbWVtb2l6YXRpb24sIGJ1dCB0aGlzIHdpbGwgY2F1c2UgY2lyY3VsYXJcbiAgICByZWZlcmVuY2VzIHRvIGJsb3cgdGhlIHN0YWNrLlxuICogQHJldHVybiB7Qm9vbGVhbn0gZXF1YWwgbWF0Y2hcbiovXG5mdW5jdGlvbiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLm1lbW9pemUgPSBvcHRpb25zLm1lbW9pemUgPT09IGZhbHNlID8gZmFsc2UgOiBvcHRpb25zLm1lbW9pemUgfHwgbmV3IE1lbW9pemVNYXAoKTtcbiAgdmFyIGNvbXBhcmF0b3IgPSBvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcjtcblxuICAvLyBDaGVjayBpZiBhIG1lbW9pemVkIHJlc3VsdCBleGlzdHMuXG4gIHZhciBtZW1vaXplUmVzdWx0TGVmdCA9IG1lbW9pemVDb21wYXJlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplKTtcbiAgaWYgKG1lbW9pemVSZXN1bHRMZWZ0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIG1lbW9pemVSZXN1bHRMZWZ0O1xuICB9XG4gIHZhciBtZW1vaXplUmVzdWx0UmlnaHQgPSBtZW1vaXplQ29tcGFyZShyaWdodEhhbmRPcGVyYW5kLCBsZWZ0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSk7XG4gIGlmIChtZW1vaXplUmVzdWx0UmlnaHQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVtb2l6ZVJlc3VsdFJpZ2h0O1xuICB9XG5cbiAgLy8gSWYgYSBjb21wYXJhdG9yIGlzIHByZXNlbnQsIHVzZSBpdC5cbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgY29tcGFyYXRvclJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICAvLyBDb21wYXJhdG9ycyBtYXkgcmV0dXJuIG51bGwsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBnbyBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgaWYgKGNvbXBhcmF0b3JSZXN1bHQgPT09IGZhbHNlIHx8IGNvbXBhcmF0b3JSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIGNvbXBhcmF0b3JSZXN1bHQpO1xuICAgICAgcmV0dXJuIGNvbXBhcmF0b3JSZXN1bHQ7XG4gICAgfVxuICAgIC8vIFRvIGFsbG93IGNvbXBhcmF0b3JzIHRvIG92ZXJyaWRlICphbnkqIGJlaGF2aW9yLCB3ZSByYW4gdGhlbSBmaXJzdC4gU2luY2UgaXQgZGlkbid0IGRlY2lkZVxuICAgIC8vIHdoYXQgdG8gZG8sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRvIHJldHVybiB0aGUgYmFzaWMgdGVzdHMgZmlyc3QgYmVmb3JlIHdlIG1vdmUgb24uXG4gICAgdmFyIHNpbXBsZVJlc3VsdCA9IHNpbXBsZUVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHNpbXBsZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgLy8gRG9uJ3QgbWVtb2l6ZSB0aGlzLCBpdCB0YWtlcyBsb25nZXIgdG8gc2V0L3JldHJpZXZlIHRoYW4gdG8ganVzdCBjb21wYXJlLlxuICAgICAgcmV0dXJuIHNpbXBsZVJlc3VsdDtcbiAgICB9XG4gIH1cblxuICB2YXIgbGVmdEhhbmRUeXBlID0gdHlwZShsZWZ0SGFuZE9wZXJhbmQpO1xuICBpZiAobGVmdEhhbmRUeXBlICE9PSB0eXBlKHJpZ2h0SGFuZE9wZXJhbmQpKSB7XG4gICAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgZmFsc2UpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlbXBvcmFyaWx5IHNldCB0aGUgb3BlcmFuZHMgaW4gdGhlIG1lbW9pemUgb2JqZWN0IHRvIHByZXZlbnQgYmxvd2luZyB0aGUgc3RhY2tcbiAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgdHJ1ZSk7XG5cbiAgdmFyIHJlc3VsdCA9IGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kVHlwZSwgb3B0aW9ucyk7XG4gIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kVHlwZSwgb3B0aW9ucykge1xuICBzd2l0Y2ggKGxlZnRIYW5kVHlwZSkge1xuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIC8vIElmIHRoZXNlIHR5cGVzIGFyZSB0aGVpciBpbnN0YW5jZSB0eXBlcyAoZS5nLiBgbmV3IE51bWJlcmApIHRoZW4gcmUtZGVlcEVxdWFsIGFnYWluc3QgdGhlaXIgdmFsdWVzXG4gICAgICByZXR1cm4gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZC52YWx1ZU9mKCksIHJpZ2h0SGFuZE9wZXJhbmQudmFsdWVPZigpKTtcbiAgICBjYXNlICdQcm9taXNlJzpcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICBjYXNlICdXZWFrTWFwJzpcbiAgICBjYXNlICdXZWFrU2V0JzpcbiAgICBjYXNlICdFcnJvcic6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kID09PSByaWdodEhhbmRPcGVyYW5kO1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgcmV0dXJuIHJlZ2V4cEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgY2FzZSAnR2VuZXJhdG9yJzpcbiAgICAgIHJldHVybiBnZW5lcmF0b3JFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICAgIGNhc2UgJ0RhdGFWaWV3JzpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZC5idWZmZXIpLCBuZXcgVWludDhBcnJheShyaWdodEhhbmRPcGVyYW5kLmJ1ZmZlciksIG9wdGlvbnMpO1xuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZCksIG5ldyBVaW50OEFycmF5KHJpZ2h0SGFuZE9wZXJhbmQpLCBvcHRpb25zKTtcbiAgICBjYXNlICdTZXQnOlxuICAgICAgcmV0dXJuIGVudHJpZXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvYmplY3RFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qIVxuICogQ29tcGFyZSB0d28gUmVndWxhciBFeHByZXNzaW9ucyBmb3IgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIHtSZWdFeHB9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtSZWdFeHB9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5cbmZ1bmN0aW9uIHJlZ2V4cEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCkge1xuICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kLnRvU3RyaW5nKCkgPT09IHJpZ2h0SGFuZE9wZXJhbmQudG9TdHJpbmcoKTtcbn1cblxuLyohXG4gKiBDb21wYXJlIHR3byBTZXRzL01hcHMgZm9yIGVxdWFsaXR5LiBGYXN0ZXIgdGhhbiBvdGhlciBlcXVhbGl0eSBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtTZXR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtTZXR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKE9wdGlvbmFsKVxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cblxuZnVuY3Rpb24gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBTZXQjZW50cmllcyBvciBTZXQjQEBpdGVyYXRvciwgc28gd2UgbmVlZCBtYW51YWxseSBwb3B1bGF0ZSB1c2luZyBTZXQjZm9yRWFjaFxuICBpZiAobGVmdEhhbmRPcGVyYW5kLnNpemUgIT09IHJpZ2h0SGFuZE9wZXJhbmQuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGVmdEhhbmRPcGVyYW5kLnNpemUgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgbGVmdEhhbmRJdGVtcyA9IFtdO1xuICB2YXIgcmlnaHRIYW5kSXRlbXMgPSBbXTtcbiAgbGVmdEhhbmRPcGVyYW5kLmZvckVhY2goZnVuY3Rpb24gZ2F0aGVyRW50cmllcyhrZXksIHZhbHVlKSB7XG4gICAgbGVmdEhhbmRJdGVtcy5wdXNoKFsga2V5LCB2YWx1ZSBdKTtcbiAgfSk7XG4gIHJpZ2h0SGFuZE9wZXJhbmQuZm9yRWFjaChmdW5jdGlvbiBnYXRoZXJFbnRyaWVzKGtleSwgdmFsdWUpIHtcbiAgICByaWdodEhhbmRJdGVtcy5wdXNoKFsga2V5LCB2YWx1ZSBdKTtcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kSXRlbXMuc29ydCgpLCByaWdodEhhbmRJdGVtcy5zb3J0KCksIG9wdGlvbnMpO1xufVxuXG4vKiFcbiAqIFNpbXBsZSBlcXVhbGl0eSBmb3IgZmxhdCBpdGVyYWJsZSBvYmplY3RzIHN1Y2ggYXMgQXJyYXlzLCBUeXBlZEFycmF5cyBvciBOb2RlLmpzIGJ1ZmZlcnMuXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZX0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChPcHRpb25hbClcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5cbmZ1bmN0aW9uIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGggPSBsZWZ0SGFuZE9wZXJhbmQubGVuZ3RoO1xuICBpZiAobGVuZ3RoICE9PSByaWdodEhhbmRPcGVyYW5kLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGluZGV4ID0gLTE7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGRlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmRbaW5kZXhdLCByaWdodEhhbmRPcGVyYW5kW2luZGV4XSwgb3B0aW9ucykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiFcbiAqIFNpbXBsZSBlcXVhbGl0eSBmb3IgZ2VuZXJhdG9yIG9iamVjdHMgc3VjaCBhcyB0aG9zZSByZXR1cm5lZCBieSBnZW5lcmF0b3IgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGV9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtJdGVyYWJsZX0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAqL1xuXG5mdW5jdGlvbiBnZW5lcmF0b3JFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwoZ2V0R2VuZXJhdG9yRW50cmllcyhsZWZ0SGFuZE9wZXJhbmQpLCBnZXRHZW5lcmF0b3JFbnRyaWVzKHJpZ2h0SGFuZE9wZXJhbmQpLCBvcHRpb25zKTtcbn1cblxuLyohXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgYW4gQEBpdGVyYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBoYXMgYW4gQEBpdGVyYXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gaGFzSXRlcmF0b3JGdW5jdGlvbih0YXJnZXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiB0YXJnZXRbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyohXG4gKiBHZXRzIGFsbCBpdGVyYXRvciBlbnRyaWVzIGZyb20gdGhlIGdpdmVuIE9iamVjdC4gSWYgdGhlIE9iamVjdCBoYXMgbm8gQEBpdGVyYXRvciBmdW5jdGlvbiwgcmV0dXJucyBhbiBlbXB0eSBhcnJheS5cbiAqIFRoaXMgd2lsbCBjb25zdW1lIHRoZSBpdGVyYXRvciAtIHdoaWNoIGNvdWxkIGhhdmUgc2lkZSBlZmZlY3RzIGRlcGVuZGluZyBvbiB0aGUgQEBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIGVudHJpZXMgZnJvbSB0aGUgQEBpdGVyYXRvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBnZXRJdGVyYXRvckVudHJpZXModGFyZ2V0KSB7XG4gIGlmIChoYXNJdGVyYXRvckZ1bmN0aW9uKHRhcmdldCkpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGdldEdlbmVyYXRvckVudHJpZXModGFyZ2V0W1N5bWJvbC5pdGVyYXRvcl0oKSk7XG4gICAgfSBjYXRjaCAoaXRlcmF0b3JFcnJvcikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qIVxuICogR2V0cyBhbGwgZW50cmllcyBmcm9tIGEgR2VuZXJhdG9yLiBUaGlzIHdpbGwgY29uc3VtZSB0aGUgZ2VuZXJhdG9yIC0gd2hpY2ggY291bGQgaGF2ZSBzaWRlIGVmZmVjdHMuXG4gKlxuICogQHBhcmFtIHtHZW5lcmF0b3J9IHRhcmdldFxuICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBlbnRyaWVzIGZyb20gdGhlIEdlbmVyYXRvci5cbiAqL1xuZnVuY3Rpb24gZ2V0R2VuZXJhdG9yRW50cmllcyhnZW5lcmF0b3IpIHtcbiAgdmFyIGdlbmVyYXRvclJlc3VsdCA9IGdlbmVyYXRvci5uZXh0KCk7XG4gIHZhciBhY2N1bXVsYXRvciA9IFsgZ2VuZXJhdG9yUmVzdWx0LnZhbHVlIF07XG4gIHdoaWxlIChnZW5lcmF0b3JSZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBnZW5lcmF0b3JSZXN1bHQgPSBnZW5lcmF0b3IubmV4dCgpO1xuICAgIGFjY3VtdWxhdG9yLnB1c2goZ2VuZXJhdG9yUmVzdWx0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbi8qIVxuICogR2V0cyBhbGwgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBrZXlzIGZyb20gYSB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIGtleXMgZnJvbSB0aGUgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlS2V5cyh0YXJnZXQpIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIHRhcmdldCkge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuXG4vKiFcbiAqIERldGVybWluZXMgaWYgdHdvIG9iamVjdHMgaGF2ZSBtYXRjaGluZyB2YWx1ZXMsIGdpdmVuIGEgc2V0IG9mIGtleXMuIERlZmVycyB0byBkZWVwRXF1YWwgZm9yIHRoZSBlcXVhbGl0eSBjaGVjayBvZlxuICogZWFjaCBrZXkuIElmIGFueSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBlcXVhbCwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChlYXJseSkuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge0FycmF5fSBrZXlzIEFuIGFycmF5IG9mIGtleXMgdG8gY29tcGFyZSB0aGUgdmFsdWVzIG9mIGxlZnRIYW5kT3BlcmFuZCBhbmQgcmlnaHRIYW5kT3BlcmFuZCBhZ2FpbnN0XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChPcHRpb25hbClcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5mdW5jdGlvbiBrZXlzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBrZXlzLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtrZXlzW2ldXSwgcmlnaHRIYW5kT3BlcmFuZFtrZXlzW2ldXSwgb3B0aW9ucykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiFcbiAqIFJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBlcXVhbGl0eSBvZiB0d28gT2JqZWN0cy4gT25jZSBiYXNpYyBzYW1lbmVzcyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBpdCB3aWxsIGRlZmVyIHRvIGBkZWVwRXF1YWxgXG4gKiBmb3IgZWFjaCBlbnVtZXJhYmxlIGtleSBpbiB0aGUgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAqL1xuXG5mdW5jdGlvbiBvYmplY3RFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlZnRIYW5kS2V5cyA9IGdldEVudW1lcmFibGVLZXlzKGxlZnRIYW5kT3BlcmFuZCk7XG4gIHZhciByaWdodEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZEtleXMubGVuZ3RoICYmIGxlZnRIYW5kS2V5cy5sZW5ndGggPT09IHJpZ2h0SGFuZEtleXMubGVuZ3RoKSB7XG4gICAgbGVmdEhhbmRLZXlzLnNvcnQoKTtcbiAgICByaWdodEhhbmRLZXlzLnNvcnQoKTtcbiAgICBpZiAoaXRlcmFibGVFcXVhbChsZWZ0SGFuZEtleXMsIHJpZ2h0SGFuZEtleXMpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4ga2V5c0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRLZXlzLCBvcHRpb25zKTtcbiAgfVxuXG4gIHZhciBsZWZ0SGFuZEVudHJpZXMgPSBnZXRJdGVyYXRvckVudHJpZXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEVudHJpZXMgPSBnZXRJdGVyYXRvckVudHJpZXMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZEVudHJpZXMubGVuZ3RoICYmIGxlZnRIYW5kRW50cmllcy5sZW5ndGggPT09IHJpZ2h0SGFuZEVudHJpZXMubGVuZ3RoKSB7XG4gICAgbGVmdEhhbmRFbnRyaWVzLnNvcnQoKTtcbiAgICByaWdodEhhbmRFbnRyaWVzLnNvcnQoKTtcbiAgICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZEVudHJpZXMsIHJpZ2h0SGFuZEVudHJpZXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiZcbiAgICAgIGxlZnRIYW5kRW50cmllcy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHJpZ2h0SGFuZEtleXMubGVuZ3RoID09PSAwICYmXG4gICAgICByaWdodEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiFcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBwcmltaXRpdmUuXG4gKlxuICogVGhpcyBpbnRlbnRpb25hbGx5IHJldHVybnMgdHJ1ZSBmb3IgYWxsIG9iamVjdHMgdGhhdCBjYW4gYmUgY29tcGFyZWQgYnkgcmVmZXJlbmNlLFxuICogaW5jbHVkaW5nIGZ1bmN0aW9ucyBhbmQgc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnO1xufVxuIiwgInZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxuLyohXG4gKiBDaGFpIC0gaXNQcm94eUVuYWJsZWQgaGVscGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmlzUHJveHlFbmFibGVkKClcbiAqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgQ2hhaSdzIHByb3h5IHByb3RlY3Rpb24gZmVhdHVyZSBpcyBlbmFibGVkLiBJZlxuICogcHJveGllcyBhcmUgdW5zdXBwb3J0ZWQgb3IgZGlzYWJsZWQgdmlhIHRoZSB1c2VyJ3MgQ2hhaSBjb25maWcsIHRoZW4gcmV0dXJuXG4gKiBmYWxzZS4gT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZS5cbiAqXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBpc1Byb3h5RW5hYmxlZFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNQcm94eUVuYWJsZWQoKSB7XG4gIHJldHVybiBjb25maWcudXNlUHJveHkgJiZcbiAgICB0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnO1xufTtcbiIsICIvKiFcbiAqIENoYWkgLSBhZGRQcm9wZXJ0eSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIGNoYWkgPSByZXF1aXJlKCcuLi8uLi9jaGFpJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIGlzUHJveHlFbmFibGVkID0gcmVxdWlyZSgnLi9pc1Byb3h5RW5hYmxlZCcpO1xudmFyIHRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyoqXG4gKiAjIyMgLmFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKVxuICpcbiAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC5cbiAqXG4gKiAgICAgdXRpbHMuYWRkUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZm9vJywgZnVuY3Rpb24gKCkge1xuICogICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iaikudG8uYmUuaW5zdGFuY2VvZihGb28pO1xuICogICAgIH0pO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24uYWRkUHJvcGVydHkoJ2ZvbycsIGZuKTtcbiAqXG4gKiBUaGVuIGNhbiBiZSB1c2VkIGFzIGFueSBvdGhlciBhc3NlcnRpb24uXG4gKlxuICogICAgIGV4cGVjdChteUZvbykudG8uYmUuZm9vO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhZGRlZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgcHJvcGVydHkgdG8gYWRkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkUHJvcGVydHlcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICBnZXR0ZXIgPSBnZXR0ZXIgPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uICgpIHt9IDogZ2V0dGVyO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uIHByb3BlcnR5R2V0dGVyKCkge1xuICAgICAgICAvLyBTZXR0aW5nIHRoZSBgc3NmaWAgZmxhZyB0byBgcHJvcGVydHlHZXR0ZXJgIGNhdXNlcyB0aGlzIGZ1bmN0aW9uIHRvXG4gICAgICAgIC8vIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb20gdGhlXG4gICAgICAgIC8vIHN0YWNrIHRyYWNlIG9mIGEgZmFpbGVkIGFzc2VydGlvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZlxuICAgICAgICAvLyB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzbid0IHNldCBhbmQgcHJveHkgcHJvdGVjdGlvbiBpcyBkaXNhYmxlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgICAgIC8vIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXIgYXNzZXJ0aW9uLCBvciB0aGlzIGFzc2VydGlvbiBpcyBiZWluZyBpbnZva2VkXG4gICAgICAgIC8vIGZyb20gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGBzc2ZpYCBmbGFnXG4gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmRcbiAgICAgICAgLy8gY2FzZSwgdGhlIGBzc2ZpYCBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdXRlciBhc3NlcnRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHByb3h5IHByb3RlY3Rpb24gaXMgZW5hYmxlZCwgdGhlbiB0aGUgYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlblxuICAgICAgICAvLyBzZXQgYnkgdGhlIHByb3h5IGdldHRlci5cbiAgICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsICdsb2NrU3NmaScpKSB7XG4gICAgICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIHByb3BlcnR5R2V0dGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHQgPSBnZXR0ZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9XG4gICAgLCBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59O1xuIiwgInZhciBmbkxlbmd0aERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHt9LCAnbGVuZ3RoJyk7XG5cbi8qIVxuICogQ2hhaSAtIGFkZExlbmd0aEd1YXJkIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuYWRkTGVuZ3RoR3VhcmQoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKVxuICpcbiAqIERlZmluZSBgbGVuZ3RoYCBhcyBhIGdldHRlciBvbiB0aGUgZ2l2ZW4gdW5pbnZva2VkIG1ldGhvZCBhc3NlcnRpb24uIFRoZVxuICogZ2V0dGVyIGFjdHMgYXMgYSBndWFyZCBhZ2FpbnN0IGNoYWluaW5nIGBsZW5ndGhgIGRpcmVjdGx5IG9mZiBvZiBhbiB1bmludm9rZWRcbiAqIG1ldGhvZCBhc3NlcnRpb24sIHdoaWNoIGlzIGEgcHJvYmxlbSBiZWNhdXNlIGl0IHJlZmVyZW5jZXMgYGZ1bmN0aW9uYCdzXG4gKiBidWlsdC1pbiBgbGVuZ3RoYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIENoYWkncyBgbGVuZ3RoYCBhc3NlcnRpb24uIFdoZW4gdGhlXG4gKiBnZXR0ZXIgY2F0Y2hlcyB0aGUgdXNlciBtYWtpbmcgdGhpcyBtaXN0YWtlLCBpdCB0aHJvd3MgYW4gZXJyb3Igd2l0aCBhXG4gKiBoZWxwZnVsIG1lc3NhZ2UuXG4gKlxuICogVGhlcmUgYXJlIHR3byB3YXlzIGluIHdoaWNoIHRoaXMgbWlzdGFrZSBjYW4gYmUgbWFkZS4gVGhlIGZpcnN0IHdheSBpcyBieVxuICogY2hhaW5pbmcgdGhlIGBsZW5ndGhgIGFzc2VydGlvbiBkaXJlY3RseSBvZmYgb2YgYW4gdW5pbnZva2VkIGNoYWluYWJsZVxuICogbWV0aG9kLiBJbiB0aGlzIGNhc2UsIENoYWkgc3VnZ2VzdHMgdGhhdCB0aGUgdXNlciB1c2UgYGxlbmd0aE9mYCBpbnN0ZWFkLiBUaGVcbiAqIHNlY29uZCB3YXkgaXMgYnkgY2hhaW5pbmcgdGhlIGBsZW5ndGhgIGFzc2VydGlvbiBkaXJlY3RseSBvZmYgb2YgYW4gdW5pbnZva2VkXG4gKiBub24tY2hhaW5hYmxlIG1ldGhvZC4gTm9uLWNoYWluYWJsZSBtZXRob2RzIG11c3QgYmUgaW52b2tlZCBwcmlvciB0b1xuICogY2hhaW5pbmcuIEluIHRoaXMgY2FzZSwgQ2hhaSBzdWdnZXN0cyB0aGF0IHRoZSB1c2VyIGNvbnN1bHQgdGhlIGRvY3MgZm9yIHRoZVxuICogZ2l2ZW4gYXNzZXJ0aW9uLlxuICpcbiAqIElmIHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eSBvZiBmdW5jdGlvbnMgaXMgdW5jb25maWd1cmFibGUsIHRoZW4gcmV0dXJuIGBmbmBcbiAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCBpbiBFUzYsIHRoZSBmdW5jdGlvbidzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGNvbmZpZ3VyYWJsZSwgc28gb25jZVxuICogc3VwcG9ydCBmb3IgbGVnYWN5IGVudmlyb25tZW50cyBpcyBkcm9wcGVkLCBDaGFpJ3MgYGxlbmd0aGAgcHJvcGVydHkgY2FuXG4gKiByZXBsYWNlIHRoZSBidWlsdC1pbiBmdW5jdGlvbidzIGBsZW5ndGhgIHByb3BlcnR5LCBhbmQgdGhpcyBsZW5ndGggZ3VhcmQgd2lsbFxuICogbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeS4gSW4gdGhlIG1lYW4gdGltZSwgbWFpbnRhaW5pbmcgY29uc2lzdGVuY3kgYWNyb3NzIGFsbFxuICogZW52aXJvbm1lbnRzIGlzIHRoZSBwcmlvcml0eS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtTdHJpbmd9IGFzc2VydGlvbk5hbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNDaGFpbmFibGVcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGFkZExlbmd0aEd1YXJkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRMZW5ndGhHdWFyZCAoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKSB7XG4gIGlmICghZm5MZW5ndGhEZXNjLmNvbmZpZ3VyYWJsZSkgcmV0dXJuIGZuO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2xlbmd0aCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpc0NoYWluYWJsZSkge1xuICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBDaGFpIHByb3BlcnR5OiAnICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBEdWUnICtcbiAgICAgICAgICAnIHRvIGEgY29tcGF0aWJpbGl0eSBpc3N1ZSwgXCJsZW5ndGhcIiBjYW5ub3QgZGlyZWN0bHkgZm9sbG93IFwiJyArXG4gICAgICAgICAgYXNzZXJ0aW9uTmFtZSArICdcIi4gVXNlIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aE9mXCIgaW5zdGVhZC4nKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgQ2hhaSBwcm9wZXJ0eTogJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aC4gU2VlJyArXG4gICAgICAgICcgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnXCIuJyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZm47XG59O1xuIiwgIi8qIVxuICogQ2hhaSAtIGdldFByb3BlcnRpZXMgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5nZXRQcm9wZXJ0aWVzKG9iamVjdClcbiAqXG4gKiBUaGlzIGFsbG93cyB0aGUgcmV0cmlldmFsIG9mIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdCwgZW51bWVyYWJsZSBvciBub3QsXG4gKiBpbmhlcml0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldFByb3BlcnRpZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcblxuICBmdW5jdGlvbiBhZGRQcm9wZXJ0eShwcm9wZXJ0eSkge1xuICAgIGlmIChyZXN1bHQuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xKSB7XG4gICAgICByZXN1bHQucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGFkZFByb3BlcnR5KTtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICJ2YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIGdldFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2dldFByb3BlcnRpZXMnKTtcbnZhciBpc1Byb3h5RW5hYmxlZCA9IHJlcXVpcmUoJy4vaXNQcm94eUVuYWJsZWQnKTtcblxuLyohXG4gKiBDaGFpIC0gcHJveGlmeSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLnByb3hpZnkob2JqZWN0KVxuICpcbiAqIFJldHVybiBhIHByb3h5IG9mIGdpdmVuIG9iamVjdCB0aGF0IHRocm93cyBhbiBlcnJvciB3aGVuIGEgbm9uLWV4aXN0ZW50XG4gKiBwcm9wZXJ0eSBpcyByZWFkLiBCeSBkZWZhdWx0LCB0aGUgcm9vdCBjYXVzZSBpcyBhc3N1bWVkIHRvIGJlIGEgbWlzc3BlbGxlZFxuICogcHJvcGVydHksIGFuZCB0aHVzIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBvZmZlciBhIHJlYXNvbmFibGUgc3VnZ2VzdGlvbiBmcm9tXG4gKiB0aGUgbGlzdCBvZiBleGlzdGluZyBwcm9wZXJ0aWVzLiBIb3dldmVyLCBpZiBhIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUgaXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSByb290IGNhdXNlIGlzIGluc3RlYWQgYSBmYWlsdXJlIHRvIGludm9rZSBhIG5vbi1jaGFpbmFibGVcbiAqIG1ldGhvZCBwcmlvciB0byByZWFkaW5nIHRoZSBub24tZXhpc3RlbnQgcHJvcGVydHkuXG4gKlxuICogSWYgcHJveGllcyBhcmUgdW5zdXBwb3J0ZWQgb3IgZGlzYWJsZWQgdmlhIHRoZSB1c2VyJ3MgQ2hhaSBjb25maWcsIHRoZW5cbiAqIHJldHVybiBvYmplY3Qgd2l0aG91dCBtb2RpZmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IG5vbkNoYWluYWJsZU1ldGhvZE5hbWVcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIHByb3hpZnlcbiAqL1xuXG52YXIgYnVpbHRpbnMgPSBbJ19fZmxhZ3MnLCAnX19tZXRob2RzJywgJ19vYmonLCAnYXNzZXJ0J107XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHJveGlmeShvYmosIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUpIHtcbiAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpKSByZXR1cm4gb2JqO1xuXG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBwcm94eUdldHRlcih0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIGlzIGhlcmUgYmVjYXVzZSB3ZSBzaG91bGQgbm90IHRocm93IGVycm9ycyBvbiBTeW1ib2wgcHJvcGVydGllc1xuICAgICAgLy8gc3VjaCBhcyBgU3ltYm9sLnRvU3RyaW5nVGFnYC5cbiAgICAgIC8vIFRoZSB2YWx1ZXMgZm9yIHdoaWNoIGFuIGVycm9yIHNob3VsZCBiZSB0aHJvd24gY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmdcbiAgICAgIC8vIHRoZSBgY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzYCBzZXR0aW5nLlxuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmXG4gICAgICAgICAgIVJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHkpKSB7XG4gICAgICAgIC8vIFNwZWNpYWwgbWVzc2FnZSBmb3IgaW52YWxpZCBwcm9wZXJ0eSBhY2Nlc3Mgb2Ygbm9uLWNoYWluYWJsZSBtZXRob2RzLlxuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIENoYWkgcHJvcGVydHk6ICcgKyBub25DaGFpbmFibGVNZXRob2ROYW1lICsgJy4nICtcbiAgICAgICAgICAgIHByb3BlcnR5ICsgJy4gU2VlIGRvY3MgZm9yIHByb3BlciB1c2FnZSBvZiBcIicgK1xuICAgICAgICAgICAgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSArICdcIi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyByZWFzb25hYmx5IGNsb3NlIHRvIGFuIGV4aXN0aW5nIENoYWkgcHJvcGVydHksXG4gICAgICAgIC8vIHN1Z2dlc3QgdGhhdCBwcm9wZXJ0eSB0byB0aGUgdXNlci4gT25seSBzdWdnZXN0IHByb3BlcnRpZXMgd2l0aCBhXG4gICAgICAgIC8vIGRpc3RhbmNlIGxlc3MgdGhhbiA0LlxuICAgICAgICB2YXIgc3VnZ2VzdGlvbiA9IG51bGw7XG4gICAgICAgIHZhciBzdWdnZXN0aW9uRGlzdGFuY2UgPSA0O1xuICAgICAgICBnZXRQcm9wZXJ0aWVzKHRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocHJvcCkgJiZcbiAgICAgICAgICAgIGJ1aWx0aW5zLmluZGV4T2YocHJvcCkgPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2YXIgZGlzdCA9IHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKFxuICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbkRpc3RhbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGRpc3QgPCBzdWdnZXN0aW9uRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IHByb3A7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25EaXN0YW5jZSA9IGRpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc3VnZ2VzdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIENoYWkgcHJvcGVydHk6ICcgKyBwcm9wZXJ0eSArXG4gICAgICAgICAgICAnLiBEaWQgeW91IG1lYW4gXCInICsgc3VnZ2VzdGlvbiArICdcIj8nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBDaGFpIHByb3BlcnR5OiAnICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB0aGlzIHByb3h5IGdldHRlciBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLiBGb3IgcHJvcGVydHlcbiAgICAgIC8vIGFzc2VydGlvbnMsIHRoaXMgcHJldmVudHMgdGhlIHByb3h5IGdldHRlciBmcm9tIHNob3dpbmcgdXAgaW4gdGhlIHN0YWNrXG4gICAgICAvLyB0cmFjZSBzaW5jZSBpdCdzIGludm9rZWQgYmVmb3JlIHRoZSBwcm9wZXJ0eSBnZXR0ZXIuIEZvciBtZXRob2QgYW5kXG4gICAgICAvLyBjaGFpbmFibGUgbWV0aG9kIGFzc2VydGlvbnMsIHRoaXMgZmxhZyB3aWxsIGVuZCB1cCBnZXR0aW5nIGNoYW5nZWQgdG9cbiAgICAgIC8vIHRoZSBtZXRob2Qgd3JhcHBlciwgd2hpY2ggaXMgZ29vZCBzaW5jZSB0aGlzIGZyYW1lIHdpbGwgbm8gbG9uZ2VyIGJlIGluXG4gICAgICAvLyB0aGUgc3RhY2sgb25jZSB0aGUgbWV0aG9kIGlzIGludm9rZWQuIE5vdGUgdGhhdCBDaGFpIGJ1aWx0aW4gYXNzZXJ0aW9uXG4gICAgICAvLyBwcm9wZXJ0aWVzIHN1Y2ggYXMgYF9fZmxhZ3NgIGFyZSBza2lwcGVkIHNpbmNlIHRoaXMgaXMgb25seSBtZWFudCB0b1xuICAgICAgLy8gY2FwdHVyZSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgYW4gYXNzZXJ0aW9uLiBUaGlzIHN0ZXAgaXMgYWxzbyBza2lwcGVkXG4gICAgICAvLyBpZiB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzIHNldCwgdGh1cyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBhc3NlcnRpb24gaXNcbiAgICAgIC8vIGJlaW5nIGNhbGxlZCBmcm9tIHdpdGhpbiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhhdCBjYXNlLCB0aGUgYHNzZmlgXG4gICAgICAvLyBmbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBvdXRlciBhc3NlcnRpb24ncyBzdGFydGluZyBwb2ludC5cbiAgICAgIGlmIChidWlsdGlucy5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTEgJiYgIWZsYWcodGFyZ2V0LCAnbG9ja1NzZmknKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgJ3NzZmknLCBwcm94eUdldHRlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiAjIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcClcbiAqIFJldHVybiB0aGUgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gc3RyaW5ncywgYnV0IG5vIG1vcmUgdGhhbiBjYXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyQVxuICogQHBhcmFtIHtzdHJpbmd9IHN0ckJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJcbiAqIEByZXR1cm4ge251bWJlcn0gbWluKHN0cmluZyBkaXN0YW5jZSBiZXR3ZWVuIHN0ckEgYW5kIHN0ckIsIGNhcClcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcCkge1xuICBpZiAoTWF0aC5hYnMoc3RyQS5sZW5ndGggLSBzdHJCLmxlbmd0aCkgPj0gY2FwKSB7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIHZhciBtZW1vID0gW107XG4gIC8vIGBtZW1vYCBpcyBhIHR3by1kaW1lbnNpb25hbCBhcnJheSBjb250YWluaW5nIGRpc3RhbmNlcy5cbiAgLy8gbWVtb1tpXVtqXSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBzdHJBLnNsaWNlKDAsIGkpIGFuZFxuICAvLyBzdHJCLnNsaWNlKDAsIGopLlxuICBmb3IgKHZhciBpID0gMDsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbWVtb1tpXSA9IEFycmF5KHN0ckIubGVuZ3RoICsgMSkuZmlsbCgwKTtcbiAgICBtZW1vW2ldWzBdID0gaTtcbiAgfVxuICBmb3IgKHZhciBqID0gMDsgaiA8IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICBtZW1vWzBdW2pdID0gajtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0ckEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2ggPSBzdHJBLmNoYXJDb2RlQXQoaSAtIDEpO1xuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChNYXRoLmFicyhpIC0gaikgPj0gY2FwKSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBjYXA7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbWVtb1tpXVtqXSA9IE1hdGgubWluKFxuICAgICAgICBtZW1vW2kgLSAxXVtqXSArIDEsXG4gICAgICAgIG1lbW9baV1baiAtIDFdICsgMSxcbiAgICAgICAgbWVtb1tpIC0gMV1baiAtIDFdICtcbiAgICAgICAgICAoY2ggPT09IHN0ckIuY2hhckNvZGVBdChqIC0gMSkgPyAwIDogMSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbiIsICIvKiFcbiAqIENoYWkgLSBhZGRNZXRob2QgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBhZGRMZW5ndGhHdWFyZCA9IHJlcXVpcmUoJy4vYWRkTGVuZ3RoR3VhcmQnKTtcbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBwcm94aWZ5ID0gcmVxdWlyZSgnLi9wcm94aWZ5Jyk7XG52YXIgdHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKipcbiAqICMjIyAuYWRkTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKVxuICpcbiAqIEFkZHMgYSBtZXRob2QgdG8gdGhlIHByb3RvdHlwZSBvZiBhbiBvYmplY3QuXG4gKlxuICogICAgIHV0aWxzLmFkZE1ldGhvZChjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUsICdmb28nLCBmdW5jdGlvbiAoc3RyKSB7XG4gKiAgICAgICB2YXIgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gKiAgICAgICBuZXcgY2hhaS5Bc3NlcnRpb24ob2JqKS50by5iZS5lcXVhbChzdHIpO1xuICogICAgIH0pO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdmb28nLCBmbik7XG4gKlxuICogVGhlbiBjYW4gYmUgdXNlZCBhcyBhbnkgb3RoZXIgYXNzZXJ0aW9uLlxuICpcbiAqICAgICBleHBlY3QoZm9vU3RyKS50by5iZS5mb28oJ2JhcicpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHRvIHdoaWNoIHRoZSBtZXRob2QgaXMgYWRkZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIG1ldGhvZCB0byBhZGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBuYW1lXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBhZGRNZXRob2RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgdmFyIG1ldGhvZFdyYXBwZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gU2V0dGluZyB0aGUgYHNzZmlgIGZsYWcgdG8gYG1ldGhvZFdyYXBwZXJgIGNhdXNlcyB0aGlzIGZ1bmN0aW9uIHRvIGJlIHRoZVxuICAgIC8vIHN0YXJ0aW5nIHBvaW50IGZvciByZW1vdmluZyBpbXBsZW1lbnRhdGlvbiBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2ZcbiAgICAvLyBhIGZhaWxlZCBhc3NlcnRpb24uXG4gICAgLy9cbiAgICAvLyBIb3dldmVyLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGlmIHRoZVxuICAgIC8vIGBsb2NrU3NmaWAgZmxhZyBpc24ndCBzZXQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzIHNldCwgdGhlbiBlaXRoZXIgdGhpcyBhc3NlcnRpb24gaGFzIGJlZW5cbiAgICAvLyBvdmVyd3JpdHRlbiBieSBhbm90aGVyIGFzc2VydGlvbiwgb3IgdGhpcyBhc3NlcnRpb24gaXMgYmVpbmcgaW52b2tlZCBmcm9tXG4gICAgLy8gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGBzc2ZpYCBmbGFnIGhhc1xuICAgIC8vIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG92ZXJ3cml0aW5nIGFzc2VydGlvbi4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGVcbiAgICAvLyBgc3NmaWAgZmxhZyBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSB0aGUgb3V0ZXIgYXNzZXJ0aW9uLlxuICAgIGlmICghZmxhZyh0aGlzLCAnbG9ja1NzZmknKSkge1xuICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIG1ldGhvZFdyYXBwZXIpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9O1xuXG4gIGFkZExlbmd0aEd1YXJkKG1ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShtZXRob2RXcmFwcGVyLCBuYW1lKTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlUHJvcGVydHkgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBpc1Byb3h5RW5hYmxlZCA9IHJlcXVpcmUoJy4vaXNQcm94eUVuYWJsZWQnKTtcbnZhciB0cmFuc2ZlckZsYWdzID0gcmVxdWlyZSgnLi90cmFuc2ZlckZsYWdzJyk7XG5cbi8qKlxuICogIyMjIC5vdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGZuKVxuICpcbiAqIE92ZXJ3cml0ZXMgYW4gYWxyZWFkeSBleGlzdGluZyBwcm9wZXJ0eSBnZXR0ZXIgYW5kIHByb3ZpZGVzXG4gKiBhY2Nlc3MgdG8gcHJldmlvdXMgdmFsdWUuIE11c3QgcmV0dXJuIGZ1bmN0aW9uIHRvIHVzZSBhcyBnZXR0ZXIuXG4gKlxuICogICAgIHV0aWxzLm92ZXJ3cml0ZVByb3BlcnR5KGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ29rJywgZnVuY3Rpb24gKF9zdXBlcikge1xuICogICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAqICAgICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9vKSB7XG4gKiAgICAgICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iai5uYW1lKS50by5lcXVhbCgnYmFyJyk7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqXG4gKlxuICogQ2FuIGFsc28gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBgY2hhaS5Bc3NlcnRpb25gLlxuICpcbiAqICAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVQcm9wZXJ0eSgnZm9vJywgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5iZS5vaztcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBvdmVyd3JpdHRlblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgcHJvcGVydHkgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZ2V0dGVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIG5hbWVcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIG92ZXJ3cml0ZVByb3BlcnR5XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlUHJvcGVydHkoY3R4LCBuYW1lLCBnZXR0ZXIpIHtcbiAgdmFyIF9nZXQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN0eCwgbmFtZSlcbiAgICAsIF9zdXBlciA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gIGlmIChfZ2V0ICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBfZ2V0LmdldClcbiAgICBfc3VwZXIgPSBfZ2V0LmdldFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uIG92ZXJ3cml0aW5nUHJvcGVydHlHZXR0ZXIoKSB7XG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGBzc2ZpYCBmbGFnIHRvIGBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyYCBjYXVzZXMgdGhpc1xuICAgICAgICAvLyBmdW5jdGlvbiB0byBiZSB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIGltcGxlbWVudGF0aW9uIGZyYW1lc1xuICAgICAgICAvLyBmcm9tIHRoZSBzdGFjayB0cmFjZSBvZiBhIGZhaWxlZCBhc3NlcnRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbiBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgaWZcbiAgICAgICAgLy8gdGhlIGBsb2NrU3NmaWAgZmxhZyBpc24ndCBzZXQgYW5kIHByb3h5IHByb3RlY3Rpb24gaXMgZGlzYWJsZWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHRoZSBgbG9ja1NzZmlgIGZsYWcgaXMgc2V0LCB0aGVuIGVpdGhlciB0aGlzIGFzc2VydGlvbiBoYXMgYmVlblxuICAgICAgICAvLyBvdmVyd3JpdHRlbiBieSBhbm90aGVyIGFzc2VydGlvbiwgb3IgdGhpcyBhc3NlcnRpb24gaXMgYmVpbmcgaW52b2tlZFxuICAgICAgICAvLyBmcm9tIGluc2lkZSBvZiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBgc3NmaWAgZmxhZ1xuICAgICAgICAvLyBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSB0aGUgb3ZlcndyaXRpbmcgYXNzZXJ0aW9uLiBJbiB0aGUgc2Vjb25kXG4gICAgICAgIC8vIGNhc2UsIHRoZSBgc3NmaWAgZmxhZyBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSB0aGUgb3V0ZXIgYXNzZXJ0aW9uLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZiBwcm94eSBwcm90ZWN0aW9uIGlzIGVuYWJsZWQsIHRoZW4gdGhlIGBzc2ZpYCBmbGFnIGhhcyBhbHJlYWR5IGJlZW5cbiAgICAgICAgLy8gc2V0IGJ5IHRoZSBwcm94eSBnZXR0ZXIuXG4gICAgICAgIGlmICghaXNQcm94eUVuYWJsZWQoKSAmJiAhZmxhZyh0aGlzLCAnbG9ja1NzZmknKSkge1xuICAgICAgICAgIGZsYWcodGhpcywgJ3NzZmknLCBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGBsb2NrU3NmaWAgZmxhZyB0byBgdHJ1ZWAgcHJldmVudHMgdGhlIG92ZXJ3cml0dGVuXG4gICAgICAgIC8vIGFzc2VydGlvbiBmcm9tIGNoYW5naW5nIHRoZSBgc3NmaWAgZmxhZy4gQnkgdGhpcyBwb2ludCwgdGhlIGBzc2ZpYFxuICAgICAgICAvLyBmbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBjb3JyZWN0IHN0YXJ0aW5nIHBvaW50IGZvciB0aGlzIGFzc2VydGlvbi5cbiAgICAgICAgdmFyIG9yaWdMb2NrU3NmaSA9IGZsYWcodGhpcywgJ2xvY2tTc2ZpJyk7XG4gICAgICAgIGZsYWcodGhpcywgJ2xvY2tTc2ZpJywgdHJ1ZSk7XG4gICAgICAgIHZhciByZXN1bHQgPSBnZXR0ZXIoX3N1cGVyKS5jYWxsKHRoaXMpO1xuICAgICAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIG9yaWdMb2NrU3NmaSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgY2hhaS5Bc3NlcnRpb24oKTtcbiAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgICAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICAgICAgfVxuICAgICwgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufTtcbiIsICIvKiFcbiAqIENoYWkgLSBvdmVyd3JpdGVNZXRob2QgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBhZGRMZW5ndGhHdWFyZCA9IHJlcXVpcmUoJy4vYWRkTGVuZ3RoR3VhcmQnKTtcbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBwcm94aWZ5ID0gcmVxdWlyZSgnLi9wcm94aWZ5Jyk7XG52YXIgdHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKipcbiAqICMjIyAub3ZlcndyaXRlTWV0aG9kKGN0eCwgbmFtZSwgZm4pXG4gKlxuICogT3ZlcndyaXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIG1ldGhvZCBhbmQgcHJvdmlkZXNcbiAqIGFjY2VzcyB0byBwcmV2aW91cyBmdW5jdGlvbi4gTXVzdCByZXR1cm4gZnVuY3Rpb25cbiAqIHRvIGJlIHVzZWQgZm9yIG5hbWUuXG4gKlxuICogICAgIHV0aWxzLm92ZXJ3cml0ZU1ldGhvZChjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUsICdlcXVhbCcsIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3RyKSB7XG4gKiAgICAgICAgIHZhciBvYmogPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKTtcbiAqICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvbykge1xuICogICAgICAgICAgIG5ldyBjaGFpLkFzc2VydGlvbihvYmoudmFsdWUpLnRvLmVxdWFsKHN0cik7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZU1ldGhvZCgnZm9vJywgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5lcXVhbCgnYmFyJyk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN0eCBvYmplY3Qgd2hvc2UgbWV0aG9kIGlzIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiBtZXRob2QgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKSB7XG4gIHZhciBfbWV0aG9kID0gY3R4W25hbWVdXG4gICAgLCBfc3VwZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9O1xuXG4gIGlmIChfbWV0aG9kICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBfbWV0aG9kKVxuICAgIF9zdXBlciA9IF9tZXRob2Q7XG5cbiAgdmFyIG92ZXJ3cml0aW5nTWV0aG9kV3JhcHBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTZXR0aW5nIHRoZSBgc3NmaWAgZmxhZyB0byBgb3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyYCBjYXVzZXMgdGhpc1xuICAgIC8vIGZ1bmN0aW9uIHRvIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb21cbiAgICAvLyB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLlxuICAgIC8vXG4gICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZiB0aGVcbiAgICAvLyBgbG9ja1NzZmlgIGZsYWcgaXNuJ3Qgc2V0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgLy8gb3ZlcndyaXR0ZW4gYnkgYW5vdGhlciBhc3NlcnRpb24sIG9yIHRoaXMgYXNzZXJ0aW9uIGlzIGJlaW5nIGludm9rZWQgZnJvbVxuICAgIC8vIGluc2lkZSBvZiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBgc3NmaWAgZmxhZyBoYXNcbiAgICAvLyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlXG4gICAgLy8gYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG91dGVyIGFzc2VydGlvbi5cbiAgICBpZiAoIWZsYWcodGhpcywgJ2xvY2tTc2ZpJykpIHtcbiAgICAgIGZsYWcodGhpcywgJ3NzZmknLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cblxuICAgIC8vIFNldHRpbmcgdGhlIGBsb2NrU3NmaWAgZmxhZyB0byBgdHJ1ZWAgcHJldmVudHMgdGhlIG92ZXJ3cml0dGVuIGFzc2VydGlvblxuICAgIC8vIGZyb20gY2hhbmdpbmcgdGhlIGBzc2ZpYCBmbGFnLiBCeSB0aGlzIHBvaW50LCB0aGUgYHNzZmlgIGZsYWcgaXMgYWxyZWFkeVxuICAgIC8vIHNldCB0byB0aGUgY29ycmVjdCBzdGFydGluZyBwb2ludCBmb3IgdGhpcyBhc3NlcnRpb24uXG4gICAgdmFyIG9yaWdMb2NrU3NmaSA9IGZsYWcodGhpcywgJ2xvY2tTc2ZpJyk7XG4gICAgZmxhZyh0aGlzLCAnbG9ja1NzZmknLCB0cnVlKTtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIG9yaWdMb2NrU3NmaSk7XG5cbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9XG5cbiAgYWRkTGVuZ3RoR3VhcmQob3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyLCBuYW1lLCBmYWxzZSk7XG4gIGN0eFtuYW1lXSA9IHByb3hpZnkob3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyLCBuYW1lKTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gYWRkQ2hhaW5pbmdNZXRob2QgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qIVxuICogTW9kdWxlIGRlcGVuZGVuY2llc1xuICovXG5cbnZhciBhZGRMZW5ndGhHdWFyZCA9IHJlcXVpcmUoJy4vYWRkTGVuZ3RoR3VhcmQnKTtcbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBwcm94aWZ5ID0gcmVxdWlyZSgnLi9wcm94aWZ5Jyk7XG52YXIgdHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKiFcbiAqIE1vZHVsZSB2YXJpYWJsZXNcbiAqL1xuXG4vLyBDaGVjayB3aGV0aGVyIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIGlzIHN1cHBvcnRlZFxudmFyIGNhblNldFByb3RvdHlwZSA9IHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09ICdmdW5jdGlvbic7XG5cbi8vIFdpdGhvdXQgYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgc3VwcG9ydCwgdGhpcyBtb2R1bGUgd2lsbCBuZWVkIHRvIGFkZCBwcm9wZXJ0aWVzIHRvIGEgZnVuY3Rpb24uXG4vLyBIb3dldmVyLCBzb21lIG9mIGZ1bmN0aW9ucycgb3duIHByb3BzIGFyZSBub3QgY29uZmlndXJhYmxlIGFuZCBzaG91bGQgYmUgc2tpcHBlZC5cbnZhciB0ZXN0Rm4gPSBmdW5jdGlvbigpIHt9O1xudmFyIGV4Y2x1ZGVOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3RGbikuZmlsdGVyKGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0ZXN0Rm4sIG5hbWUpO1xuXG4gIC8vIE5vdGU6IFBoYW50b21KUyAxLnggaW5jbHVkZXMgYGNhbGxlZWAgYXMgb25lIG9mIGB0ZXN0Rm5gJ3Mgb3duIHByb3BlcnRpZXMsXG4gIC8vIGJ1dCB0aGVuIHJldHVybnMgYHVuZGVmaW5lZGAgYXMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIGBjYWxsZWVgLiBBcyBhXG4gIC8vIHdvcmthcm91bmQsIHdlIHBlcmZvcm0gYW4gb3RoZXJ3aXNlIHVubmVjZXNzYXJ5IHR5cGUtY2hlY2sgZm9yIGBwcm9wRGVzY2AsXG4gIC8vIGFuZCB0aGVuIGZpbHRlciBpdCBvdXQgaWYgaXQncyBub3QgYW4gb2JqZWN0IGFzIGl0IHNob3VsZCBiZS5cbiAgaWYgKHR5cGVvZiBwcm9wRGVzYyAhPT0gJ29iamVjdCcpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuICFwcm9wRGVzYy5jb25maWd1cmFibGU7XG59KTtcblxuLy8gQ2FjaGUgYEZ1bmN0aW9uYCBwcm9wZXJ0aWVzXG52YXIgY2FsbCAgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCxcbiAgICBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLyoqXG4gKiAjIyMgLmFkZENoYWluYWJsZU1ldGhvZChjdHgsIG5hbWUsIG1ldGhvZCwgY2hhaW5pbmdCZWhhdmlvcilcbiAqXG4gKiBBZGRzIGEgbWV0aG9kIHRvIGFuIG9iamVjdCwgc3VjaCB0aGF0IHRoZSBtZXRob2QgY2FuIGFsc28gYmUgY2hhaW5lZC5cbiAqXG4gKiAgICAgdXRpbHMuYWRkQ2hhaW5hYmxlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2ZvbycsIGZ1bmN0aW9uIChzdHIpIHtcbiAqICAgICAgIHZhciBvYmogPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKTtcbiAqICAgICAgIG5ldyBjaGFpLkFzc2VydGlvbihvYmopLnRvLmJlLmVxdWFsKHN0cik7XG4gKiAgICAgfSk7XG4gKlxuICogQ2FuIGFsc28gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBgY2hhaS5Bc3NlcnRpb25gLlxuICpcbiAqICAgICBjaGFpLkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2ZvbycsIGZuLCBjaGFpbmluZ0JlaGF2aW9yKTtcbiAqXG4gKiBUaGUgcmVzdWx0IGNhbiB0aGVuIGJlIHVzZWQgYXMgYm90aCBhIG1ldGhvZCBhc3NlcnRpb24sIGV4ZWN1dGluZyBib3RoIGBtZXRob2RgIGFuZFxuICogYGNoYWluaW5nQmVoYXZpb3JgLCBvciBhcyBhIGxhbmd1YWdlIGNoYWluLCB3aGljaCBvbmx5IGV4ZWN1dGVzIGBjaGFpbmluZ0JlaGF2aW9yYC5cbiAqXG4gKiAgICAgZXhwZWN0KGZvb1N0cikudG8uYmUuZm9vKCdiYXInKTtcbiAqICAgICBleHBlY3QoZm9vU3RyKS50by5iZS5mb28uZXF1YWwoJ2ZvbycpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHRvIHdoaWNoIHRoZSBtZXRob2QgaXMgYWRkZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIG1ldGhvZCB0byBhZGRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBgbmFtZWAsIHdoZW4gY2FsbGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaGFpbmluZ0JlaGF2aW9yIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkQ2hhaW5hYmxlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYWRkQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gIGlmICh0eXBlb2YgY2hhaW5pbmdCZWhhdmlvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNoYWluaW5nQmVoYXZpb3IgPSBmdW5jdGlvbiAoKSB7IH07XG4gIH1cblxuICB2YXIgY2hhaW5hYmxlQmVoYXZpb3IgPSB7XG4gICAgICBtZXRob2Q6IG1ldGhvZFxuICAgICwgY2hhaW5pbmdCZWhhdmlvcjogY2hhaW5pbmdCZWhhdmlvclxuICB9O1xuXG4gIC8vIHNhdmUgdGhlIG1ldGhvZHMgc28gd2UgY2FuIG92ZXJ3cml0ZSB0aGVtIGxhdGVyLCBpZiB3ZSBuZWVkIHRvLlxuICBpZiAoIWN0eC5fX21ldGhvZHMpIHtcbiAgICBjdHguX19tZXRob2RzID0ge307XG4gIH1cbiAgY3R4Ll9fbWV0aG9kc1tuYW1lXSA9IGNoYWluYWJsZUJlaGF2aW9yO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uIGNoYWluYWJsZU1ldGhvZEdldHRlcigpIHtcbiAgICAgICAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBjaGFpbmFibGVNZXRob2RXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGBzc2ZpYCBmbGFnIHRvIGBjaGFpbmFibGVNZXRob2RXcmFwcGVyYCBjYXVzZXMgdGhpc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uIHRvIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAvLyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZlxuICAgICAgICAgIC8vIHRoZSBgbG9ja1NzZmlgIGZsYWcgaXNuJ3Qgc2V0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gdGhpcyBhc3NlcnRpb24gaXMgYmVpbmdcbiAgICAgICAgICAvLyBpbnZva2VkIGZyb20gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBgc3NmaWBcbiAgICAgICAgICAvLyBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdXRlciBhc3NlcnRpb24uXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBOb3RlIHRoYXQgb3ZlcndyaXRpbmcgYSBjaGFpbmFibGUgbWV0aG9kIG1lcmVseSByZXBsYWNlcyB0aGUgc2F2ZWRcbiAgICAgICAgICAvLyBtZXRob2RzIGluIGBjdHguX19tZXRob2RzYCBpbnN0ZWFkIG9mIGNvbXBsZXRlbHkgcmVwbGFjaW5nIHRoZVxuICAgICAgICAgIC8vIG92ZXJ3cml0dGVuIGFzc2VydGlvbi4gVGhlcmVmb3JlLCBhbiBvdmVyd3JpdGluZyBhc3NlcnRpb24gd29uJ3RcbiAgICAgICAgICAvLyBzZXQgdGhlIGBzc2ZpYCBvciBgbG9ja1NzZmlgIGZsYWdzLlxuICAgICAgICAgIGlmICghZmxhZyh0aGlzLCAnbG9ja1NzZmknKSkge1xuICAgICAgICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZXN1bHQgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgICAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIGFkZExlbmd0aEd1YXJkKGNoYWluYWJsZU1ldGhvZFdyYXBwZXIsIG5hbWUsIHRydWUpO1xuXG4gICAgICAgIC8vIFVzZSBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKGNhblNldFByb3RvdHlwZSkge1xuICAgICAgICAgIC8vIEluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgb2JqZWN0IGJ5IHJlcGxhY2luZyB0aGUgYEZ1bmN0aW9uYCBwcm90b3R5cGVcbiAgICAgICAgICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBgY2FsbGAgYW5kIGBhcHBseWAgbWV0aG9kcyBmcm9tIGBGdW5jdGlvbmBcbiAgICAgICAgICBwcm90b3R5cGUuY2FsbCA9IGNhbGw7XG4gICAgICAgICAgcHJvdG90eXBlLmFwcGx5ID0gYXBwbHk7XG4gICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGNoYWluYWJsZU1ldGhvZFdyYXBwZXIsIHByb3RvdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCByZWRlZmluZSBhbGwgcHJvcGVydGllcyAoc2xvdyEpXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBhc3NlcnRlck5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3R4KTtcbiAgICAgICAgICBhc3NlcnRlck5hbWVzLmZvckVhY2goZnVuY3Rpb24gKGFzc2VydGVyTmFtZSkge1xuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVOYW1lcy5pbmRleE9mKGFzc2VydGVyTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdHgsIGFzc2VydGVyTmFtZSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2hhaW5hYmxlTWV0aG9kV3JhcHBlciwgYXNzZXJ0ZXJOYW1lLCBwZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICByZXR1cm4gcHJveGlmeShjaGFpbmFibGVNZXRob2RXcmFwcGVyKTtcbiAgICAgIH1cbiAgICAsIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgY2hhaSA9IHJlcXVpcmUoJy4uLy4uL2NoYWknKTtcbnZhciB0cmFuc2ZlckZsYWdzID0gcmVxdWlyZSgnLi90cmFuc2ZlckZsYWdzJyk7XG5cbi8qKlxuICogIyMjIC5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpXG4gKlxuICogT3ZlcndyaXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIGNoYWluYWJsZSBtZXRob2RcbiAqIGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHByZXZpb3VzIGZ1bmN0aW9uIG9yXG4gKiBwcm9wZXJ0eS4gIE11c3QgcmV0dXJuIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGZvclxuICogbmFtZS5cbiAqXG4gKiAgICAgdXRpbHMub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2xlbmd0aE9mJyxcbiAqICAgICAgIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIH1cbiAqICAgICAsIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIH1cbiAqICAgICApO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKCdmb28nLCBmbiwgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICogICAgIGV4cGVjdChteUZvbykudG8uaGF2ZS5sZW5ndGhPZi5hYm92ZSgzKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4IG9iamVjdCB3aG9zZSBtZXRob2QgLyBwcm9wZXJ0eSBpcyB0byBiZSBvdmVyd3JpdHRlblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgbWV0aG9kIC8gcHJvcGVydHkgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBwcm9wZXJ0eVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gIHZhciBjaGFpbmFibGVCZWhhdmlvciA9IGN0eC5fX21ldGhvZHNbbmFtZV07XG5cbiAgdmFyIF9jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvcjtcbiAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvciA9IGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgIHZhciByZXN1bHQgPSBjaGFpbmluZ0JlaGF2aW9yKF9jaGFpbmluZ0JlaGF2aW9yKS5jYWxsKHRoaXMpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IGNoYWkuQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH07XG5cbiAgdmFyIF9tZXRob2QgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2Q7XG4gIGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZCA9IGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kV3JhcHBlcigpIHtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9tZXRob2QpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgY2hhaS5Bc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gY29tcGFyZUJ5SW5zcGVjdCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGluc3BlY3QgPSByZXF1aXJlKCcuL2luc3BlY3QnKTtcblxuLyoqXG4gKiAjIyMgLmNvbXBhcmVCeUluc3BlY3QobWl4ZWQsIG1peGVkKVxuICpcbiAqIFRvIGJlIHVzZWQgYXMgYSBjb21wYXJlRnVuY3Rpb24gd2l0aCBBcnJheS5wcm90b3R5cGUuc29ydC4gQ29tcGFyZXMgZWxlbWVudHNcbiAqIHVzaW5nIGluc3BlY3QgaW5zdGVhZCBvZiBkZWZhdWx0IGJlaGF2aW9yIG9mIHVzaW5nIHRvU3RyaW5nIHNvIHRoYXQgU3ltYm9sc1xuICogYW5kIG9iamVjdHMgd2l0aCBpcnJlZ3VsYXIvbWlzc2luZyB0b1N0cmluZyBjYW4gc3RpbGwgYmUgc29ydGVkIHdpdGhvdXQgYVxuICogVHlwZUVycm9yLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGZpcnN0IGVsZW1lbnQgdG8gY29tcGFyZVxuICogQHBhcmFtIHtNaXhlZH0gc2Vjb25kIGVsZW1lbnQgdG8gY29tcGFyZVxuICogQHJldHVybnMge051bWJlcn0gLTEgaWYgJ2EnIHNob3VsZCBjb21lIGJlZm9yZSAnYic7IG90aGVyd2lzZSAxXG4gKiBAbmFtZSBjb21wYXJlQnlJbnNwZWN0XG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tcGFyZUJ5SW5zcGVjdChhLCBiKSB7XG4gIHJldHVybiBpbnNwZWN0KGEpIDwgaW5zcGVjdChiKSA/IC0xIDogMTtcbn07XG4iLCAiLyohXG4gKiBDaGFpIC0gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMob2JqZWN0KVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgZGlyZWN0bHktb3duZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBzeW1ib2xzIG9mIGFuXG4gKiBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc1xuICogcmV0dXJucyBib3RoIGVudW1lcmFibGUgYW5kIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHJldHVybnMge0FycmF5fVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMob2JqKSB7XG4gIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaikuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bSkuZW51bWVyYWJsZTtcbiAgfSk7XG59O1xuIiwgIi8qIVxuICogQ2hhaSAtIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTYgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKiFcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXNcbiAqL1xuXG52YXIgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyA9IHJlcXVpcmUoJy4vZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scycpO1xuXG4vKipcbiAqICMjIyAuZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMob2JqZWN0KVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgZGlyZWN0bHktb3duZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYW4gb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIE9iamVjdC5rZXlzIG9ubHlcbiAqIHJldHVybnMgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcywgbm90IGVudW1lcmFibGUgcHJvcGVydHkgc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5jb25jYXQoZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKiAhXG4gKiBDaGFpIC0gY2hlY2tFcnJvciB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmNoZWNrRXJyb3JcbiAqXG4gKiBDaGVja3MgdGhhdCBhbiBlcnJvciBjb25mb3JtcyB0byBhIGdpdmVuIHNldCBvZiBjcml0ZXJpYSBhbmQvb3IgcmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IGl0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuLyoqXG4gKiAjIyMgLmNvbXBhdGlibGVJbnN0YW5jZSh0aHJvd24sIGVycm9yTGlrZSlcbiAqXG4gKiBDaGVja3MgaWYgdHdvIGluc3RhbmNlcyBhcmUgY29tcGF0aWJsZSAoc3RyaWN0IGVxdWFsKS5cbiAqIFJldHVybnMgZmFsc2UgaWYgZXJyb3JMaWtlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBFcnJvciwgYmVjYXVzZSBpbnN0YW5jZXNcbiAqIGNhbiBvbmx5IGJlIGNvbXBhdGlibGUgaWYgdGhleSdyZSBib3RoIGVycm9yIGluc3RhbmNlcy5cbiAqXG4gKiBAbmFtZSBjb21wYXRpYmxlSW5zdGFuY2VcbiAqIEBwYXJhbSB7RXJyb3J9IHRocm93biBlcnJvclxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2Ugb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuXG4vKipcbiAqICMjIyAuY29tcGF0aWJsZUNvbnN0cnVjdG9yKHRocm93biwgZXJyb3JMaWtlKVxuICpcbiAqIENoZWNrcyBpZiB0d28gY29uc3RydWN0b3JzIGFyZSBjb21wYXRpYmxlLlxuICogVGhpcyBmdW5jdGlvbiBjYW4gcmVjZWl2ZSBlaXRoZXIgYW4gZXJyb3IgY29uc3RydWN0b3Igb3JcbiAqIGFuIGVycm9yIGluc3RhbmNlIGFzIHRoZSBgZXJyb3JMaWtlYCBhcmd1bWVudC5cbiAqIENvbnN0cnVjdG9ycyBhcmUgY29tcGF0aWJsZSBpZiB0aGV5J3JlIHRoZSBzYW1lIG9yIGlmIG9uZSBpc1xuICogYW4gaW5zdGFuY2Ugb2YgYW5vdGhlci5cbiAqXG4gKiBAbmFtZSBjb21wYXRpYmxlQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXJyb3J9IHRocm93biBlcnJvclxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2Ugb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgLy8gSWYgYGVycm9yTGlrZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYW55IGVycm9yIHdlIGNvbXBhcmUgdGhlaXIgY29uc3RydWN0b3JzXG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmIChlcnJvckxpa2UucHJvdG90eXBlIGluc3RhbmNlb2YgRXJyb3IgfHwgZXJyb3JMaWtlID09PSBFcnJvcikge1xuICAgIC8vIElmIGBlcnJvckxpa2VgIGlzIGEgY29uc3RydWN0b3IgdGhhdCBpbmhlcml0cyBmcm9tIEVycm9yLCB3ZSBjb21wYXJlIGB0aHJvd25gIHRvIGBlcnJvckxpa2VgIGRpcmVjdGx5XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiAjIyMgLmNvbXBhdGlibGVNZXNzYWdlKHRocm93biwgZXJyTWF0Y2hlcilcbiAqXG4gKiBDaGVja3MgaWYgYW4gZXJyb3IncyBtZXNzYWdlIGlzIGNvbXBhdGlibGUgd2l0aCBhIG1hdGNoZXIgKFN0cmluZyBvciBSZWdFeHApLlxuICogSWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIFN0cmluZyBvciBwYXNzZXMgdGhlIFJlZ0V4cCB0ZXN0LFxuICogaXQgaXMgY29uc2lkZXJlZCBjb21wYXRpYmxlLlxuICpcbiAqIEBuYW1lIGNvbXBhdGlibGVNZXNzYWdlXG4gKiBAcGFyYW0ge0Vycm9yfSB0aHJvd24gZXJyb3JcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gZXJyTWF0Y2hlciB0byBsb29rIGZvciBpbnRvIHRoZSBtZXNzYWdlXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNvbXBhdGlibGVNZXNzYWdlKHRocm93biwgZXJyTWF0Y2hlcikge1xuICB2YXIgY29tcGFyaXNvblN0cmluZyA9IHR5cGVvZiB0aHJvd24gPT09ICdzdHJpbmcnID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChlcnJNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIGVyck1hdGNoZXIudGVzdChjb21wYXJpc29uU3RyaW5nKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyTWF0Y2hlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogIyMjIC5nZXRGdW5jdGlvbk5hbWUoY29uc3RydWN0b3JGbilcbiAqXG4gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24uXG4gKiBUaGlzIGFsc28gaW5jbHVkZXMgYSBwb2x5ZmlsbCBmdW5jdGlvbiBpZiBgY29uc3RydWN0b3JGbi5uYW1lYCBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAbmFtZSBnZXRGdW5jdGlvbk5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yRm5cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciBmdW5jdGlvbk5hbWVNYXRjaCA9IC9cXHMqZnVuY3Rpb24oPzpcXHN8XFxzKlxcL1xcKlteKD86KlxcLyldK1xcKlxcL1xccyopKihbXlxcKFxcL10rKS87XG5mdW5jdGlvbiBnZXRGdW5jdGlvbk5hbWUoY29uc3RydWN0b3JGbikge1xuICB2YXIgbmFtZSA9ICcnO1xuICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yRm4ubmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBIZXJlIHdlIHJ1biBhIHBvbHlmaWxsIGlmIGNvbnN0cnVjdG9yRm4ubmFtZSBpcyBub3QgZGVmaW5lZFxuICAgIHZhciBtYXRjaCA9IFN0cmluZyhjb25zdHJ1Y3RvckZuKS5tYXRjaChmdW5jdGlvbk5hbWVNYXRjaCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5hbWUgPSBjb25zdHJ1Y3RvckZuLm5hbWU7XG4gIH1cblxuICByZXR1cm4gbmFtZTtcbn1cblxuLyoqXG4gKiAjIyMgLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpXG4gKlxuICogR2V0cyB0aGUgY29uc3RydWN0b3IgbmFtZSBmb3IgYW4gRXJyb3IgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IgaXRzZWxmLlxuICpcbiAqIEBuYW1lIGdldENvbnN0cnVjdG9yTmFtZVxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2VcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkge1xuICB2YXIgY29uc3RydWN0b3JOYW1lID0gZXJyb3JMaWtlO1xuICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBjb25zdHJ1Y3Rvck5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZXJyb3JMaWtlLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgYGVycmAgaXMgbm90IGFuIGluc3RhbmNlIG9mIEVycm9yIGl0IGlzIGFuIGVycm9yIGNvbnN0cnVjdG9yIGl0c2VsZiBvciBhbm90aGVyIGZ1bmN0aW9uLlxuICAgIC8vIElmIHdlJ3ZlIGdvdCBhIGNvbW1vbiBmdW5jdGlvbiB3ZSBnZXQgaXRzIG5hbWUsIG90aGVyd2lzZSB3ZSBtYXkgbmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2VcbiAgICAvLyBvZiB0aGUgZXJyb3IganVzdCBpbiBjYXNlIGl0J3MgYSBwb29ybHktY29uc3RydWN0ZWQgZXJyb3IuIFBsZWFzZSBzZWUgY2hhaWpzL2NoYWkvaXNzdWVzLzQ1IHRvIGtub3cgbW9yZS5cbiAgICBjb25zdHJ1Y3Rvck5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZXJyb3JMaWtlKS50cmltKCkgfHxcbiAgICAgICAgZ2V0RnVuY3Rpb25OYW1lKG5ldyBlcnJvckxpa2UoKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cblxuLyoqXG4gKiAjIyMgLmdldE1lc3NhZ2UoZXJyb3JMaWtlKVxuICpcbiAqIEdldHMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSBhbiBlcnJvci5cbiAqIElmIGBlcnJgIGlzIGEgU3RyaW5nIGl0c2VsZiwgd2UgcmV0dXJuIGl0LlxuICogSWYgdGhlIGVycm9yIGhhcyBubyBtZXNzYWdlLCB3ZSByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLlxuICpcbiAqIEBuYW1lIGdldE1lc3NhZ2VcbiAqIEBwYXJhbSB7RXJyb3J8U3RyaW5nfSBlcnJvckxpa2VcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgdmFyIG1zZyA9ICcnO1xuICBpZiAoZXJyb3JMaWtlICYmIGVycm9yTGlrZS5tZXNzYWdlKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yTGlrZSA9PT0gJ3N0cmluZycpIHtcbiAgICBtc2cgPSBlcnJvckxpa2U7XG4gIH1cblxuICByZXR1cm4gbXNnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGF0aWJsZUluc3RhbmNlOiBjb21wYXRpYmxlSW5zdGFuY2UsXG4gIGNvbXBhdGlibGVDb25zdHJ1Y3RvcjogY29tcGF0aWJsZUNvbnN0cnVjdG9yLFxuICBjb21wYXRpYmxlTWVzc2FnZTogY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldE1lc3NhZ2U6IGdldE1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogZ2V0Q29uc3RydWN0b3JOYW1lLFxufTtcbiIsICIvKiFcbiAqIENoYWkgLSBpc05hTiB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE1IFNha3RoaXByaXlhbiBWYWlyYW1hbmkgPHRoZWNoYXJnaW5ndm9sY2Fub0BnbWFpbC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuaXNOYU4odmFsdWUpXG4gKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBOYU4gb3Igbm90LlxuICpcbiAqICAgICB1dGlscy5pc05hTihOYU4pOyAvLyB0cnVlXG4gKlxuICogQHBhcmFtIHtWYWx1ZX0gVGhlIHZhbHVlIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkIGlmIGl0IGlzIE5hTlxuICogQG5hbWUgaXNOYU5cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gIC8vIFJlZmVyIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pc25hbi1udW1iZXJcbiAgLy8gc2VjdGlvbidzIE5PVEUuXG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbi8vIElmIEVDTUFTY3JpcHQgNidzIE51bWJlci5pc05hTiBpcyBwcmVzZW50LCBwcmVmZXIgdGhhdC5cbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzTmFOIHx8IGlzTmFOO1xuIiwgInZhciB0eXBlID0gcmVxdWlyZSgndHlwZS1kZXRlY3QnKTtcblxudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcblxuZnVuY3Rpb24gaXNPYmplY3RUeXBlKG9iaikge1xuICB2YXIgb2JqZWN0VHlwZSA9IHR5cGUob2JqKTtcbiAgdmFyIG9iamVjdFR5cGVzID0gWydBcnJheScsICdPYmplY3QnLCAnZnVuY3Rpb24nXTtcblxuICByZXR1cm4gb2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlKSAhPT0gLTE7XG59XG5cbi8qKlxuICogIyMjIC5nZXRPcGVyYXRvcihtZXNzYWdlKVxuICpcbiAqIEV4dHJhY3QgdGhlIG9wZXJhdG9yIGZyb20gZXJyb3IgbWVzc2FnZS5cbiAqIE9wZXJhdG9yIGRlZmluZWQgaXMgYmFzZWQgb24gYmVsb3cgbGlua1xuICogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9hc3NlcnQuaHRtbCNhc3NlcnRfYXNzZXJ0LlxuICpcbiAqIFJldHVybnMgdGhlIGBvcGVyYXRvcmAgb3IgYHVuZGVmaW5lZGAgdmFsdWUgZm9yIGFuIEFzc2VydGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IChjb25zdHJ1Y3RlZCBBc3NlcnRpb24pXG4gKiBAcGFyYW0ge0FyZ3VtZW50c30gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmFzc2VydCBhcmd1bWVudHNcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldE9wZXJhdG9yXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3BlcmF0b3Iob2JqLCBhcmdzKSB7XG4gIHZhciBvcGVyYXRvciA9IGZsYWcob2JqLCAnb3BlcmF0b3InKTtcbiAgdmFyIG5lZ2F0ZSA9IGZsYWcob2JqLCAnbmVnYXRlJyk7XG4gIHZhciBleHBlY3RlZCA9IGFyZ3NbM107XG4gIHZhciBtc2cgPSBuZWdhdGUgPyBhcmdzWzJdIDogYXJnc1sxXTtcblxuICBpZiAob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cblxuICBpZiAodHlwZW9mIG1zZyA9PT0gJ2Z1bmN0aW9uJykgbXNnID0gbXNnKCk7XG5cbiAgbXNnID0gbXNnIHx8ICcnO1xuICBpZiAoIW1zZykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoL1xcc2hhdmVcXHMvLnRlc3QobXNnKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgaXNPYmplY3QgPSBpc09iamVjdFR5cGUoZXhwZWN0ZWQpO1xuICBpZiAoL1xcc25vdFxccy8udGVzdChtc2cpKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0ID8gJ25vdERlZXBTdHJpY3RFcXVhbCcgOiAnbm90U3RyaWN0RXF1YWwnO1xuICB9XG5cbiAgcmV0dXJuIGlzT2JqZWN0ID8gJ2RlZXBTdHJpY3RFcXVhbCcgOiAnc3RyaWN0RXF1YWwnO1xufTtcbiIsICIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExIEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBEZXBlbmRlbmNpZXMgdGhhdCBhcmUgdXNlZCBmb3IgbXVsdGlwbGUgZXhwb3J0cyBhcmUgcmVxdWlyZWQgaGVyZSBvbmx5IG9uY2VcbiAqL1xuXG52YXIgcGF0aHZhbCA9IHJlcXVpcmUoJ3BhdGh2YWwnKTtcblxuLyohXG4gKiB0ZXN0IHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLnRlc3QgPSByZXF1aXJlKCcuL3Rlc3QnKTtcblxuLyohXG4gKiB0eXBlIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLnR5cGUgPSByZXF1aXJlKCd0eXBlLWRldGVjdCcpO1xuXG4vKiFcbiAqIGV4cGVjdFR5cGVzIHV0aWxpdHlcbiAqL1xuZXhwb3J0cy5leHBlY3RUeXBlcyA9IHJlcXVpcmUoJy4vZXhwZWN0VHlwZXMnKTtcblxuLyohXG4gKiBtZXNzYWdlIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLmdldE1lc3NhZ2UgPSByZXF1aXJlKCcuL2dldE1lc3NhZ2UnKTtcblxuLyohXG4gKiBhY3R1YWwgdXRpbGl0eVxuICovXG5cbmV4cG9ydHMuZ2V0QWN0dWFsID0gcmVxdWlyZSgnLi9nZXRBY3R1YWwnKTtcblxuLyohXG4gKiBJbnNwZWN0IHV0aWxcbiAqL1xuXG5leHBvcnRzLmluc3BlY3QgPSByZXF1aXJlKCcuL2luc3BlY3QnKTtcblxuLyohXG4gKiBPYmplY3QgRGlzcGxheSB1dGlsXG4gKi9cblxuZXhwb3J0cy5vYmpEaXNwbGF5ID0gcmVxdWlyZSgnLi9vYmpEaXNwbGF5Jyk7XG5cbi8qIVxuICogRmxhZyB1dGlsaXR5XG4gKi9cblxuZXhwb3J0cy5mbGFnID0gcmVxdWlyZSgnLi9mbGFnJyk7XG5cbi8qIVxuICogRmxhZyB0cmFuc2ZlcnJpbmcgdXRpbGl0eVxuICovXG5cbmV4cG9ydHMudHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKiFcbiAqIERlZXAgZXF1YWwgdXRpbGl0eVxuICovXG5cbmV4cG9ydHMuZXFsID0gcmVxdWlyZSgnZGVlcC1lcWwnKTtcblxuLyohXG4gKiBEZWVwIHBhdGggaW5mb1xuICovXG5cbmV4cG9ydHMuZ2V0UGF0aEluZm8gPSBwYXRodmFsLmdldFBhdGhJbmZvO1xuXG4vKiFcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgZXhpc3RzXG4gKi9cblxuZXhwb3J0cy5oYXNQcm9wZXJ0eSA9IHBhdGh2YWwuaGFzUHJvcGVydHk7XG5cbi8qIVxuICogRnVuY3Rpb24gbmFtZVxuICovXG5cbmV4cG9ydHMuZ2V0TmFtZSA9IHJlcXVpcmUoJ2dldC1mdW5jLW5hbWUnKTtcblxuLyohXG4gKiBhZGQgUHJvcGVydHlcbiAqL1xuXG5leHBvcnRzLmFkZFByb3BlcnR5ID0gcmVxdWlyZSgnLi9hZGRQcm9wZXJ0eScpO1xuXG4vKiFcbiAqIGFkZCBNZXRob2RcbiAqL1xuXG5leHBvcnRzLmFkZE1ldGhvZCA9IHJlcXVpcmUoJy4vYWRkTWV0aG9kJyk7XG5cbi8qIVxuICogb3ZlcndyaXRlIFByb3BlcnR5XG4gKi9cblxuZXhwb3J0cy5vdmVyd3JpdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vb3ZlcndyaXRlUHJvcGVydHknKTtcblxuLyohXG4gKiBvdmVyd3JpdGUgTWV0aG9kXG4gKi9cblxuZXhwb3J0cy5vdmVyd3JpdGVNZXRob2QgPSByZXF1aXJlKCcuL292ZXJ3cml0ZU1ldGhvZCcpO1xuXG4vKiFcbiAqIEFkZCBhIGNoYWluYWJsZSBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmFkZENoYWluYWJsZU1ldGhvZCA9IHJlcXVpcmUoJy4vYWRkQ2hhaW5hYmxlTWV0aG9kJyk7XG5cbi8qIVxuICogT3ZlcndyaXRlIGNoYWluYWJsZSBtZXRob2RcbiAqL1xuXG5leHBvcnRzLm92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCA9IHJlcXVpcmUoJy4vb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kJyk7XG5cbi8qIVxuICogQ29tcGFyZSBieSBpbnNwZWN0IG1ldGhvZFxuICovXG5cbmV4cG9ydHMuY29tcGFyZUJ5SW5zcGVjdCA9IHJlcXVpcmUoJy4vY29tcGFyZUJ5SW5zcGVjdCcpO1xuXG4vKiFcbiAqIEdldCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBzeW1ib2xzIG1ldGhvZFxuICovXG5cbmV4cG9ydHMuZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyA9IHJlcXVpcmUoJy4vZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scycpO1xuXG4vKiFcbiAqIEdldCBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG1ldGhvZFxuICovXG5cbmV4cG9ydHMuZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2dldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzJyk7XG5cbi8qIVxuICogQ2hlY2tzIGVycm9yIGFnYWluc3QgYSBnaXZlbiBzZXQgb2YgY3JpdGVyaWFcbiAqL1xuXG5leHBvcnRzLmNoZWNrRXJyb3IgPSByZXF1aXJlKCdjaGVjay1lcnJvcicpO1xuXG4vKiFcbiAqIFByb3hpZnkgdXRpbFxuICovXG5cbmV4cG9ydHMucHJveGlmeSA9IHJlcXVpcmUoJy4vcHJveGlmeScpO1xuXG4vKiFcbiAqIGFkZExlbmd0aEd1YXJkIHV0aWxcbiAqL1xuXG5leHBvcnRzLmFkZExlbmd0aEd1YXJkID0gcmVxdWlyZSgnLi9hZGRMZW5ndGhHdWFyZCcpO1xuXG4vKiFcbiAqIGlzUHJveHlFbmFibGVkIGhlbHBlclxuICovXG5cbmV4cG9ydHMuaXNQcm94eUVuYWJsZWQgPSByZXF1aXJlKCcuL2lzUHJveHlFbmFibGVkJyk7XG5cbi8qIVxuICogaXNOYU4gbWV0aG9kXG4gKi9cblxuZXhwb3J0cy5pc05hTiA9IHJlcXVpcmUoJy4vaXNOYU4nKTtcblxuLyohXG4gKiBnZXRPcGVyYXRvciBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmdldE9wZXJhdG9yID0gcmVxdWlyZSgnLi9nZXRPcGVyYXRvcicpOyIsICIvKiFcbiAqIGNoYWlcbiAqIGh0dHA6Ly9jaGFpanMuY29tXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKF9jaGFpLCB1dGlsKSB7XG4gIC8qIVxuICAgKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICAgKi9cblxuICB2YXIgQXNzZXJ0aW9uRXJyb3IgPSBfY2hhaS5Bc3NlcnRpb25FcnJvclxuICAgICwgZmxhZyA9IHV0aWwuZmxhZztcblxuICAvKiFcbiAgICogTW9kdWxlIGV4cG9ydC5cbiAgICovXG5cbiAgX2NoYWkuQXNzZXJ0aW9uID0gQXNzZXJ0aW9uO1xuXG4gIC8qIVxuICAgKiBBc3NlcnRpb24gQ29uc3RydWN0b3JcbiAgICpcbiAgICogQ3JlYXRlcyBvYmplY3QgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBgQXNzZXJ0aW9uYCBvYmplY3RzIGNvbnRhaW4gbWV0YWRhdGEgaW4gdGhlIGZvcm0gb2YgZmxhZ3MuIFRocmVlIGZsYWdzIGNhblxuICAgKiBiZSBhc3NpZ25lZCBkdXJpbmcgaW5zdGFudGlhdGlvbiBieSBwYXNzaW5nIGFyZ3VtZW50cyB0byB0aGlzIGNvbnN0cnVjdG9yOlxuICAgKlxuICAgKiAtIGBvYmplY3RgOiBUaGlzIGZsYWcgY29udGFpbnMgdGhlIHRhcmdldCBvZiB0aGUgYXNzZXJ0aW9uLiBGb3IgZXhhbXBsZSwgaW5cbiAgICogICB0aGUgYXNzZXJ0aW9uIGBleHBlY3QobnVtS2l0dGVucykudG8uZXF1YWwoNyk7YCwgdGhlIGBvYmplY3RgIGZsYWcgd2lsbFxuICAgKiAgIGNvbnRhaW4gYG51bUtpdHRlbnNgIHNvIHRoYXQgdGhlIGBlcXVhbGAgYXNzZXJ0aW9uIGNhbiByZWZlcmVuY2UgaXQgd2hlblxuICAgKiAgIG5lZWRlZC5cbiAgICpcbiAgICogLSBgbWVzc2FnZWA6IFRoaXMgZmxhZyBjb250YWlucyBhbiBvcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZVxuICAgKiAgIHByZXBlbmRlZCB0byB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0J3MgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlcnRpb24gd2hlbiBpdFxuICAgKiAgIGZhaWxzLlxuICAgKlxuICAgKiAtIGBzc2ZpYDogVGhpcyBmbGFnIHN0YW5kcyBmb3IgXCJzdGFydCBzdGFjayBmdW5jdGlvbiBpbmRpY2F0b3JcIi4gSXRcbiAgICogICBjb250YWlucyBhIGZ1bmN0aW9uIHJlZmVyZW5jZSB0aGF0IHNlcnZlcyBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAqICAgcmVtb3ZpbmcgZnJhbWVzIGZyb20gdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBlcnJvciB0aGF0J3MgY3JlYXRlZCBieSB0aGVcbiAgICogICBhc3NlcnRpb24gd2hlbiBpdCBmYWlscy4gVGhlIGdvYWwgaXMgdG8gcHJvdmlkZSBhIGNsZWFuZXIgc3RhY2sgdHJhY2UgdG9cbiAgICogICBlbmQgdXNlcnMgYnkgcmVtb3ZpbmcgQ2hhaSdzIGludGVybmFsIGZ1bmN0aW9ucy4gTm90ZSB0aGF0IGl0IG9ubHkgd29ya3NcbiAgICogICBpbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IGBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZWAsIGFuZCBvbmx5IHdoZW5cbiAgICogICBgQ2hhaS5jb25maWcuaW5jbHVkZVN0YWNrYCBoYXNuJ3QgYmVlbiBzZXQgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogLSBgbG9ja1NzZmlgOiBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGBzc2ZpYCBmbGFnXG4gICAqICAgc2hvdWxkIHJldGFpbiBpdHMgY3VycmVudCB2YWx1ZSwgZXZlbiBhcyBhc3NlcnRpb25zIGFyZSBjaGFpbmVkIG9mZiBvZlxuICAgKiAgIHRoaXMgb2JqZWN0LiBUaGlzIGlzIHVzdWFsbHkgc2V0IHRvIGB0cnVlYCB3aGVuIGNyZWF0aW5nIGEgbmV3IGFzc2VydGlvblxuICAgKiAgIGZyb20gd2l0aGluIGFub3RoZXIgYXNzZXJ0aW9uLiBJdCdzIGFsc28gdGVtcG9yYXJpbHkgc2V0IHRvIGB0cnVlYCBiZWZvcmVcbiAgICogICBhbiBvdmVyd3JpdHRlbiBhc3NlcnRpb24gZ2V0cyBjYWxsZWQgYnkgdGhlIG92ZXJ3cml0aW5nIGFzc2VydGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqIHRhcmdldCBvZiB0aGUgYXNzZXJ0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgKG9wdGlvbmFsKSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzc2ZpIChvcHRpb25hbCkgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIHN0YWNrIGZyYW1lc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGxvY2tTc2ZpIChvcHRpb25hbCkgd2hldGhlciBvciBub3QgdGhlIHNzZmkgZmxhZyBpcyBsb2NrZWRcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGZ1bmN0aW9uIEFzc2VydGlvbiAob2JqLCBtc2csIHNzZmksIGxvY2tTc2ZpKSB7XG4gICAgZmxhZyh0aGlzLCAnc3NmaScsIHNzZmkgfHwgQXNzZXJ0aW9uKTtcbiAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIGxvY2tTc2ZpKTtcbiAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBvYmopO1xuICAgIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuXG4gICAgcmV0dXJuIHV0aWwucHJveGlmeSh0aGlzKTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3NlcnRpb24sICdpbmNsdWRlU3RhY2snLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzZXJ0aW9uLmluY2x1ZGVTdGFjayBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrIGluc3RlYWQuJyk7XG4gICAgICByZXR1cm4gY29uZmlnLmluY2x1ZGVTdGFjaztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzZXJ0aW9uLmluY2x1ZGVTdGFjayBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrIGluc3RlYWQuJyk7XG4gICAgICBjb25maWcuaW5jbHVkZVN0YWNrID0gdmFsdWU7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXNzZXJ0aW9uLCAnc2hvd0RpZmYnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzZXJ0aW9uLnNob3dEaWZmIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5zaG93RGlmZiBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuIGNvbmZpZy5zaG93RGlmZjtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXNzZXJ0aW9uLnNob3dEaWZmIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5zaG93RGlmZiBpbnN0ZWFkLicpO1xuICAgICAgY29uZmlnLnNob3dEaWZmID0gdmFsdWU7XG4gICAgfVxuICB9KTtcblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgICB1dGlsLmFkZFByb3BlcnR5KHRoaXMucHJvdG90eXBlLCBuYW1lLCBmbik7XG4gIH07XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCA9IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICAgIHV0aWwuYWRkTWV0aG9kKHRoaXMucHJvdG90eXBlLCBuYW1lLCBmbik7XG4gIH07XG5cbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCA9IGZ1bmN0aW9uIChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIHV0aWwuYWRkQ2hhaW5hYmxlTWV0aG9kKHRoaXMucHJvdG90eXBlLCBuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcik7XG4gIH07XG5cbiAgQXNzZXJ0aW9uLm92ZXJ3cml0ZVByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgdXRpbC5vdmVyd3JpdGVQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xuICB9O1xuXG4gIEFzc2VydGlvbi5vdmVyd3JpdGVNZXRob2QgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgICB1dGlsLm92ZXJ3cml0ZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xuICB9O1xuXG4gIEFzc2VydGlvbi5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QgPSBmdW5jdGlvbiAobmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgICB1dGlsLm92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmFzc2VydChleHByZXNzaW9uLCBtZXNzYWdlLCBuZWdhdGVNZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBzaG93RGlmZilcbiAgICpcbiAgICogRXhlY3V0ZXMgYW4gZXhwcmVzc2lvbiBhbmQgY2hlY2sgZXhwZWN0YXRpb25zLiBUaHJvd3MgQXNzZXJ0aW9uRXJyb3IgZm9yIHJlcG9ydGluZyBpZiB0ZXN0IGRvZXNuJ3QgcGFzcy5cbiAgICpcbiAgICogQG5hbWUgYXNzZXJ0XG4gICAqIEBwYXJhbSB7UGhpbG9zb3BoaWNhbH0gZXhwcmVzc2lvbiB0byBiZSB0ZXN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1lc3NhZ2Ugb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIG1lc3NhZ2UgdG8gZGlzcGxheSBpZiBleHByZXNzaW9uIGZhaWxzXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBuZWdhdGVkTWVzc2FnZSBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbmVnYXRlZE1lc3NhZ2UgdG8gZGlzcGxheSBpZiBuZWdhdGVkIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWQgdmFsdWUgKHJlbWVtYmVyIHRvIGNoZWNrIGZvciBuZWdhdGlvbilcbiAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsIChvcHRpb25hbCkgd2lsbCBkZWZhdWx0IHRvIGB0aGlzLm9iamBcbiAgICogQHBhcmFtIHtCb29sZWFufSBzaG93RGlmZiAob3B0aW9uYWwpIHdoZW4gc2V0IHRvIGB0cnVlYCwgYXNzZXJ0IHdpbGwgZGlzcGxheSBhIGRpZmYgaW4gYWRkaXRpb24gdG8gdGhlIG1lc3NhZ2UgaWYgZXhwcmVzc2lvbiBmYWlsc1xuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgQXNzZXJ0aW9uLnByb3RvdHlwZS5hc3NlcnQgPSBmdW5jdGlvbiAoZXhwciwgbXNnLCBuZWdhdGVNc2csIGV4cGVjdGVkLCBfYWN0dWFsLCBzaG93RGlmZikge1xuICAgIHZhciBvayA9IHV0aWwudGVzdCh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChmYWxzZSAhPT0gc2hvd0RpZmYpIHNob3dEaWZmID0gdHJ1ZTtcbiAgICBpZiAodW5kZWZpbmVkID09PSBleHBlY3RlZCAmJiB1bmRlZmluZWQgPT09IF9hY3R1YWwpIHNob3dEaWZmID0gZmFsc2U7XG4gICAgaWYgKHRydWUgIT09IGNvbmZpZy5zaG93RGlmZikgc2hvd0RpZmYgPSBmYWxzZTtcblxuICAgIGlmICghb2spIHtcbiAgICAgIG1zZyA9IHV0aWwuZ2V0TWVzc2FnZSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdmFyIGFjdHVhbCA9IHV0aWwuZ2V0QWN0dWFsKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB2YXIgYXNzZXJ0aW9uRXJyb3JPYmplY3RQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgIGFjdHVhbDogYWN0dWFsXG4gICAgICAgICwgZXhwZWN0ZWQ6IGV4cGVjdGVkXG4gICAgICAgICwgc2hvd0RpZmY6IHNob3dEaWZmXG4gICAgICB9O1xuXG4gICAgICB2YXIgb3BlcmF0b3IgPSB1dGlsLmdldE9wZXJhdG9yKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAob3BlcmF0b3IpIHtcbiAgICAgICAgYXNzZXJ0aW9uRXJyb3JPYmplY3RQcm9wZXJ0aWVzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgbXNnLFxuICAgICAgICBhc3NlcnRpb25FcnJvck9iamVjdFByb3BlcnRpZXMsXG4gICAgICAgIChjb25maWcuaW5jbHVkZVN0YWNrKSA/IHRoaXMuYXNzZXJ0IDogZmxhZyh0aGlzLCAnc3NmaScpKTtcbiAgICB9XG4gIH07XG5cbiAgLyohXG4gICAqICMjIyAuX29ialxuICAgKlxuICAgKiBRdWljayByZWZlcmVuY2UgdG8gc3RvcmVkIGBhY3R1YWxgIHZhbHVlIGZvciBwbHVnaW4gZGV2ZWxvcGVycy5cbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3NlcnRpb24ucHJvdG90eXBlLCAnX29iaicsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZsYWcodGhpcywgJ29iamVjdCcpO1xuICAgICAgfVxuICAgICwgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIGZsYWcodGhpcywgJ29iamVjdCcsIHZhbCk7XG4gICAgICB9XG4gIH0pO1xufTtcbiIsICIvKiFcbiAqIGNoYWlcbiAqIGh0dHA6Ly9jaGFpanMuY29tXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2hhaSwgXykge1xuICB2YXIgQXNzZXJ0aW9uID0gY2hhaS5Bc3NlcnRpb25cbiAgICAsIEFzc2VydGlvbkVycm9yID0gY2hhaS5Bc3NlcnRpb25FcnJvclxuICAgICwgZmxhZyA9IF8uZmxhZztcblxuICAvKipcbiAgICogIyMjIExhbmd1YWdlIENoYWluc1xuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGFyZSBwcm92aWRlZCBhcyBjaGFpbmFibGUgZ2V0dGVycyB0byBpbXByb3ZlIHRoZSByZWFkYWJpbGl0eVxuICAgKiBvZiB5b3VyIGFzc2VydGlvbnMuXG4gICAqXG4gICAqICoqQ2hhaW5zKipcbiAgICpcbiAgICogLSB0b1xuICAgKiAtIGJlXG4gICAqIC0gYmVlblxuICAgKiAtIGlzXG4gICAqIC0gdGhhdFxuICAgKiAtIHdoaWNoXG4gICAqIC0gYW5kXG4gICAqIC0gaGFzXG4gICAqIC0gaGF2ZVxuICAgKiAtIHdpdGhcbiAgICogLSBhdFxuICAgKiAtIG9mXG4gICAqIC0gc2FtZVxuICAgKiAtIGJ1dFxuICAgKiAtIGRvZXNcbiAgICogLSBzdGlsbFxuICAgKiAtIGFsc29cbiAgICpcbiAgICogQG5hbWUgbGFuZ3VhZ2UgY2hhaW5zXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIFsgJ3RvJywgJ2JlJywgJ2JlZW4nLCAnaXMnXG4gICwgJ2FuZCcsICdoYXMnLCAnaGF2ZScsICd3aXRoJ1xuICAsICd0aGF0JywgJ3doaWNoJywgJ2F0JywgJ29mJ1xuICAsICdzYW1lJywgJ2J1dCcsICdkb2VzJywgJ3N0aWxsJywgXCJhbHNvXCIgXS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFpbikge1xuICAgIEFzc2VydGlvbi5hZGRQcm9wZXJ0eShjaGFpbik7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdFxuICAgKlxuICAgKiBOZWdhdGVzIGFsbCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbi5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7fSkudG8ubm90LnRocm93KCk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uYmUuYW4oJ2FycmF5JykudGhhdC5kb2VzLm5vdC5pbmNsdWRlKDMpO1xuICAgKlxuICAgKiBKdXN0IGJlY2F1c2UgeW91IGNhbiBuZWdhdGUgYW55IGFzc2VydGlvbiB3aXRoIGAubm90YCBkb2Vzbid0IG1lYW4geW91XG4gICAqIHNob3VsZC4gV2l0aCBncmVhdCBwb3dlciBjb21lcyBncmVhdCByZXNwb25zaWJpbGl0eS4gSXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCB0aGF0IHRoZSBvbmUgZXhwZWN0ZWQgb3V0cHV0IHdhcyBwcm9kdWNlZCwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nXG4gICAqIHRoYXQgb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIG91dHB1dHMgd2Fzbid0IHByb2R1Y2VkLiBTZWUgaW5kaXZpZHVhbFxuICAgKiBhc3NlcnRpb25zIGZvciBzcGVjaWZpYyBndWlkYW5jZS5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5ub3QuZXF1YWwoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBAbmFtZSBub3RcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdub3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnbmVnYXRlJywgdHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlZXBcbiAgICpcbiAgICogQ2F1c2VzIGFsbCBgLmVxdWFsYCwgYC5pbmNsdWRlYCwgYC5tZW1iZXJzYCwgYC5rZXlzYCwgYW5kIGAucHJvcGVydHlgXG4gICAqIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5IGluc3RlYWQgb2Ygc3RyaWN0XG4gICAqIChgPT09YCkgZXF1YWxpdHkuIFNlZSB0aGUgYGRlZXAtZXFsYCBwcm9qZWN0IHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXBcbiAgICogZXF1YWxpdHkgYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGVxdWFscyBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uZGVlcC5lcXVhbCh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmVxdWFsKHthOiAxfSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBpbmNsdWRlcyBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KFt7YTogMX1dKS50by5kZWVwLmluY2x1ZGUoe2E6IDF9KTtcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8ubm90LmluY2x1ZGUoe2E6IDF9KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBpbmNsdWRlcyBgeDoge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5kZWVwLmluY2x1ZGUoe3g6IHthOiAxfX0pO1xuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5ub3QuaW5jbHVkZSh7eDoge2E6IDF9fSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBoYXMgbWVtYmVyIGB7YTogMX1gXG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLmhhdmUuZGVlcC5tZW1iZXJzKFt7YTogMX1dKTtcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8ubm90LmhhdmUubWVtYmVycyhbe2E6IDF9XSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgc2V0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIGtleSBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5oYXZlLmRlZXAua2V5cyhbe2E6IDF9XSk7XG4gICAqICAgICBleHBlY3QobmV3IFNldChbe2E6IDF9XSkpLnRvLm5vdC5oYXZlLmtleXMoW3thOiAxfV0pO1xuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGhhcyBwcm9wZXJ0eSBgeDoge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5oYXZlLmRlZXAucHJvcGVydHkoJ3gnLCB7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdkZWVwJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ2RlZXAnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAubmVzdGVkXG4gICAqXG4gICAqIEVuYWJsZXMgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBpbiBhbGwgYC5wcm9wZXJ0eWAgYW5kIGAuaW5jbHVkZWBcbiAgICogYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4uXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IHtiOiBbJ3gnLCAneSddfX0pLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KCdhLmJbMV0nKTtcbiAgICogICAgIGV4cGVjdCh7YToge2I6IFsneCcsICd5J119fSkudG8ubmVzdGVkLmluY2x1ZGUoeydhLmJbMV0nOiAneSd9KTtcbiAgICpcbiAgICogSWYgYC5gIG9yIGBbXWAgYXJlIHBhcnQgb2YgYW4gYWN0dWFsIHByb3BlcnR5IG5hbWUsIHRoZXkgY2FuIGJlIGVzY2FwZWQgYnlcbiAgICogYWRkaW5nIHR3byBiYWNrc2xhc2hlcyBiZWZvcmUgdGhlbS5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7Jy5hJzogeydbYl0nOiAneCd9fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ1xcXFwuYS5cXFxcW2JcXFxcXScpO1xuICAgKiAgICAgZXhwZWN0KHsnLmEnOiB7J1tiXSc6ICd4J319KS50by5uZXN0ZWQuaW5jbHVkZSh7J1xcXFwuYS5cXFxcW2JcXFxcXSc6ICd4J30pO1xuICAgKlxuICAgKiBgLm5lc3RlZGAgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggYC5vd25gLlxuICAgKlxuICAgKiBAbmFtZSBuZXN0ZWRcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCduZXN0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnbmVzdGVkJywgdHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLm93blxuICAgKlxuICAgKiBDYXVzZXMgYWxsIGAucHJvcGVydHlgIGFuZCBgLmluY2x1ZGVgIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluXG4gICAqIHRvIGlnbm9yZSBpbmhlcml0ZWQgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLm93bi5wcm9wZXJ0eSgnYScpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmhhdmUub3duLnByb3BlcnR5KCdiJyk7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5vd24uaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZSh7YjogMn0pLmJ1dC5ub3Qub3duLmluY2x1ZGUoe2I6IDJ9KTtcbiAgICpcbiAgICogYC5vd25gIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGAubmVzdGVkYC5cbiAgICpcbiAgICogQG5hbWUgb3duXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnb3duJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ293bicsIHRydWUpO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5vcmRlcmVkXG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5tZW1iZXJzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byByZXF1aXJlIHRoYXRcbiAgICogbWVtYmVycyBiZSBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmhhdmUub3JkZXJlZC5tZW1iZXJzKFsxLCAyXSlcbiAgICogICAgICAgLmJ1dC5ub3QuaGF2ZS5vcmRlcmVkLm1lbWJlcnMoWzIsIDFdKTtcbiAgICpcbiAgICogV2hlbiBgLmluY2x1ZGVgIGFuZCBgLm9yZGVyZWRgIGFyZSBjb21iaW5lZCwgdGhlIG9yZGVyaW5nIGJlZ2lucyBhdCB0aGVcbiAgICogc3RhcnQgb2YgYm90aCBhcnJheXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhbMSwgMl0pXG4gICAqICAgICAgIC5idXQubm90LmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKFsyLCAzXSk7XG4gICAqXG4gICAqIEBuYW1lIG9yZGVyZWRcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdvcmRlcmVkJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ29yZGVyZWQnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuYW55XG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5rZXlzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byBvbmx5IHJlcXVpcmUgdGhhdFxuICAgKiB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlbiBrZXlzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZlxuICAgKiBgLmFsbGAsIHdoaWNoIHJlcXVpcmVzIHRoYXQgdGhlIHRhcmdldCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLm5vdC5oYXZlLmFueS5rZXlzKCdjJywgJ2QnKTtcbiAgICpcbiAgICogU2VlIHRoZSBgLmtleXNgIGRvYyBmb3IgZ3VpZGFuY2Ugb24gd2hlbiB0byB1c2UgYC5hbnlgIG9yIGAuYWxsYC5cbiAgICpcbiAgICogQG5hbWUgYW55XG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnYW55JywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ2FueScsIHRydWUpO1xuICAgIGZsYWcodGhpcywgJ2FsbCcsIGZhbHNlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuYWxsXG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5rZXlzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byByZXF1aXJlIHRoYXQgdGhlXG4gICAqIHRhcmdldCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cy4gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgYC5hbnlgLCB3aGljaFxuICAgKiBvbmx5IHJlcXVpcmVzIHRoYXQgdGhlIHRhcmdldCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW4ga2V5cy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoJ2EnLCAnYicpO1xuICAgKlxuICAgKiBOb3RlIHRoYXQgYC5hbGxgIGlzIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5laXRoZXIgYC5hbGxgIG5vciBgLmFueWAgYXJlXG4gICAqIGFkZGVkIGVhcmxpZXIgaW4gdGhlIGNoYWluLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYWRkIGAuYWxsYCBhbnl3YXlcbiAgICogYmVjYXVzZSBpdCBpbXByb3ZlcyByZWFkYWJpbGl0eS5cbiAgICpcbiAgICogU2VlIHRoZSBgLmtleXNgIGRvYyBmb3IgZ3VpZGFuY2Ugb24gd2hlbiB0byB1c2UgYC5hbnlgIG9yIGAuYWxsYC5cbiAgICpcbiAgICogQG5hbWUgYWxsXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnYWxsJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ2FsbCcsIHRydWUpO1xuICAgIGZsYWcodGhpcywgJ2FueScsIGZhbHNlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuYSh0eXBlWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQncyB0eXBlIGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBzdHJpbmcgYHR5cGVgLiBUeXBlc1xuICAgKiBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gU2VlIHRoZSBgdHlwZS1kZXRlY3RgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGVcbiAgICogdHlwZSBkZXRlY3Rpb24gYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL3R5cGUtZGV0ZWN0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmJlLmFuKCdvYmplY3QnKTtcbiAgICogICAgIGV4cGVjdChudWxsKS50by5iZS5hKCdudWxsJyk7XG4gICAqICAgICBleHBlY3QodW5kZWZpbmVkKS50by5iZS5hbigndW5kZWZpbmVkJyk7XG4gICAqICAgICBleHBlY3QobmV3IEVycm9yKS50by5iZS5hbignZXJyb3InKTtcbiAgICogICAgIGV4cGVjdChQcm9taXNlLnJlc29sdmUoKSkudG8uYmUuYSgncHJvbWlzZScpO1xuICAgKiAgICAgZXhwZWN0KG5ldyBGbG9hdDMyQXJyYXkpLnRvLmJlLmEoJ2Zsb2F0MzJhcnJheScpO1xuICAgKiAgICAgZXhwZWN0KFN5bWJvbCgpKS50by5iZS5hKCdzeW1ib2wnKTtcbiAgICpcbiAgICogYC5hYCBzdXBwb3J0cyBvYmplY3RzIHRoYXQgaGF2ZSBhIGN1c3RvbSB0eXBlIHNldCB2aWEgYFN5bWJvbC50b1N0cmluZ1RhZ2AuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7XG4gICAqICAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnbXlDdXN0b21UeXBlJ1xuICAgKiAgICAgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChteU9iaikudG8uYmUuYSgnbXlDdXN0b21UeXBlJykuYnV0Lm5vdC5hbignb2JqZWN0Jyk7XG4gICAqXG4gICAqIEl0J3Mgb2Z0ZW4gYmVzdCB0byB1c2UgYC5hYCB0byBjaGVjayBhIHRhcmdldCdzIHR5cGUgYmVmb3JlIG1ha2luZyBtb3JlXG4gICAqIGFzc2VydGlvbnMgb24gdGhlIHNhbWUgdGFyZ2V0LiBUaGF0IHdheSwgeW91IGF2b2lkIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZnJvbVxuICAgKiBhbnkgYXNzZXJ0aW9uIHRoYXQgZG9lcyBkaWZmZXJlbnQgdGhpbmdzIGJhc2VkIG9uIHRoZSB0YXJnZXQncyB0eXBlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uYmUuYW4oJ2FycmF5JykudGhhdC5pbmNsdWRlcygyKTtcbiAgICogICAgIGV4cGVjdChbXSkudG8uYmUuYW4oJ2FycmF5JykudGhhdC5pcy5lbXB0eTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5hYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgdGhlIGV4cGVjdGVkIHR5cGUsIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IGl0XG4gICAqIGlzbid0IG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdHlwZXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmJlLmEoJ3N0cmluZycpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuYmUuYW4oJ2FycmF5Jyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmFgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSB0b1xuICAgKiBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZFxuICAgKiBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5hKCdzdHJpbmcnLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmEoJ3N0cmluZycpO1xuICAgKlxuICAgKiBgLmFgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBsYW5ndWFnZSBjaGFpbiB0byBpbXByb3ZlIHRoZSByZWFkYWJpbGl0eSBvZlxuICAgKiB5b3VyIGFzc2VydGlvbnMuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5oYXZlLmEucHJvcGVydHkoJ2InKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuYWAuXG4gICAqXG4gICAqIEBuYW1lIGFcbiAgICogQGFsaWFzIGFuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhbiAodHlwZSwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgYXJ0aWNsZSA9IH5bICdhJywgJ2UnLCAnaScsICdvJywgJ3UnIF0uaW5kZXhPZih0eXBlLmNoYXJBdCgwKSkgPyAnYW4gJyA6ICdhICc7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdHlwZSA9PT0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSAnICsgYXJ0aWNsZSArIHR5cGVcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlICcgKyBhcnRpY2xlICsgdHlwZVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCdhbicsIGFuKTtcbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnYScsIGFuKTtcblxuICAvKipcbiAgICogIyMjIC5pbmNsdWRlKHZhbFssIG1zZ10pXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIHN0cmluZywgYC5pbmNsdWRlYCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHN0cmluZyBgdmFsYFxuICAgKiBpcyBhIHN1YnN0cmluZyBvZiB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5pbmNsdWRlKCdmb28nKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGFuIGFycmF5LCBgLmluY2x1ZGVgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYHZhbGAgaXMgYVxuICAgKiBtZW1iZXIgb2YgdGhlIHRhcmdldC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUoMik7XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhbiBvYmplY3QsIGAuaW5jbHVkZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3RcbiAgICogYHZhbGAncyBwcm9wZXJ0aWVzIGFyZSBhIHN1YnNldCBvZiB0aGUgdGFyZ2V0J3MgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMiwgYzogM30pLnRvLmluY2x1ZGUoe2E6IDEsIGI6IDJ9KTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgU2V0IG9yIFdlYWtTZXQsIGAuaW5jbHVkZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBgdmFsYCBpcyBhXG4gICAqIG1lbWJlciBvZiB0aGUgdGFyZ2V0LiBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobSBpcyB1c2VkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDJdKSkudG8uaW5jbHVkZSgyKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgTWFwLCBgLmluY2x1ZGVgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYHZhbGAgaXMgb25lIG9mXG4gICAqIHRoZSB2YWx1ZXMgb2YgdGhlIHRhcmdldC4gU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG0gaXMgdXNlZC5cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl1dKSkudG8uaW5jbHVkZSgyKTtcbiAgICpcbiAgICogQmVjYXVzZSBgLmluY2x1ZGVgIGRvZXMgZGlmZmVyZW50IHRoaW5ncyBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgdHlwZSwgaXQnc1xuICAgKiBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIHRhcmdldCdzIHR5cGUgYmVmb3JlIHVzaW5nIGAuaW5jbHVkZWAuIFNlZSB0aGUgYC5hYFxuICAgKiBkb2MgZm9yIGluZm8gb24gdGVzdGluZyBhIHRhcmdldCdzIHR5cGUuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5iZS5hbignYXJyYXknKS50aGF0LmluY2x1ZGVzKDIpO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzdHJpY3QgKGA9PT1gKSBlcXVhbGl0eSBpcyB1c2VkIHRvIGNvbXBhcmUgYXJyYXkgbWVtYmVycyBhbmRcbiAgICogb2JqZWN0IHByb3BlcnRpZXMuIEFkZCBgLmRlZXBgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5XG4gICAqIGluc3RlYWQgKFdlYWtTZXQgdGFyZ2V0cyBhcmUgbm90IHN1cHBvcnRlZCkuIFNlZSB0aGUgYGRlZXAtZXFsYCBwcm9qZWN0XG4gICAqIHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaW5jbHVkZXMgYHthOiAxfWBcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8uZGVlcC5pbmNsdWRlKHthOiAxfSk7XG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLm5vdC5pbmNsdWRlKHthOiAxfSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaW5jbHVkZXMgYHg6IHthOiAxfWBcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uZGVlcC5pbmNsdWRlKHt4OiB7YTogMX19KTtcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8ubm90LmluY2x1ZGUoe3g6IHthOiAxfX0pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHRhcmdldCdzIHByb3BlcnRpZXMgYXJlIHNlYXJjaGVkIHdoZW4gd29ya2luZyB3aXRoXG4gICAqIG9iamVjdHMuIFRoaXMgaW5jbHVkZXMgcHJvcGVydGllcyB0aGF0IGFyZSBpbmhlcml0ZWQgYW5kL29yIG5vbi1lbnVtZXJhYmxlLlxuICAgKiBBZGQgYC5vd25gIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGV4Y2x1ZGUgdGhlIHRhcmdldCdzIGluaGVyaXRlZFxuICAgKiBwcm9wZXJ0aWVzIGZyb20gdGhlIHNlYXJjaC5cbiAgICpcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5vd24uaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZSh7YjogMn0pLmJ1dC5ub3Qub3duLmluY2x1ZGUoe2I6IDJ9KTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGEgdGFyZ2V0IG9iamVjdCBpcyBhbHdheXMgb25seSBzZWFyY2hlZCBmb3IgYHZhbGAncyBvd25cbiAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBgLmRlZXBgIGFuZCBgLm93bmAgY2FuIGJlIGNvbWJpbmVkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogMn19KS50by5kZWVwLm93bi5pbmNsdWRlKHthOiB7YjogMn19KTtcbiAgICpcbiAgICogQWRkIGAubmVzdGVkYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBlbmFibGUgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiB3aGVuXG4gICAqIHJlZmVyZW5jaW5nIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5uZXN0ZWQuaW5jbHVkZSh7J2EuYlsxXSc6ICd5J30pO1xuICAgKlxuICAgKiBJZiBgLmAgb3IgYFtdYCBhcmUgcGFydCBvZiBhbiBhY3R1YWwgcHJvcGVydHkgbmFtZSwgdGhleSBjYW4gYmUgZXNjYXBlZCBieVxuICAgKiBhZGRpbmcgdHdvIGJhY2tzbGFzaGVzIGJlZm9yZSB0aGVtLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHsnLmEnOiB7J1tiXSc6IDJ9fSkudG8ubmVzdGVkLmluY2x1ZGUoeydcXFxcLmEuXFxcXFtiXFxcXF0nOiAyfSk7XG4gICAqXG4gICAqIGAuZGVlcGAgYW5kIGAubmVzdGVkYCBjYW4gYmUgY29tYmluZWQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IHtiOiBbe2M6IDN9XX19KS50by5kZWVwLm5lc3RlZC5pbmNsdWRlKHsnYS5iWzBdJzoge2M6IDN9fSk7XG4gICAqXG4gICAqIGAub3duYCBhbmQgYC5uZXN0ZWRgIGNhbm5vdCBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5pbmNsdWRlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8ubm90LmluY2x1ZGUoJ3RhY28nKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLm5vdC5pbmNsdWRlKDQpO1xuICAgKlxuICAgKiBIb3dldmVyLCBpdCdzIGRhbmdlcm91cyB0byBuZWdhdGUgYC5pbmNsdWRlYCB3aGVuIHRoZSB0YXJnZXQgaXMgYW4gb2JqZWN0LlxuICAgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9ucyBieSBhc3NlcnRpbmcgdGhhdCB0aGVcbiAgICogdGFyZ2V0IG9iamVjdCBkb2Vzbid0IGhhdmUgYWxsIG9mIGB2YWxgJ3Mga2V5L3ZhbHVlIHBhaXJzIGJ1dCBtYXkgb3IgbWF5XG4gICAqIG5vdCBoYXZlIHNvbWUgb2YgdGhlbS4gSXQncyBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzXG4gICAqIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBvYmplY3QgaXNuJ3QgZXZlbiBleHBlY3RlZCB0byBoYXZlIGB2YWxgJ3Mga2V5cywgaXQnc1xuICAgKiBvZnRlbiBiZXN0IHRvIGFzc2VydCBleGFjdGx5IHRoYXQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2M6IDN9KS50by5ub3QuaGF2ZS5hbnkua2V5cygnYScsICdiJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2M6IDN9KS50by5ub3QuaW5jbHVkZSh7YTogMSwgYjogMn0pOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IG9iamVjdCBpcyBleHBlY3RlZCB0byBoYXZlIGB2YWxgJ3Mga2V5cywgaXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCB0aGF0IGVhY2ggb2YgdGhlIHByb3BlcnRpZXMgaGFzIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyIHRoYW5cbiAgICogYXNzZXJ0aW5nIHRoYXQgZWFjaCBwcm9wZXJ0eSBkb2Vzbid0IGhhdmUgb25lIG9mIG1hbnkgdW5leHBlY3RlZCB2YWx1ZXMuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDMsIGI6IDR9KS50by5pbmNsdWRlKHthOiAzLCBiOiA0fSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDMsIGI6IDR9KS50by5ub3QuaW5jbHVkZSh7YTogMSwgYjogMn0pOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5pbmNsdWRlYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlKDQsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10sICdub29vIHdoeSBmYWlsPz8nKS50by5pbmNsdWRlKDQpO1xuICAgKlxuICAgKiBgLmluY2x1ZGVgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBsYW5ndWFnZSBjaGFpbiwgY2F1c2luZyBhbGwgYC5tZW1iZXJzYCBhbmRcbiAgICogYC5rZXlzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byByZXF1aXJlIHRoZSB0YXJnZXQgdG8gYmUgYVxuICAgKiBzdXBlcnNldCBvZiB0aGUgZXhwZWN0ZWQgc2V0LCByYXRoZXIgdGhhbiBhbiBpZGVudGljYWwgc2V0LiBOb3RlIHRoYXRcbiAgICogYC5tZW1iZXJzYCBpZ25vcmVzIGR1cGxpY2F0ZXMgaW4gdGhlIHN1YnNldCB3aGVuIGAuaW5jbHVkZWAgaXMgYWRkZWQuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0J3Mga2V5cyBhcmUgYSBzdXBlcnNldCBvZiBbJ2EnLCAnYiddIGJ1dCBub3QgaWRlbnRpY2FsXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDIsIGM6IDN9KS50by5pbmNsdWRlLmFsbC5rZXlzKCdhJywgJ2InKTtcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMiwgYzogM30pLnRvLm5vdC5oYXZlLmFsbC5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBpcyBhIHN1cGVyc2V0IG9mIFsxLCAyXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaW5jbHVkZS5tZW1iZXJzKFsxLCAyXSk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5ub3QuaGF2ZS5tZW1iZXJzKFsxLCAyXSk7XG4gICAqXG4gICAqICAgICAvLyBEdXBsaWNhdGVzIGluIHRoZSBzdWJzZXQgYXJlIGlnbm9yZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUubWVtYmVycyhbMSwgMiwgMiwgMl0pO1xuICAgKlxuICAgKiBOb3RlIHRoYXQgYWRkaW5nIGAuYW55YCBlYXJsaWVyIGluIHRoZSBjaGFpbiBjYXVzZXMgdGhlIGAua2V5c2AgYXNzZXJ0aW9uXG4gICAqIHRvIGlnbm9yZSBgLmluY2x1ZGVgLlxuICAgKlxuICAgKiAgICAgLy8gQm90aCBhc3NlcnRpb25zIGFyZSBpZGVudGljYWxcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmluY2x1ZGUuYW55LmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5hbnkua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAuaW5jbHVkZXNgLCBgLmNvbnRhaW5gLCBhbmQgYC5jb250YWluc2AgY2FuIGJlIHVzZWRcbiAgICogaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5pbmNsdWRlYC5cbiAgICpcbiAgICogQG5hbWUgaW5jbHVkZVxuICAgKiBAYWxpYXMgY29udGFpblxuICAgKiBAYWxpYXMgaW5jbHVkZXNcbiAgICogQGFsaWFzIGNvbnRhaW5zXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gU2FtZVZhbHVlWmVybyhhLCBiKSB7XG4gICAgcmV0dXJuIChfLmlzTmFOKGEpICYmIF8uaXNOYU4oYikpIHx8IGEgPT09IGI7XG4gIH1cblxuICBmdW5jdGlvbiBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvciAoKSB7XG4gICAgZmxhZyh0aGlzLCAnY29udGFpbnMnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluY2x1ZGUgKHZhbCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG5cbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBuZWdhdGUgPSBmbGFnKHRoaXMsICduZWdhdGUnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIGlzRGVlcCA9IGZsYWcodGhpcywgJ2RlZXAnKVxuICAgICAgLCBkZXNjcmlwdG9yID0gaXNEZWVwID8gJ2RlZXAgJyA6ICcnO1xuXG4gICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuXG4gICAgdmFyIGluY2x1ZGVkID0gZmFsc2U7XG5cbiAgICBzd2l0Y2ggKG9ialR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd3ZWFrc2V0JzpcbiAgICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICAgIGZsYWdNc2cgKyAndW5hYmxlIHRvIHVzZSAuZGVlcC5pbmNsdWRlIHdpdGggV2Vha1NldCcsXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBzc2ZpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluY2x1ZGVkID0gb2JqLmhhcyh2YWwpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbWFwJzpcbiAgICAgICAgdmFyIGlzRXFsID0gaXNEZWVwID8gXy5lcWwgOiBTYW1lVmFsdWVaZXJvO1xuICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIGluY2x1ZGVkID0gaW5jbHVkZWQgfHwgaXNFcWwoaXRlbSwgdmFsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzZXQnOlxuICAgICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgICAgb2JqLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGluY2x1ZGVkID0gaW5jbHVkZWQgfHwgXy5lcWwoaXRlbSwgdmFsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IG9iai5oYXModmFsKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgICAgaW5jbHVkZWQgPSBvYmouc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIF8uZXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IG9iai5pbmRleE9mKHZhbCkgIT09IC0xO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBUaGlzIGJsb2NrIGlzIGZvciBhc3NlcnRpbmcgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAgICAgIC8vIGBfLmV4cGVjdFR5cGVzYCBpc24ndCB1c2VkIGhlcmUgYmVjYXVzZSBgLmluY2x1ZGVgIHNob3VsZCB3b3JrIHdpdGhcbiAgICAgICAgLy8gb2JqZWN0cyB3aXRoIGEgY3VzdG9tIGBAQHRvU3RyaW5nVGFnYC5cbiAgICAgICAgaWYgKHZhbCAhPT0gT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgICBmbGFnTXNnICsgJ3RoZSBnaXZlbiBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMgKCdcbiAgICAgICAgICAgICsgb2JqVHlwZSArICcgYW5kICdcbiAgICAgICAgICAgICsgXy50eXBlKHZhbCkudG9Mb3dlckNhc2UoKSArICcpJ1xuICAgICAgICAgICAgKyAnIGlzIGludmFsaWQgZm9yIHRoaXMgYXNzZXJ0aW9uLiAnXG4gICAgICAgICAgICArICdZb3UgY2FuIHVzZSBhbiBhcnJheSwgYSBtYXAsIGFuIG9iamVjdCwgYSBzZXQsIGEgc3RyaW5nLCAnXG4gICAgICAgICAgICArICdvciBhIHdlYWtzZXQgaW5zdGVhZCBvZiBhICdcbiAgICAgICAgICAgICsgXy50eXBlKHZhbCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzZmlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb3BzID0gT2JqZWN0LmtleXModmFsKVxuICAgICAgICAgICwgZmlyc3RFcnIgPSBudWxsXG4gICAgICAgICAgLCBudW1FcnJzID0gMDtcblxuICAgICAgICBwcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgdmFyIHByb3BBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKG9iaik7XG4gICAgICAgICAgXy50cmFuc2ZlckZsYWdzKHRoaXMsIHByb3BBc3NlcnRpb24sIHRydWUpO1xuICAgICAgICAgIGZsYWcocHJvcEFzc2VydGlvbiwgJ2xvY2tTc2ZpJywgdHJ1ZSk7XG5cbiAgICAgICAgICBpZiAoIW5lZ2F0ZSB8fCBwcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHByb3BBc3NlcnRpb24ucHJvcGVydHkocHJvcCwgdmFsW3Byb3BdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFfLmNoZWNrRXJyb3IuY29tcGF0aWJsZUNvbnN0cnVjdG9yKGVyciwgQXNzZXJ0aW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdEVyciA9PT0gbnVsbCkgZmlyc3RFcnIgPSBlcnI7XG4gICAgICAgICAgICBudW1FcnJzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICAvLyBXaGVuIHZhbGlkYXRpbmcgLm5vdC5pbmNsdWRlIHdpdGggbXVsdGlwbGUgcHJvcGVydGllcywgd2Ugb25seSB3YW50XG4gICAgICAgIC8vIHRvIHRocm93IGFuIGFzc2VydGlvbiBlcnJvciBpZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgYXJlIGluY2x1ZGVkLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIHRocm93IHRoZSBmaXJzdCBwcm9wZXJ0eSBhc3NlcnRpb24gZXJyb3IgdGhhdCB3ZVxuICAgICAgICAvLyBlbmNvdW50ZXJlZC5cbiAgICAgICAgaWYgKG5lZ2F0ZSAmJiBwcm9wcy5sZW5ndGggPiAxICYmIG51bUVycnMgPT09IHByb3BzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IGZpcnN0RXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBc3NlcnQgaW5jbHVzaW9uIGluIGNvbGxlY3Rpb24gb3Igc3Vic3RyaW5nIGluIGEgc3RyaW5nLlxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaW5jbHVkZWRcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gJyArIGRlc2NyaXB0b3IgKyAnaW5jbHVkZSAnICsgXy5pbnNwZWN0KHZhbClcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90ICcgKyBkZXNjcmlwdG9yICsgJ2luY2x1ZGUgJyArIF8uaW5zcGVjdCh2YWwpKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2luY2x1ZGUnLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2NvbnRhaW4nLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2NvbnRhaW5zJywgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuICBBc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCdpbmNsdWRlcycsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcblxuICAvKipcbiAgICogIyMjIC5va1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIHRydXRoeSB2YWx1ZSAoY29uc2lkZXJlZCBgdHJ1ZWAgaW4gYm9vbGVhbiBjb250ZXh0KS5cbiAgICogSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBvclxuICAgKiBkZWVwbHkgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlKS50by5iZS50cnVlOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHRydWUpLnRvLmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5va2AuXG4gICAqXG4gICAqICAgICBleHBlY3QoMCkudG8uZXF1YWwoMCk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMCkudG8ubm90LmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSkudG8uYmUuZmFsc2U7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoZmFsc2UpLnRvLm5vdC5iZS5vazsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QobnVsbCkudG8uYmUubnVsbDsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChudWxsKS50by5ub3QuYmUub2s7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8uYmUudW5kZWZpbmVkOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8ubm90LmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLm9rO1xuICAgKlxuICAgKiBAbmFtZSBva1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ29rJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB0cnV0aHknXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5Jyk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLnRydWVcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QodHJ1ZSkudG8uYmUudHJ1ZTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC50cnVlYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhbiBub3RcbiAgICogZXF1YWwgdG8gYHRydWVgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZhbHNlKS50by5iZS5mYWxzZTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChmYWxzZSkudG8ubm90LmJlLnRydWU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5iZS50cnVlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLnRydWU7XG4gICAqXG4gICAqIEBuYW1lIHRydWVcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCd0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICB0cnVlID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB0cnVlJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzZSdcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyBmYWxzZSA6IHRydWVcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5mYWxzZVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBzdHJpY3RseSAoYD09PWApIGVxdWFsIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoZmFsc2UpLnRvLmJlLmZhbHNlO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmZhbHNlYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlKS50by5iZS50cnVlOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHRydWUpLnRvLm5vdC5iZS5mYWxzZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLmZhbHNlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZmFsc2U7XG4gICAqXG4gICAqIEBuYW1lIGZhbHNlXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGZhbHNlID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzZSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZSdcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyB0cnVlIDogZmFsc2VcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5udWxsXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0cmljdGx5IChgPT09YCkgZXF1YWwgdG8gYG51bGxgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG51bGwpLnRvLmJlLm51bGw7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubnVsbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyIHRoYW4gbm90XG4gICAqIGVxdWFsIHRvIGBudWxsYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUubnVsbDsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5udWxsO1xuICAgKlxuICAgKiBAbmFtZSBudWxsXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbnVsbCA9PT0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgbnVsbCdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIG51bGwnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAudW5kZWZpbmVkXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0cmljdGx5IChgPT09YCkgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICBleHBlY3QodW5kZWZpbmVkKS50by5iZS51bmRlZmluZWQ7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAudW5kZWZpbmVkYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLnVuZGVmaW5lZDsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS51bmRlZmluZWQ7XG4gICAqXG4gICAqIEBuYW1lIHVuZGVmaW5lZFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ3VuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdW5kZWZpbmVkID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWQnXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSB1bmRlZmluZWQnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuTmFOXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGV4YWN0bHkgYE5hTmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoTmFOKS50by5iZS5OYU47XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuTmFOYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhbiBub3RcbiAgICogZXF1YWwgdG8gYE5hTmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmVxdWFsKCdmb28nKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8ubm90LmJlLk5hTjsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5OYU47XG4gICAqXG4gICAqIEBuYW1lIE5hTlxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ05hTicsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgXy5pc05hTihmbGFnKHRoaXMsICdvYmplY3QnKSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBOYU4nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIE5hTidcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5leGlzdFxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBub3Qgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBlaXRoZXIgYG51bGxgIG9yXG4gICAqIGB1bmRlZmluZWRgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0b1xuICAgKiBpdHMgZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uZXhpc3Q7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KDApLnRvLmVxdWFsKDApOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDApLnRvLmV4aXN0OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5leGlzdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QobnVsbCkudG8uYmUubnVsbDsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChudWxsKS50by5ub3QuZXhpc3Q7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8uYmUudW5kZWZpbmVkOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8ubm90LmV4aXN0OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChudWxsLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uZXhpc3Q7XG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmV4aXN0c2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5leGlzdGAuXG4gICAqXG4gICAqIEBuYW1lIGV4aXN0XG4gICAqIEBhbGlhcyBleGlzdHNcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0RXhpc3QgKCkge1xuICAgIHZhciB2YWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKTtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGV4aXN0J1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZXhpc3QnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZXhpc3QnLCBhc3NlcnRFeGlzdCk7XG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZXhpc3RzJywgYXNzZXJ0RXhpc3QpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmVtcHR5XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIHN0cmluZyBvciBhcnJheSwgYC5lbXB0eWAgYXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQnc1xuICAgKiBgbGVuZ3RoYCBwcm9wZXJ0eSBpcyBzdHJpY3RseSAoYD09PWApIGVxdWFsIHRvIGAwYC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbXSkudG8uYmUuZW1wdHk7XG4gICAqICAgICBleHBlY3QoJycpLnRvLmJlLmVtcHR5O1xuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBtYXAgb3Igc2V0LCBgLmVtcHR5YCBhc3NlcnRzIHRoYXQgdGhlIHRhcmdldCdzIGBzaXplYFxuICAgKiBwcm9wZXJ0eSBpcyBzdHJpY3RseSBlcXVhbCB0byBgMGAuXG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IFNldCgpKS50by5iZS5lbXB0eTtcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKCkpLnRvLmJlLmVtcHR5O1xuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBgLmVtcHR5YCBhc3NlcnRzIHRoYXQgdGhlIHRhcmdldFxuICAgKiBkb2Vzbid0IGhhdmUgYW55IG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIFByb3BlcnRpZXMgd2l0aCBTeW1ib2wtYmFzZWRcbiAgICoga2V5cyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgY291bnQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe30pLnRvLmJlLmVtcHR5O1xuICAgKlxuICAgKiBCZWNhdXNlIGAuZW1wdHlgIGRvZXMgZGlmZmVyZW50IHRoaW5ncyBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgdHlwZSwgaXQnc1xuICAgKiBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIHRhcmdldCdzIHR5cGUgYmVmb3JlIHVzaW5nIGAuZW1wdHlgLiBTZWUgdGhlIGAuYWBcbiAgICogZG9jIGZvciBpbmZvIG9uIHRlc3RpbmcgYSB0YXJnZXQncyB0eXBlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFtdKS50by5iZS5hbignYXJyYXknKS50aGF0LmlzLmVtcHR5O1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmVtcHR5YC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgY29udGFpbnMgaXRzIGV4cGVjdGVkIG51bWJlciBvZiB2YWx1ZXMsXG4gICAqIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IGl0J3Mgbm90IGVtcHR5LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLm5vdC5iZS5lbXB0eTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IFNldChbMSwgMiwgM10pKS50by5oYXZlLnByb3BlcnR5KCdzaXplJywgMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QobmV3IFNldChbMSwgMiwgM10pKS50by5ub3QuYmUuZW1wdHk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHthOiAxfSkpLnRvLmhhdmUubGVuZ3RoT2YoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuYmUuZW1wdHk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmVtcHR5O1xuICAgKlxuICAgKiBAbmFtZSBlbXB0eVxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2VtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgaXRlbXNDb3VudDtcblxuICAgIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgOiAnJztcblxuICAgIHN3aXRjaCAoXy50eXBlKHZhbCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgaXRlbXNDb3VudCA9IHZhbC5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWFwJzpcbiAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgIGl0ZW1zQ291bnQgPSB2YWwuc2l6ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3ZWFrbWFwJzpcbiAgICAgIGNhc2UgJ3dlYWtzZXQnOlxuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArICcuZW1wdHkgd2FzIHBhc3NlZCBhIHdlYWsgY29sbGVjdGlvbicsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHNzZmlcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgdmFyIG1zZyA9IGZsYWdNc2cgKyAnLmVtcHR5IHdhcyBwYXNzZWQgYSBmdW5jdGlvbiAnICsgXy5nZXROYW1lKHZhbCk7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtc2cudHJpbSgpLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHZhbCAhPT0gT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgICBmbGFnTXNnICsgJy5lbXB0eSB3YXMgcGFzc2VkIG5vbi1zdHJpbmcgcHJpbWl0aXZlICcgKyBfLmluc3BlY3QodmFsKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzZmlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW1zQ291bnQgPSBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aDtcbiAgICB9XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgMCA9PT0gaXRlbXNDb3VudFxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBlbXB0eSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIGVtcHR5J1xuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmFyZ3VtZW50c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiB0ZXN0ICgpIHtcbiAgICogICAgICAgZXhwZWN0KGFyZ3VtZW50cykudG8uYmUuYXJndW1lbnRzO1xuICAgKiAgICAgfVxuICAgKlxuICAgKiAgICAgdGVzdCgpO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmFyZ3VtZW50c2AuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW5cbiAgICogYmVzdCB0byBhc3NlcnQgd2hpY2ggdHlwZSB0aGUgdGFyZ2V0IGlzIGV4cGVjdGVkIHRvIGJlLCByYXRoZXIgdGhhblxuICAgKiBhc3NlcnRpbmcgdGhhdCBpdFx1MjAxOXMgbm90IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uYmUuYSgnc3RyaW5nJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLm5vdC5iZS5hcmd1bWVudHM7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHt9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYXJndW1lbnRzO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5Bcmd1bWVudHNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuYXJndW1lbnRzYC5cbiAgICpcbiAgICogQG5hbWUgYXJndW1lbnRzXG4gICAqIEBhbGlhcyBBcmd1bWVudHNcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gY2hlY2tBcmd1bWVudHMgKCkge1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCB0eXBlID0gXy50eXBlKG9iaik7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICdBcmd1bWVudHMnID09PSB0eXBlXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGFyZ3VtZW50cyBidXQgZ290ICcgKyB0eXBlXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhcmd1bWVudHMnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnYXJndW1lbnRzJywgY2hlY2tBcmd1bWVudHMpO1xuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ0FyZ3VtZW50cycsIGNoZWNrQXJndW1lbnRzKTtcblxuICAvKipcbiAgICogIyMjIC5lcXVhbCh2YWxbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBzdHJpY3RseSAoYD09PWApIGVxdWFsIHRvIHRoZSBnaXZlbiBgdmFsYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTtcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uZXF1YWwoJ2ZvbycpO1xuICAgKlxuICAgKiBBZGQgYC5kZWVwYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byB1c2UgZGVlcCBlcXVhbGl0eSBpbnN0ZWFkLiBTZWUgdGhlXG4gICAqIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBlcXVhbHMgYHthOiAxfWBcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmRlZXAuZXF1YWwoe2E6IDF9KTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLm5vdC5lcXVhbCh7YTogMX0pO1xuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgZXF1YWxzIGBbMSwgMl1gXG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5kZWVwLmVxdWFsKFsxLCAyXSk7XG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5ub3QuZXF1YWwoWzEsIDJdKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5lcXVhbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW5cbiAgICogYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyIHRoYW5cbiAgICogbm90IGVxdWFsIHRvIG9uZSBvZiBjb3VudGxlc3MgdW5leHBlY3RlZCB2YWx1ZXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmVxdWFsKDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5lcXVhbGAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDIsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uZXF1YWwoMik7XG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAuZXF1YWxzYCBhbmQgYGVxYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmVxdWFsYC5cbiAgICpcbiAgICogQG5hbWUgZXF1YWxcbiAgICogQGFsaWFzIGVxdWFsc1xuICAgKiBAYWxpYXMgZXFcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRFcXVhbCAodmFsLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgaWYgKGZsYWcodGhpcywgJ2RlZXAnKSkge1xuICAgICAgdmFyIHByZXZMb2NrU3NmaSA9IGZsYWcodGhpcywgJ2xvY2tTc2ZpJyk7XG4gICAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIHRydWUpO1xuICAgICAgdGhpcy5lcWwodmFsKTtcbiAgICAgIGZsYWcodGhpcywgJ2xvY2tTc2ZpJywgcHJldkxvY2tTc2ZpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgdmFsID09PSBvYmpcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfSdcbiAgICAgICAgLCB2YWxcbiAgICAgICAgLCB0aGlzLl9vYmpcbiAgICAgICAgLCB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxdWFsJywgYXNzZXJ0RXF1YWwpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdlcXVhbHMnLCBhc3NlcnRFcXVhbCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxJywgYXNzZXJ0RXF1YWwpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmVxbChvYmpbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBkZWVwbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGBvYmpgLiBTZWUgdGhlXG4gICAqIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgaXMgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBlcXVhbCB0byB7YTogMX1cbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YTogMX0pLmJ1dC5ub3QuZXF1YWwoe2E6IDF9KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBpcyBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGVxdWFsIHRvIFsxLCAyXVxuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uZXFsKFsxLCAyXSkuYnV0Lm5vdC5lcXVhbChbMSwgMl0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmVxbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGRlZXBseSBlcXVhbCB0byBpdHMgZXhwZWN0ZWQgdmFsdWUsIHJhdGhlclxuICAgKiB0aGFuIG5vdCBkZWVwbHkgZXF1YWwgdG8gb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIHZhbHVlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YTogMX0pOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmVxbCh7YjogMn0pOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5lcWxgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlXG4gICAqIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YjogMn0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5lcWwoe2I6IDJ9KTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuZXFsc2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5lcWxgLlxuICAgKlxuICAgKiBUaGUgYC5kZWVwLmVxdWFsYCBhc3NlcnRpb24gaXMgYWxtb3N0IGlkZW50aWNhbCB0byBgLmVxbGAgYnV0IHdpdGggb25lXG4gICAqIGRpZmZlcmVuY2U6IGAuZGVlcC5lcXVhbGAgY2F1c2VzIGRlZXAgZXF1YWxpdHkgY29tcGFyaXNvbnMgdG8gYWxzbyBiZSB1c2VkXG4gICAqIGZvciBhbnkgb3RoZXIgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4uXG4gICAqXG4gICAqIEBuYW1lIGVxbFxuICAgKiBAYWxpYXMgZXFsc1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBfLmVxbChvYmosIGZsYWcodGhpcywgJ29iamVjdCcpKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgI3tleHB9J1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZGVlcGx5IGVxdWFsICN7ZXhwfSdcbiAgICAgICwgb2JqXG4gICAgICAsIHRoaXMuX29ialxuICAgICAgLCB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxbCcsIGFzc2VydEVxbCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxbHMnLCBhc3NlcnRFcWwpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmFib3ZlKG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LlxuICAgKiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0byBpdHMgZXhwZWN0ZWRcbiAgICogdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uZXF1YWwoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYWJvdmUoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgXG4gICAqIG9yIGBzaXplYCBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG51bWJlciBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmFib3ZlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmFib3ZlYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYWJvdmUoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5hYm92ZSgyKTtcbiAgICpcbiAgICogVGhlIGFsaWFzZXMgYC5ndGAgYW5kIGAuZ3JlYXRlclRoYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAuYWJvdmVgLlxuICAgKlxuICAgKiBAbmFtZSBhYm92ZVxuICAgKiBAYWxpYXMgZ3RcbiAgICogQGFsaWFzIGdyZWF0ZXJUaGFuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRBYm92ZSAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZXJyb3JNZXNzYWdlXG4gICAgICAsIHNob3VsZFRocm93ID0gdHJ1ZTtcblxuICAgIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSAnbWFwJyAmJiBvYmpUeXBlICE9PSAnc2V0Jykge1xuICAgICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkoJ2xlbmd0aCcpO1xuICAgIH1cblxuICAgIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgPT09ICdkYXRlJyAmJiBuVHlwZSAhPT0gJ2RhdGUnKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBhYm92ZSBtdXN0IGJlIGEgZGF0ZSc7XG4gICAgfSBlbHNlIGlmIChuVHlwZSAhPT0gJ251bWJlcicgJiYgKGRvTGVuZ3RoIHx8IG9ialR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBhYm92ZSBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gJ2RhdGUnICYmIG9ialR5cGUgIT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHByaW50T2JqID0gKG9ialR5cGUgPT09ICdzdHJpbmcnKSA/IFwiJ1wiICsgb2JqICsgXCInXCIgOiBvYmo7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAnZXhwZWN0ZWQgJyArIHByaW50T2JqICsgJyB0byBiZSBhIG51bWJlciBvciBhIGRhdGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICB9XG5cbiAgICBpZiAoZG9MZW5ndGgpIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gJ2xlbmd0aCdcbiAgICAgICAgLCBpdGVtc0NvdW50O1xuICAgICAgaWYgKG9ialR5cGUgPT09ICdtYXAnIHx8IG9ialR5cGUgPT09ICdzZXQnKSB7XG4gICAgICAgIGRlc2NyaXB0b3IgPSAnc2l6ZSc7XG4gICAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgaXRlbXNDb3VudCA+IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIGFib3ZlICN7ZXhwfSBidXQgZ290ICN7YWN0fSdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyBhYm92ZSAje2V4cH0nXG4gICAgICAgICwgblxuICAgICAgICAsIGl0ZW1zQ291bnRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA+IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhYm92ZSAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbW9zdCAje2V4cH0nXG4gICAgICAgICwgblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdhYm92ZScsIGFzc2VydEFib3ZlKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZ3QnLCBhc3NlcnRBYm92ZSk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2dyZWF0ZXJUaGFuJywgYXNzZXJ0QWJvdmUpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmxlYXN0KG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlblxuICAgKiBudW1iZXIgb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0b1xuICAgKiBpdHMgZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uZXF1YWwoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYXQubGVhc3QoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLmF0LmxlYXN0KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubGVuZ3RoT2ZgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQncyBgbGVuZ3RoYFxuICAgKiBvciBgc2l6ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIgYG5gLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mLmF0LmxlYXN0KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmF0LmxlYXN0KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5sZWFzdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLmF0LmxlYXN0KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5sZWFzdGAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmF0LmxlYXN0KDIsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYXQubGVhc3QoMik7XG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAuZ3RlYCBhbmQgYC5ncmVhdGVyVGhhbk9yRXF1YWxgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAubGVhc3RgLlxuICAgKlxuICAgKiBAbmFtZSBsZWFzdFxuICAgKiBAYWxpYXMgZ3RlXG4gICAqIEBhbGlhcyBncmVhdGVyVGhhbk9yRXF1YWxcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydExlYXN0IChuLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZG9MZW5ndGggPSBmbGFnKHRoaXMsICdkb0xlbmd0aCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgbXNnUHJlZml4ID0gKChmbGFnTXNnKSA/IGZsYWdNc2cgKyAnOiAnIDogJycpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopLnRvTG93ZXJDYXNlKClcbiAgICAgICwgblR5cGUgPSBfLnR5cGUobikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBlcnJvck1lc3NhZ2VcbiAgICAgICwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuXG4gICAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09ICdtYXAnICYmIG9ialR5cGUgIT09ICdzZXQnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIG5UeXBlICE9PSAnZGF0ZScpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlJztcbiAgICB9IGVsc2UgaWYgKG5UeXBlICE9PSAnbnVtYmVyJyAmJiAoZG9MZW5ndGggfHwgb2JqVHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBudW1iZXInO1xuICAgIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSAnZGF0ZScgJiYgb2JqVHlwZSAhPT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgcHJpbnRPYmogPSAob2JqVHlwZSA9PT0gJ3N0cmluZycpID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICdleHBlY3RlZCAnICsgcHJpbnRPYmogKyAnIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIGlmIChkb0xlbmd0aCkge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSAnbGVuZ3RoJ1xuICAgICAgICAsIGl0ZW1zQ291bnQ7XG4gICAgICBpZiAob2JqVHlwZSA9PT0gJ21hcCcgfHwgb2JqVHlwZSA9PT0gJ3NldCcpIHtcbiAgICAgICAgZGVzY3JpcHRvciA9ICdzaXplJztcbiAgICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgICB9XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBpdGVtc0NvdW50ID49IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIGF0IGxlYXN0ICN7ZXhwfSBidXQgZ290ICN7YWN0fSdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIGJlbG93ICN7ZXhwfSdcbiAgICAgICAgLCBuXG4gICAgICAgICwgaXRlbXNDb3VudFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgb2JqID49IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBsZWFzdCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYmVsb3cgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbGVhc3QnLCBhc3NlcnRMZWFzdCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2d0ZScsIGFzc2VydExlYXN0KTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZ3JlYXRlclRoYW5PckVxdWFsJywgYXNzZXJ0TGVhc3QpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmJlbG93KG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgbGVzcyB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LlxuICAgKiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0byBpdHMgZXhwZWN0ZWRcbiAgICogdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYmVsb3coMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgXG4gICAqIG9yIGBzaXplYCBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIG51bWJlciBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YuYmVsb3coNCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGgoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmJlbG93KDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5iZWxvd2AuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uZXF1YWwoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8ubm90LmJlLmJlbG93KDEpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5iZWxvd2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLmJlbG93KDEsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgyLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYmVsb3coMSk7XG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAubHRgIGFuZCBgLmxlc3NUaGFuYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aFxuICAgKiBgLmJlbG93YC5cbiAgICpcbiAgICogQG5hbWUgYmVsb3dcbiAgICogQGFsaWFzIGx0XG4gICAqIEBhbGlhcyBsZXNzVGhhblxuICAgKiBAcGFyYW0ge051bWJlcn0gblxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0QmVsb3cgKG4sIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBkb0xlbmd0aCA9IGZsYWcodGhpcywgJ2RvTGVuZ3RoJylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBtc2dQcmVmaXggPSAoKGZsYWdNc2cpID8gZmxhZ01zZyArICc6ICcgOiAnJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKVxuICAgICAgLCBvYmpUeXBlID0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBuVHlwZSA9IF8udHlwZShuKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIGVycm9yTWVzc2FnZVxuICAgICAgLCBzaG91bGRUaHJvdyA9IHRydWU7XG5cbiAgICBpZiAoZG9MZW5ndGggJiYgb2JqVHlwZSAhPT0gJ21hcCcgJiYgb2JqVHlwZSAhPT0gJ3NldCcpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KCdsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlID09PSAnZGF0ZScgJiYgblR5cGUgIT09ICdkYXRlJykpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICd0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIGRhdGUnO1xuICAgIH0gZWxzZSBpZiAoblR5cGUgIT09ICdudW1iZXInICYmIChkb0xlbmd0aCB8fCBvYmpUeXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICd0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIG51bWJlcic7XG4gICAgfSBlbHNlIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgIT09ICdkYXRlJyAmJiBvYmpUeXBlICE9PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBwcmludE9iaiA9IChvYmpUeXBlID09PSAnc3RyaW5nJykgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ2V4cGVjdGVkICcgKyBwcmludE9iaiArICcgdG8gYmUgYSBudW1iZXIgb3IgYSBkYXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvdWxkVGhyb3cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHVuZGVmaW5lZCwgc3NmaSk7XG4gICAgfVxuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9ICdsZW5ndGgnXG4gICAgICAgICwgaXRlbXNDb3VudDtcbiAgICAgIGlmIChvYmpUeXBlID09PSAnbWFwJyB8fCBvYmpUeXBlID09PSAnc2V0Jykge1xuICAgICAgICBkZXNjcmlwdG9yID0gJ3NpemUnO1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGl0ZW1zQ291bnQgPCBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyBiZWxvdyAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgYSAnICsgZGVzY3JpcHRvciArICcgYmVsb3cgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICAgLCBpdGVtc0NvdW50XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBvYmogPCBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYmVsb3cgI3tleHB9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IGxlYXN0ICN7ZXhwfSdcbiAgICAgICAgLCBuXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2JlbG93JywgYXNzZXJ0QmVsb3cpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdsdCcsIGFzc2VydEJlbG93KTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbGVzc1RoYW4nLCBhc3NlcnRCZWxvdyk7XG5cbiAgLyoqXG4gICAqICMjIyAubW9zdChuWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXIgb3IgYSBkYXRlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAqIG9yIGRhdGUgYG5gIHJlc3BlY3RpdmVseS4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzXG4gICAqIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmF0Lm1vc3QoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmF0Lm1vc3QoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgXG4gICAqIG9yIGBzaXplYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlciBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YuYXQubW9zdCg0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi5hdC5tb3N0KDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5tb3N0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5ub3QuYmUuYXQubW9zdCgxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubW9zdGAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLmF0Lm1vc3QoMSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5hdC5tb3N0KDEpO1xuICAgKlxuICAgKiBUaGUgYWxpYXNlcyBgLmx0ZWAgYW5kIGAubGVzc1RoYW5PckVxdWFsYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aFxuICAgKiBgLm1vc3RgLlxuICAgKlxuICAgKiBAbmFtZSBtb3N0XG4gICAqIEBhbGlhcyBsdGVcbiAgICogQGFsaWFzIGxlc3NUaGFuT3JFcXVhbFxuICAgKiBAcGFyYW0ge051bWJlcn0gblxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0TW9zdCAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZXJyb3JNZXNzYWdlXG4gICAgICAsIHNob3VsZFRocm93ID0gdHJ1ZTtcblxuICAgIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSAnbWFwJyAmJiBvYmpUeXBlICE9PSAnc2V0Jykge1xuICAgICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkoJ2xlbmd0aCcpO1xuICAgIH1cblxuICAgIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgPT09ICdkYXRlJyAmJiBuVHlwZSAhPT0gJ2RhdGUnKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBtb3N0IG11c3QgYmUgYSBkYXRlJztcbiAgICB9IGVsc2UgaWYgKG5UeXBlICE9PSAnbnVtYmVyJyAmJiAoZG9MZW5ndGggfHwgb2JqVHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIG51bWJlcic7XG4gICAgfSBlbHNlIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgIT09ICdkYXRlJyAmJiBvYmpUeXBlICE9PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBwcmludE9iaiA9IChvYmpUeXBlID09PSAnc3RyaW5nJykgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ2V4cGVjdGVkICcgKyBwcmludE9iaiArICcgdG8gYmUgYSBudW1iZXIgb3IgYSBkYXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvdWxkVGhyb3cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHVuZGVmaW5lZCwgc3NmaSk7XG4gICAgfVxuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9ICdsZW5ndGgnXG4gICAgICAgICwgaXRlbXNDb3VudDtcbiAgICAgIGlmIChvYmpUeXBlID09PSAnbWFwJyB8fCBvYmpUeXBlID09PSAnc2V0Jykge1xuICAgICAgICBkZXNjcmlwdG9yID0gJ3NpemUnO1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGl0ZW1zQ291bnQgPD0gblxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSAnICsgZGVzY3JpcHRvciArICcgYXQgbW9zdCAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyBhYm92ZSAje2V4cH0nXG4gICAgICAgICwgblxuICAgICAgICAsIGl0ZW1zQ291bnRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA8PSBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbW9zdCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbW9zdCcsIGFzc2VydE1vc3QpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdsdGUnLCBhc3NlcnRNb3N0KTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbGVzc1RoYW5PckVxdWFsJywgYXNzZXJ0TW9zdCk7XG5cbiAgLyoqXG4gICAqICMjIyAud2l0aGluKHN0YXJ0LCBmaW5pc2hbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlblxuICAgKiBudW1iZXIgb3IgZGF0ZSBgc3RhcnRgLCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIgb3IgZGF0ZSBgZmluaXNoYCByZXNwZWN0aXZlbHkuXG4gICAqIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZFxuICAgKiB2YWx1ZS5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5iZS53aXRoaW4oMSwgMyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLndpdGhpbigyLCAzKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUud2l0aGluKDEsIDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubGVuZ3RoT2ZgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQncyBgbGVuZ3RoYFxuICAgKiBvciBgc2l6ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIgYHN0YXJ0YCwgYW5kIGxlc3NcbiAgICogdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyIGBmaW5pc2hgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mLndpdGhpbigyLCA0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi53aXRoaW4oMiwgNCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLndpdGhpbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLndpdGhpbigyLCA0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAud2l0aGluYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNCkudG8uYmUud2l0aGluKDEsIDMsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCg0LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUud2l0aGluKDEsIDMpO1xuICAgKlxuICAgKiBAbmFtZSB3aXRoaW5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IGxvd2VyIGJvdW5kIGluY2x1c2l2ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZmluaXNoIHVwcGVyIGJvdW5kIGluY2x1c2l2ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnd2l0aGluJywgZnVuY3Rpb24gKHN0YXJ0LCBmaW5pc2gsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBkb0xlbmd0aCA9IGZsYWcodGhpcywgJ2RvTGVuZ3RoJylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBtc2dQcmVmaXggPSAoKGZsYWdNc2cpID8gZmxhZ01zZyArICc6ICcgOiAnJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKVxuICAgICAgLCBvYmpUeXBlID0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBzdGFydFR5cGUgPSBfLnR5cGUoc3RhcnQpLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZmluaXNoVHlwZSA9IF8udHlwZShmaW5pc2gpLnRvTG93ZXJDYXNlKClcbiAgICAgICwgZXJyb3JNZXNzYWdlXG4gICAgICAsIHNob3VsZFRocm93ID0gdHJ1ZVxuICAgICAgLCByYW5nZSA9IChzdGFydFR5cGUgPT09ICdkYXRlJyAmJiBmaW5pc2hUeXBlID09PSAnZGF0ZScpXG4gICAgICAgICAgPyBzdGFydC50b0lTT1N0cmluZygpICsgJy4uJyArIGZpbmlzaC50b0lTT1N0cmluZygpXG4gICAgICAgICAgOiBzdGFydCArICcuLicgKyBmaW5pc2g7XG5cbiAgICBpZiAoZG9MZW5ndGggJiYgb2JqVHlwZSAhPT0gJ21hcCcgJiYgb2JqVHlwZSAhPT0gJ3NldCcpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KCdsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlID09PSAnZGF0ZScgJiYgKHN0YXJ0VHlwZSAhPT0gJ2RhdGUnIHx8IGZpbmlzaFR5cGUgIT09ICdkYXRlJykpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50cyB0byB3aXRoaW4gbXVzdCBiZSBkYXRlcyc7XG4gICAgfSBlbHNlIGlmICgoc3RhcnRUeXBlICE9PSAnbnVtYmVyJyB8fCBmaW5pc2hUeXBlICE9PSAnbnVtYmVyJykgJiYgKGRvTGVuZ3RoIHx8IG9ialR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudHMgdG8gd2l0aGluIG11c3QgYmUgbnVtYmVycyc7XG4gICAgfSBlbHNlIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgIT09ICdkYXRlJyAmJiBvYmpUeXBlICE9PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBwcmludE9iaiA9IChvYmpUeXBlID09PSAnc3RyaW5nJykgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ2V4cGVjdGVkICcgKyBwcmludE9iaiArICcgdG8gYmUgYSBudW1iZXIgb3IgYSBkYXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvdWxkVGhyb3cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHVuZGVmaW5lZCwgc3NmaSk7XG4gICAgfVxuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9ICdsZW5ndGgnXG4gICAgICAgICwgaXRlbXNDb3VudDtcbiAgICAgIGlmIChvYmpUeXBlID09PSAnbWFwJyB8fCBvYmpUeXBlID09PSAnc2V0Jykge1xuICAgICAgICBkZXNjcmlwdG9yID0gJ3NpemUnO1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGl0ZW1zQ291bnQgPj0gc3RhcnQgJiYgaXRlbXNDb3VudCA8PSBmaW5pc2hcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIHdpdGhpbiAnICsgcmFuZ2VcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyB3aXRoaW4gJyArIHJhbmdlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBvYmogPj0gc3RhcnQgJiYgb2JqIDw9IGZpbmlzaFxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIHdpdGhpbiAnICsgcmFuZ2VcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgd2l0aGluICcgKyByYW5nZVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmluc3RhbmNlb2YoY29uc3RydWN0b3JbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gYGNvbnN0cnVjdG9yYC5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7IH1cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgQ2F0KCkpLnRvLmJlLmFuLmluc3RhbmNlb2YoQ2F0KTtcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmJlLmFuLmluc3RhbmNlb2YoQXJyYXkpO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmluc3RhbmNlb2ZgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmJlLmFuLmluc3RhbmNlb2YoQXJyYXkpO1xuICAgKlxuICAgKiBgLmluc3RhbmNlb2ZgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5hbi5pbnN0YW5jZW9mKEFycmF5LCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmFuLmluc3RhbmNlb2YoQXJyYXkpO1xuICAgKlxuICAgKiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gRVM1LCBgLmluc3RhbmNlb2ZgIG1heSBub3QgYWx3YXlzIHdvcmsgYXMgZXhwZWN0ZWRcbiAgICogd2hlbiB1c2luZyBhIHRyYW5zcGlsZXIgc3VjaCBhcyBCYWJlbCBvciBUeXBlU2NyaXB0LiBJbiBwYXJ0aWN1bGFyLCBpdCBtYXlcbiAgICogcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiBzdWJjbGFzc2luZyBidWlsdC1pbiBvYmplY3Qgc3VjaCBhc1xuICAgKiBgQXJyYXlgLCBgRXJyb3JgLCBhbmQgYE1hcGAuIFNlZSB5b3VyIHRyYW5zcGlsZXIncyBkb2NzIGZvciBkZXRhaWxzOlxuICAgKlxuICAgKiAtIChbQmFiZWxdKGh0dHBzOi8vYmFiZWxqcy5pby9kb2NzL3VzYWdlL2NhdmVhdHMvI2NsYXNzZXMpKVxuICAgKiAtIChbVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3dpa2kvQnJlYWtpbmctQ2hhbmdlcyNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmspKVxuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5pbnN0YW5jZU9mYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmluc3RhbmNlb2ZgLlxuICAgKlxuICAgKiBAbmFtZSBpbnN0YW5jZW9mXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAYWxpYXMgaW5zdGFuY2VPZlxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRJbnN0YW5jZU9mIChjb25zdHJ1Y3RvciwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG5cbiAgICB2YXIgdGFyZ2V0ID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICB2YXIgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICB2YXIgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgaXNJbnN0YW5jZU9mID0gdGFyZ2V0IGluc3RhbmNlb2YgY29uc3RydWN0b3I7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgOiAnJztcbiAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIGZsYWdNc2cgKyAnVGhlIGluc3RhbmNlb2YgYXNzZXJ0aW9uIG5lZWRzIGEgY29uc3RydWN0b3IgYnV0ICdcbiAgICAgICAgICAgICsgXy50eXBlKGNvbnN0cnVjdG9yKSArICcgd2FzIGdpdmVuLicsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHNzZmlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IF8uZ2V0TmFtZShjb25zdHJ1Y3Rvcik7XG4gICAgaWYgKG5hbWUgPT09IG51bGwpIHtcbiAgICAgIG5hbWUgPSAnYW4gdW5uYW1lZCBjb25zdHJ1Y3Rvcic7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGlzSW5zdGFuY2VPZlxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhbiBpbnN0YW5jZSBvZiAnICsgbmFtZVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYW4gaW5zdGFuY2Ugb2YgJyArIG5hbWVcbiAgICApO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2luc3RhbmNlb2YnLCBhc3NlcnRJbnN0YW5jZU9mKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaW5zdGFuY2VPZicsIGFzc2VydEluc3RhbmNlT2YpO1xuXG4gIC8qKlxuICAgKiAjIyMgLnByb3BlcnR5KG5hbWVbLCB2YWxbLCBtc2ddXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaGFzIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGBuYW1lYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUucHJvcGVydHkoJ2EnKTtcbiAgICpcbiAgICogV2hlbiBgdmFsYCBpcyBwcm92aWRlZCwgYC5wcm9wZXJ0eWAgYWxzbyBhc3NlcnRzIHRoYXQgdGhlIHByb3BlcnR5J3MgdmFsdWVcbiAgICogaXMgZXF1YWwgdG8gdGhlIGdpdmVuIGB2YWxgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScsIDEpO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzdHJpY3QgKGA9PT1gKSBlcXVhbGl0eSBpcyB1c2VkLiBBZGQgYC5kZWVwYCBlYXJsaWVyIGluIHRoZVxuICAgKiBjaGFpbiB0byB1c2UgZGVlcCBlcXVhbGl0eSBpbnN0ZWFkLiBTZWUgdGhlIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvclxuICAgKiBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBoYXMgcHJvcGVydHkgYHg6IHthOiAxfWBcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uaGF2ZS5kZWVwLnByb3BlcnR5KCd4Jywge2E6IDF9KTtcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8ubm90LmhhdmUucHJvcGVydHkoJ3gnLCB7YTogMX0pO1xuICAgKlxuICAgKiBUaGUgdGFyZ2V0J3MgZW51bWVyYWJsZSBhbmQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgYWx3YXlzIGluY2x1ZGVkXG4gICAqIGluIHRoZSBzZWFyY2guIEJ5IGRlZmF1bHQsIGJvdGggb3duIGFuZCBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgaW5jbHVkZWQuXG4gICAqIEFkZCBgLm93bmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gZXhjbHVkZSBpbmhlcml0ZWQgcHJvcGVydGllcyBmcm9tIHRoZVxuICAgKiBzZWFyY2guXG4gICAqXG4gICAqICAgICBPYmplY3QucHJvdG90eXBlLmIgPSAyO1xuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd24ucHJvcGVydHkoJ2EnKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duLnByb3BlcnR5KCdhJywgMSk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdiJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5vd24ucHJvcGVydHkoJ2InKTtcbiAgICpcbiAgICogYC5kZWVwYCBhbmQgYC5vd25gIGNhbiBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqXG4gICAqIEFkZCBgLm5lc3RlZGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gZW5hYmxlIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gd2hlblxuICAgKiByZWZlcmVuY2luZyBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YToge2I6IFsneCcsICd5J119fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ2EuYlsxXScpO1xuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5oYXZlLm5lc3RlZC5wcm9wZXJ0eSgnYS5iWzFdJywgJ3knKTtcbiAgICpcbiAgICogSWYgYC5gIG9yIGBbXWAgYXJlIHBhcnQgb2YgYW4gYWN0dWFsIHByb3BlcnR5IG5hbWUsIHRoZXkgY2FuIGJlIGVzY2FwZWQgYnlcbiAgICogYWRkaW5nIHR3byBiYWNrc2xhc2hlcyBiZWZvcmUgdGhlbS5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7Jy5hJzogeydbYl0nOiAneCd9fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ1xcXFwuYS5cXFxcW2JcXFxcXScpO1xuICAgKlxuICAgKiBgLmRlZXBgIGFuZCBgLm5lc3RlZGAgY2FuIGJlIGNvbWJpbmVkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogW3tjOiAzfV19fSlcbiAgICogICAgICAgLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkoJ2EuYlswXScsIHtjOiAzfSk7XG4gICAqXG4gICAqIGAub3duYCBhbmQgYC5uZXN0ZWRgIGNhbm5vdCBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5wcm9wZXJ0eWAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKlxuICAgKiBIb3dldmVyLCBpdCdzIGRhbmdlcm91cyB0byBuZWdhdGUgYC5wcm9wZXJ0eWAgd2hlbiBwcm92aWRpbmcgYHZhbGAuIFRoZVxuICAgKiBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zIGJ5IGFzc2VydGluZyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgZWl0aGVyIGRvZXNuJ3QgaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBgbmFtZWAsIG9yIHRoYXQgaXRcbiAgICogZG9lcyBoYXZlIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGBuYW1lYCBidXQgaXRzIHZhbHVlIGlzbid0IGVxdWFsIHRvXG4gICAqIHRoZSBnaXZlbiBgdmFsYC4gSXQncyBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzXG4gICAqIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpc24ndCBleHBlY3RlZCB0byBoYXZlIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5XG4gICAqIGBuYW1lYCwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCBleGFjdGx5IHRoYXQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYScpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHtiOiAyfSkudG8ubm90LmhhdmUucHJvcGVydHkoJ2EnLCAxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBoYXZlIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGBuYW1lYCxcbiAgICogaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSBwcm9wZXJ0eSBoYXMgaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXJcbiAgICogdGhhbiBhc3NlcnRpbmcgdGhhdCBpdCBkb2Vzbid0IGhhdmUgb25lIG9mIG1hbnkgdW5leHBlY3RlZCB2YWx1ZXMuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDN9KS50by5oYXZlLnByb3BlcnR5KCdhJywgMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDN9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYScsIDEpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5wcm9wZXJ0eWAgY2hhbmdlcyB0aGUgdGFyZ2V0IG9mIGFueSBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpblxuICAgKiB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGZyb20gdGhlIG9yaWdpbmFsIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdhJykudGhhdC5pcy5hKCdudW1iZXInKTtcbiAgICpcbiAgICogYC5wcm9wZXJ0eWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgYHZhbGAsIG9ubHkgdXNlIHRoZVxuICAgKiBzZWNvbmQgZm9ybS5cbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdhJywgMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUucHJvcGVydHkoJ2EnLCAyKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLnByb3BlcnR5KCdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUucHJvcGVydHkoJ2InLCB1bmRlZmluZWQsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogVGhlIGFib3ZlIGFzc2VydGlvbiBpc24ndCB0aGUgc2FtZSB0aGluZyBhcyBub3QgcHJvdmlkaW5nIGB2YWxgLiBJbnN0ZWFkLFxuICAgKiBpdCdzIGFzc2VydGluZyB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IGhhcyBhIGBiYCBwcm9wZXJ0eSB0aGF0J3MgZXF1YWwgdG9cbiAgICogYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIFRoZSBhc3NlcnRpb25zIGAub3duUHJvcGVydHlgIGFuZCBgLmhhdmVPd25Qcm9wZXJ0eWAgY2FuIGJlIHVzZWRcbiAgICogaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5vd24ucHJvcGVydHlgLlxuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWwgKG9wdGlvbmFsKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQHJldHVybnMgdmFsdWUgb2YgcHJvcGVydHkgZm9yIGNoYWluaW5nXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydFByb3BlcnR5IChuYW1lLCB2YWwsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuXG4gICAgdmFyIGlzTmVzdGVkID0gZmxhZyh0aGlzLCAnbmVzdGVkJylcbiAgICAgICwgaXNPd24gPSBmbGFnKHRoaXMsICdvd24nKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgbmFtZVR5cGUgPSB0eXBlb2YgbmFtZTtcblxuICAgIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgOiAnJztcblxuICAgIGlmIChpc05lc3RlZCkge1xuICAgICAgaWYgKG5hbWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArICd0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZyB3aGVuIHVzaW5nIG5lc3RlZCBzeW50YXgnLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuYW1lVHlwZSAhPT0gJ3N0cmluZycgJiYgbmFtZVR5cGUgIT09ICdudW1iZXInICYmIG5hbWVUeXBlICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArICd0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZywgbnVtYmVyLCBvciBzeW1ib2wnLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTmVzdGVkICYmIGlzT3duKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgIGZsYWdNc2cgKyAnVGhlIFwibmVzdGVkXCIgYW5kIFwib3duXCIgZmxhZ3MgY2Fubm90IGJlIGNvbWJpbmVkLicsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgIGZsYWdNc2cgKyAnVGFyZ2V0IGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGlzRGVlcCA9IGZsYWcodGhpcywgJ2RlZXAnKVxuICAgICAgLCBuZWdhdGUgPSBmbGFnKHRoaXMsICduZWdhdGUnKVxuICAgICAgLCBwYXRoSW5mbyA9IGlzTmVzdGVkID8gXy5nZXRQYXRoSW5mbyhvYmosIG5hbWUpIDogbnVsbFxuICAgICAgLCB2YWx1ZSA9IGlzTmVzdGVkID8gcGF0aEluZm8udmFsdWUgOiBvYmpbbmFtZV07XG5cbiAgICB2YXIgZGVzY3JpcHRvciA9ICcnO1xuICAgIGlmIChpc0RlZXApIGRlc2NyaXB0b3IgKz0gJ2RlZXAgJztcbiAgICBpZiAoaXNPd24pIGRlc2NyaXB0b3IgKz0gJ293biAnO1xuICAgIGlmIChpc05lc3RlZCkgZGVzY3JpcHRvciArPSAnbmVzdGVkICc7XG4gICAgZGVzY3JpcHRvciArPSAncHJvcGVydHkgJztcblxuICAgIHZhciBoYXNQcm9wZXJ0eTtcbiAgICBpZiAoaXNPd24pIGhhc1Byb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgbmFtZSk7XG4gICAgZWxzZSBpZiAoaXNOZXN0ZWQpIGhhc1Byb3BlcnR5ID0gcGF0aEluZm8uZXhpc3RzO1xuICAgIGVsc2UgaGFzUHJvcGVydHkgPSBfLmhhc1Byb3BlcnR5KG9iaiwgbmFtZSk7XG5cbiAgICAvLyBXaGVuIHBlcmZvcm1pbmcgYSBuZWdhdGVkIGFzc2VydGlvbiBmb3IgYm90aCBuYW1lIGFuZCB2YWwsIG1lcmVseSBoYXZpbmdcbiAgICAvLyBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUgaXNuJ3QgZW5vdWdoIHRvIGNhdXNlIHRoZSBhc3NlcnRpb24gdG9cbiAgICAvLyBmYWlsLiBJdCBtdXN0IGJvdGggaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUsIGFuZCB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGF0IHByb3BlcnR5IG11c3QgZXF1YWwgdGhlIGdpdmVuIHZhbC4gVGhlcmVmb3JlLCBza2lwIHRoaXMgYXNzZXJ0aW9uIGluXG4gICAgLy8gZmF2b3Igb2YgdGhlIG5leHQuXG4gICAgaWYgKCFuZWdhdGUgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgaGFzUHJvcGVydHlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlICcgKyBkZXNjcmlwdG9yICsgXy5pbnNwZWN0KG5hbWUpXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgJyArIGRlc2NyaXB0b3IgKyBfLmluc3BlY3QobmFtZSkpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgaGFzUHJvcGVydHkgJiYgKGlzRGVlcCA/IF8uZXFsKHZhbCwgdmFsdWUpIDogdmFsID09PSB2YWx1ZSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlICcgKyBkZXNjcmlwdG9yICsgXy5pbnNwZWN0KG5hbWUpICsgJyBvZiAje2V4cH0sIGJ1dCBnb3QgI3thY3R9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlICcgKyBkZXNjcmlwdG9yICsgXy5pbnNwZWN0KG5hbWUpICsgJyBvZiAje2FjdH0nXG4gICAgICAgICwgdmFsXG4gICAgICAgICwgdmFsdWVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZmxhZyh0aGlzLCAnb2JqZWN0JywgdmFsdWUpO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgncHJvcGVydHknLCBhc3NlcnRQcm9wZXJ0eSk7XG5cbiAgZnVuY3Rpb24gYXNzZXJ0T3duUHJvcGVydHkgKG5hbWUsIHZhbHVlLCBtc2cpIHtcbiAgICBmbGFnKHRoaXMsICdvd24nLCB0cnVlKTtcbiAgICBhc3NlcnRQcm9wZXJ0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnb3duUHJvcGVydHknLCBhc3NlcnRPd25Qcm9wZXJ0eSk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2hhdmVPd25Qcm9wZXJ0eScsIGFzc2VydE93blByb3BlcnR5KTtcblxuICAvKipcbiAgICogIyMjIC5vd25Qcm9wZXJ0eURlc2NyaXB0b3IobmFtZVssIGRlc2NyaXB0b3JbLCBtc2ddXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaGFzIGl0cyBvd24gcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBrZXlcbiAgICogYG5hbWVgLiBFbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSBpbmNsdWRlZCBpbiB0aGVcbiAgICogc2VhcmNoLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnKTtcbiAgICpcbiAgICogV2hlbiBgZGVzY3JpcHRvcmAgaXMgcHJvdmlkZWQsIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYCBhbHNvIGFzc2VydHMgdGhhdFxuICAgKiB0aGUgcHJvcGVydHkncyBkZXNjcmlwdG9yIGlzIGRlZXBseSBlcXVhbCB0byB0aGUgZ2l2ZW4gYGRlc2NyaXB0b3JgLiBTZWVcbiAgICogdGhlIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJywge1xuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAqICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgKiAgICAgICB2YWx1ZTogMSxcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm93blByb3BlcnR5RGVzY3JpcHRvcmAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2InKTtcbiAgICpcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYCB3aGVuIHByb3ZpZGluZ1xuICAgKiBhIGBkZXNjcmlwdG9yYC4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnMgYnlcbiAgICogYXNzZXJ0aW5nIHRoYXQgdGhlIHRhcmdldCBlaXRoZXIgZG9lc24ndCBoYXZlIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoXG4gICAqIHRoZSBnaXZlbiBrZXkgYG5hbWVgLCBvciB0aGF0IGl0IGRvZXMgaGF2ZSBhIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCB0aGVcbiAgICogZ2l2ZW4ga2V5IGBuYW1lYCBidXQgaXRcdTIwMTlzIG5vdCBkZWVwbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGBkZXNjcmlwdG9yYC4gSXQnc1xuICAgKiBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhblxuICAgKiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpc24ndCBleHBlY3RlZCB0byBoYXZlIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlblxuICAgKiBrZXkgYG5hbWVgLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5ub3QuaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnKTtcbiAgICpcbiAgICogICAgIC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHtiOiAyfSkudG8ubm90LmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJywge1xuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAqICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgKiAgICAgICB2YWx1ZTogMSxcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW5cbiAgICoga2V5IGBuYW1lYCwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSBwcm9wZXJ0eSBoYXMgaXRzIGV4cGVjdGVkXG4gICAqIGRlc2NyaXB0b3IsIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSBvbmUgb2YgbWFueVxuICAgKiB1bmV4cGVjdGVkIGRlc2NyaXB0b3JzLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogM30pLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJywge1xuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAqICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgKiAgICAgICB2YWx1ZTogMyxcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDN9KS50by5ub3QuaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAxLFxuICAgKiAgICAgfSk7XG4gICAqXG4gICAqIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYCBjaGFuZ2VzIHRoZSB0YXJnZXQgb2YgYW55IGFzc2VydGlvbnMgdGhhdCBmb2xsb3dcbiAgICogaW4gdGhlIGNoYWluIHRvIGJlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmcm9tIHRoZSBvcmlnaW5hbFxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnKVxuICAgKiAgICAgICAudGhhdC5oYXMucHJvcGVydHkoJ2VudW1lcmFibGUnLCB0cnVlKTtcbiAgICpcbiAgICogYC5vd25Qcm9wZXJ0eURlc2NyaXB0b3JgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYVxuICAgKiBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc29cbiAgICogYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nXG4gICAqIGBkZXNjcmlwdG9yYCwgb25seSB1c2UgdGhlIHNlY29uZCBmb3JtLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJywge1xuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAqICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgKiAgICAgICB2YWx1ZTogMixcbiAgICogICAgIH0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAyLFxuICAgKiAgICAgfSk7XG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0pXG4gICAqICAgICAgIC50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYicsIHVuZGVmaW5lZCwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiBUaGUgYWJvdmUgYXNzZXJ0aW9uIGlzbid0IHRoZSBzYW1lIHRoaW5nIGFzIG5vdCBwcm92aWRpbmcgYGRlc2NyaXB0b3JgLlxuICAgKiBJbnN0ZWFkLCBpdCdzIGFzc2VydGluZyB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IGhhcyBhIGBiYCBwcm9wZXJ0eVxuICAgKiBkZXNjcmlwdG9yIHRoYXQncyBkZWVwbHkgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYC5cbiAgICpcbiAgICogQG5hbWUgb3duUHJvcGVydHlEZXNjcmlwdG9yXG4gICAqIEBhbGlhcyBoYXZlT3duUHJvcGVydHlEZXNjcmlwdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZXNjcmlwdG9yIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydE93blByb3BlcnR5RGVzY3JpcHRvciAobmFtZSwgZGVzY3JpcHRvciwgbXNnKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgbXNnID0gZGVzY3JpcHRvcjtcbiAgICAgIGRlc2NyaXB0b3IgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgdmFyIGFjdHVhbERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdChvYmopLCBuYW1lKTtcbiAgICBpZiAoYWN0dWFsRGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBfLmVxbChkZXNjcmlwdG9yLCBhY3R1YWxEZXNjcmlwdG9yKVxuICAgICAgICAsICdleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yICcgKyBfLmluc3BlY3QobmFtZSkgKyAnIG9uICN7dGhpc30gdG8gbWF0Y2ggJyArIF8uaW5zcGVjdChkZXNjcmlwdG9yKSArICcsIGdvdCAnICsgXy5pbnNwZWN0KGFjdHVhbERlc2NyaXB0b3IpXG4gICAgICAgICwgJ2V4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgJyArIF8uaW5zcGVjdChuYW1lKSArICcgb24gI3t0aGlzfSB0byBub3QgbWF0Y2ggJyArIF8uaW5zcGVjdChkZXNjcmlwdG9yKVxuICAgICAgICAsIGRlc2NyaXB0b3JcbiAgICAgICAgLCBhY3R1YWxEZXNjcmlwdG9yXG4gICAgICAgICwgdHJ1ZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgYWN0dWFsRGVzY3JpcHRvclxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yICcgKyBfLmluc3BlY3QobmFtZSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhbiBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgJyArIF8uaW5zcGVjdChuYW1lKVxuICAgICAgKTtcbiAgICB9XG4gICAgZmxhZyh0aGlzLCAnb2JqZWN0JywgYWN0dWFsRGVzY3JpcHRvcik7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdvd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdoYXZlT3duUHJvcGVydHlEZXNjcmlwdG9yJywgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcblxuICAvKipcbiAgICogIyMjIC5sZW5ndGhPZihuWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQncyBgbGVuZ3RoYCBvciBgc2l6ZWAgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlclxuICAgKiBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDIsIDNdKSkudG8uaGF2ZS5sZW5ndGhPZigzKTtcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSkpLnRvLmhhdmUubGVuZ3RoT2YoMyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubGVuZ3RoT2ZgLiBIb3dldmVyLCBpdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZFxuICAgKiB2YWx1ZSwgcmF0aGVyIHRoYW4gbm90IGVxdWFsIHRvIG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuaGF2ZS5sZW5ndGhPZig0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubGVuZ3RoT2ZgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUubGVuZ3RoT2YoMik7XG4gICAqXG4gICAqIGAubGVuZ3RoT2ZgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBsYW5ndWFnZSBjaGFpbiwgY2F1c2luZyBhbGwgYC5hYm92ZWAsXG4gICAqIGAuYmVsb3dgLCBgLmxlYXN0YCwgYC5tb3N0YCwgYW5kIGAud2l0aGluYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZVxuICAgKiBjaGFpbiB0byB1c2UgdGhlIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGFzIHRoZSB0YXJnZXQuIEhvd2V2ZXIsIGl0J3NcbiAgICogb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0J3MgYGxlbmd0aGAgcHJvcGVydHkgaXMgZXF1YWwgdG8gaXRzXG4gICAqIGV4cGVjdGVkIGxlbmd0aCwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXRzIGBsZW5ndGhgIHByb3BlcnR5IGZhbGxzXG4gICAqIHdpdGhpbiBzb21lIHJhbmdlIG9mIHZhbHVlcy5cbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmFib3ZlKDIpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi5iZWxvdyg0KTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYXQubGVhc3QoMyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmF0Lm1vc3QoMyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLndpdGhpbigyLDQpO1xuICAgKlxuICAgKiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCB0aGUgYWxpYXMgYC5sZW5ndGhgIGNhbid0IGJlIGNoYWluZWQgZGlyZWN0bHlcbiAgICogb2ZmIG9mIGFuIHVuaW52b2tlZCBtZXRob2Qgc3VjaCBhcyBgLmFgLiBUaGVyZWZvcmUsIGAubGVuZ3RoYCBjYW4ndCBiZSB1c2VkXG4gICAqIGludGVyY2hhbmdlYWJseSB3aXRoIGAubGVuZ3RoT2ZgIGluIGV2ZXJ5IHNpdHVhdGlvbi4gSXQncyByZWNvbW1lbmRlZCB0b1xuICAgKiBhbHdheXMgdXNlIGAubGVuZ3RoT2ZgIGluc3RlYWQgb2YgYC5sZW5ndGhgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5hLmxlbmd0aCgzKTsgLy8gaW5jb21wYXRpYmxlOyB0aHJvd3MgZXJyb3JcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUuYS5sZW5ndGhPZigzKTsgIC8vIHBhc3NlcyBhcyBleHBlY3RlZFxuICAgKlxuICAgKiBAbmFtZSBsZW5ndGhPZlxuICAgKiBAYWxpYXMgbGVuZ3RoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRMZW5ndGhDaGFpbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnZG9MZW5ndGgnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydExlbmd0aCAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKVxuICAgICAgLCBkZXNjcmlwdG9yID0gJ2xlbmd0aCdcbiAgICAgICwgaXRlbXNDb3VudDtcblxuICAgIHN3aXRjaCAob2JqVHlwZSkge1xuICAgICAgY2FzZSAnbWFwJzpcbiAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgIGRlc2NyaXB0b3IgPSAnc2l6ZSc7XG4gICAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgIH1cblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBpdGVtc0NvdW50ID09IG5cbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhICcgKyBkZXNjcmlwdG9yICsgJyBvZiAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgJyArIGRlc2NyaXB0b3IgKyAnIG9mICN7YWN0fSdcbiAgICAgICwgblxuICAgICAgLCBpdGVtc0NvdW50XG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2xlbmd0aCcsIGFzc2VydExlbmd0aCwgYXNzZXJ0TGVuZ3RoQ2hhaW4pO1xuICBBc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCdsZW5ndGhPZicsIGFzc2VydExlbmd0aCwgYXNzZXJ0TGVuZ3RoQ2hhaW4pO1xuXG4gIC8qKlxuICAgKiAjIyMgLm1hdGNoKHJlWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIGByZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLm1hdGNoKC9eZm9vLyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubWF0Y2hgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5ub3QubWF0Y2goL3RhY28vKTtcbiAgICpcbiAgICogYC5tYXRjaGAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5tYXRjaCgvdGFjby8sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJywgJ25vb28gd2h5IGZhaWw/PycpLnRvLm1hdGNoKC90YWNvLyk7XG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLm1hdGNoZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAubWF0Y2hgLlxuICAgKlxuICAgKiBAbmFtZSBtYXRjaFxuICAgKiBAYWxpYXMgbWF0Y2hlc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICBmdW5jdGlvbiBhc3NlcnRNYXRjaChyZSwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICByZS5leGVjKG9iailcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbWF0Y2ggJyArIHJlXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IG5vdCB0byBtYXRjaCAnICsgcmVcbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbWF0Y2gnLCBhc3NlcnRNYXRjaCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ21hdGNoZXMnLCBhc3NlcnRNYXRjaCk7XG5cbiAgLyoqXG4gICAqICMjIyAuc3RyaW5nKHN0clssIG1zZ10pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IHN0cmluZyBjb250YWlucyB0aGUgZ2l2ZW4gc3Vic3RyaW5nIGBzdHJgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5oYXZlLnN0cmluZygnYmFyJyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuc3RyaW5nYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8ubm90LmhhdmUuc3RyaW5nKCd0YWNvJyk7XG4gICAqXG4gICAqIGAuc3RyaW5nYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLmhhdmUuc3RyaW5nKCd0YWNvJywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KCdmb29iYXInLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5zdHJpbmcoJ3RhY28nKTtcbiAgICpcbiAgICogQG5hbWUgc3RyaW5nXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3N0cmluZycsIGZ1bmN0aW9uIChzdHIsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ3N0cmluZycpO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIH5vYmouaW5kZXhPZihzdHIpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGNvbnRhaW4gJyArIF8uaW5zcGVjdChzdHIpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluICcgKyBfLmluc3BlY3Qoc3RyKVxuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmtleXMoa2V5MVssIGtleTJbLCAuLi5dXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0LCBhcnJheSwgbWFwLCBvciBzZXQgaGFzIHRoZSBnaXZlbiBrZXlzLiBPbmx5XG4gICAqIHRoZSB0YXJnZXQncyBvd24gaW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2guXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhbiBvYmplY3Qgb3IgYXJyYXksIGtleXMgY2FuIGJlIHByb3ZpZGVkIGFzIG9uZSBvciBtb3JlXG4gICAqIHN0cmluZyBhcmd1bWVudHMsIGEgc2luZ2xlIGFycmF5IGFyZ3VtZW50LCBvciBhIHNpbmdsZSBvYmplY3QgYXJndW1lbnQuIEluXG4gICAqIHRoZSBsYXR0ZXIgY2FzZSwgb25seSB0aGUga2V5cyBpbiB0aGUgZ2l2ZW4gb2JqZWN0IG1hdHRlcjsgdGhlIHZhbHVlcyBhcmVcbiAgICogaWdub3JlZC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KFsneCcsICd5J10pLnRvLmhhdmUuYWxsLmtleXMoMCwgMSk7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmFsbC5rZXlzKFsnYScsICdiJ10pO1xuICAgKiAgICAgZXhwZWN0KFsneCcsICd5J10pLnRvLmhhdmUuYWxsLmtleXMoWzAsIDFdKTtcbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoe2E6IDQsIGI6IDV9KTsgLy8gaWdub3JlIDQgYW5kIDVcbiAgICogICAgIGV4cGVjdChbJ3gnLCAneSddKS50by5oYXZlLmFsbC5rZXlzKHswOiA0LCAxOiA1fSk7IC8vIGlnbm9yZSA0IGFuZCA1XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIG1hcCBvciBzZXQsIGVhY2gga2V5IG11c3QgYmUgcHJvdmlkZWQgYXMgYSBzZXBhcmF0ZVxuICAgKiBhcmd1bWVudC5cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl1dKSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3QobmV3IFNldChbJ2EnLCAnYiddKSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEJlY2F1c2UgYC5rZXlzYCBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIHRhcmdldCdzIHR5cGUsIGl0J3NcbiAgICogaW1wb3J0YW50IHRvIGNoZWNrIHRoZSB0YXJnZXQncyB0eXBlIGJlZm9yZSB1c2luZyBgLmtleXNgLiBTZWUgdGhlIGAuYWAgZG9jXG4gICAqIGZvciBpbmZvIG9uIHRlc3RpbmcgYSB0YXJnZXQncyB0eXBlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uYmUuYW4oJ29iamVjdCcpLnRoYXQuaGFzLmFsbC5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgc3RyaWN0IChgPT09YCkgZXF1YWxpdHkgaXMgdXNlZCB0byBjb21wYXJlIGtleXMgb2YgbWFwcyBhbmRcbiAgICogc2V0cy4gQWRkIGAuZGVlcGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gdXNlIGRlZXAgZXF1YWxpdHkgaW5zdGVhZC4gU2VlXG4gICAqIHRoZSBgZGVlcC1lcWxgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcCBlcXVhbGl0eSBhbGdvcml0aG06XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgc2V0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIGtleSBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5oYXZlLmFsbC5kZWVwLmtleXMoW3thOiAxfV0pO1xuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5ub3QuaGF2ZS5hbGwua2V5cyhbe2E6IDF9XSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSB0YXJnZXQgbXVzdCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cyBhbmQgbm8gbW9yZS4gQWRkXG4gICAqIGAuYW55YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBvbmx5IHJlcXVpcmUgdGhhdCB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3RcbiAgICogb25lIG9mIHRoZSBnaXZlbiBrZXlzLiBBbHNvLCBhZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZVxuICAgKiBgLmtleXNgLiBJdCdzIG9mdGVuIGJlc3QgdG8gYWRkIGAuYW55YCB3aGVuIG5lZ2F0aW5nIGAua2V5c2AsIGFuZCB0byB1c2VcbiAgICogYC5hbGxgIHdoZW4gYXNzZXJ0aW5nIGAua2V5c2Agd2l0aG91dCBuZWdhdGlvbi5cbiAgICpcbiAgICogV2hlbiBuZWdhdGluZyBgLmtleXNgLCBgLmFueWAgaXMgcHJlZmVycmVkIGJlY2F1c2UgYC5ub3QuYW55LmtleXNgIGFzc2VydHNcbiAgICogZXhhY3RseSB3aGF0J3MgZXhwZWN0ZWQgb2YgdGhlIG91dHB1dCwgd2hlcmVhcyBgLm5vdC5hbGwua2V5c2AgY3JlYXRlc1xuICAgKiB1bmNlcnRhaW4gZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgZG9lc24ndCBoYXZlIGFueSBvZiB0aGUgZ2l2ZW4ga2V5c1xuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8ubm90LmhhdmUuYW55LmtleXMoJ2MnLCAnZCcpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkOyBhc3NlcnRzIHRoYXQgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBhbGwgb2YgdGhlIGdpdmVuXG4gICAqICAgICAvLyBrZXlzIGJ1dCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNvbWUgb2YgdGhlbVxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8ubm90LmhhdmUuYWxsLmtleXMoJ2MnLCAnZCcpO1xuICAgKlxuICAgKiBXaGVuIGFzc2VydGluZyBgLmtleXNgIHdpdGhvdXQgbmVnYXRpb24sIGAuYWxsYCBpcyBwcmVmZXJyZWQgYmVjYXVzZVxuICAgKiBgLmFsbC5rZXlzYCBhc3NlcnRzIGV4YWN0bHkgd2hhdCdzIGV4cGVjdGVkIG9mIHRoZSBvdXRwdXQsIHdoZXJlYXNcbiAgICogYC5hbnkua2V5c2AgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgaGFzIGFsbCB0aGUgZ2l2ZW4ga2V5c1xuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW5cbiAgICogICAgIC8vIGtleXMgYnV0IG1heSBvciBtYXkgbm90IGhhdmUgbW9yZSBvZiB0aGVtXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmFueS5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGAuYWxsYCBpcyB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBuZWl0aGVyIGAuYWxsYCBub3IgYC5hbnlgIGFwcGVhclxuICAgKiBlYXJsaWVyIGluIHRoZSBjaGFpbi4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFkZCBgLmFsbGAgYW55d2F5IGJlY2F1c2VcbiAgICogaXQgaW1wcm92ZXMgcmVhZGFiaWxpdHkuXG4gICAqXG4gICAqICAgICAvLyBCb3RoIGFzc2VydGlvbnMgYXJlIGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmtleXMoJ2EnLCAnYicpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAuaW5jbHVkZWAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gcmVxdWlyZSB0aGF0IHRoZSB0YXJnZXQncyBrZXlzIGJlIGFcbiAgICogc3VwZXJzZXQgb2YgdGhlIGV4cGVjdGVkIGtleXMsIHJhdGhlciB0aGFuIGlkZW50aWNhbCBzZXRzLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCdzIGtleXMgYXJlIGEgc3VwZXJzZXQgb2YgWydhJywgJ2InXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyLCBjOiAzfSkudG8uaW5jbHVkZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDIsIGM6IDN9KS50by5ub3QuaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEhvd2V2ZXIsIGlmIGAuYW55YCBhbmQgYC5pbmNsdWRlYCBhcmUgY29tYmluZWQsIG9ubHkgdGhlIGAuYW55YCB0YWtlc1xuICAgKiBlZmZlY3QuIFRoZSBgLmluY2x1ZGVgIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLlxuICAgKlxuICAgKiAgICAgLy8gQm90aCBhc3NlcnRpb25zIGFyZSBpZGVudGljYWxcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUuYW55LmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZS5hbnkua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5rZXkoJ2InKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAua2V5YCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmtleXNgLlxuICAgKlxuICAgKiBAbmFtZSBrZXlzXG4gICAqIEBhbGlhcyBrZXlcbiAgICogQHBhcmFtIHsuLi5TdHJpbmd8QXJyYXl8T2JqZWN0fSBrZXlzXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEtleXMgKGtleXMpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopXG4gICAgICAsIGtleXNUeXBlID0gXy50eXBlKGtleXMpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgaXNEZWVwID0gZmxhZyh0aGlzLCAnZGVlcCcpXG4gICAgICAsIHN0clxuICAgICAgLCBkZWVwU3RyID0gJydcbiAgICAgICwgYWN0dWFsXG4gICAgICAsIG9rID0gdHJ1ZVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpO1xuXG4gICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgIHZhciBtaXhlZEFyZ3NNc2cgPSBmbGFnTXNnICsgJ3doZW4gdGVzdGluZyBrZXlzIGFnYWluc3QgYW4gb2JqZWN0IG9yIGFuIGFycmF5IHlvdSBtdXN0IGdpdmUgYSBzaW5nbGUgQXJyYXl8T2JqZWN0fFN0cmluZyBhcmd1bWVudCBvciBtdWx0aXBsZSBTdHJpbmcgYXJndW1lbnRzJztcblxuICAgIGlmIChvYmpUeXBlID09PSAnTWFwJyB8fCBvYmpUeXBlID09PSAnU2V0Jykge1xuICAgICAgZGVlcFN0ciA9IGlzRGVlcCA/ICdkZWVwbHkgJyA6ICcnO1xuICAgICAgYWN0dWFsID0gW107XG5cbiAgICAgIC8vIE1hcCBhbmQgU2V0ICcua2V5cycgYXJlbid0IHN1cHBvcnRlZCBpbiBJRSAxMS4gVGhlcmVmb3JlLCB1c2UgLmZvckVhY2guXG4gICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAodmFsLCBrZXkpIHsgYWN0dWFsLnB1c2goa2V5KSB9KTtcblxuICAgICAgaWYgKGtleXNUeXBlICE9PSAnQXJyYXknKSB7XG4gICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhY3R1YWwgPSBfLmdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaik7XG5cbiAgICAgIHN3aXRjaCAoa2V5c1R5cGUpIHtcbiAgICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1peGVkQXJnc01zZywgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobWl4ZWRBcmdzTXNnLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlzID0gT2JqZWN0LmtleXMoa2V5cyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc3RyaW5naWZ5IG5vbi1TeW1ib2xzIGJlY2F1c2UgU3ltYm9scyB3b3VsZCBiZWNvbWUgXCJTeW1ib2woKVwiXG4gICAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N5bWJvbCcgPyB2YWwgOiBTdHJpbmcodmFsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihmbGFnTXNnICsgJ2tleXMgcmVxdWlyZWQnLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIHZhciBsZW4gPSBrZXlzLmxlbmd0aFxuICAgICAgLCBhbnkgPSBmbGFnKHRoaXMsICdhbnknKVxuICAgICAgLCBhbGwgPSBmbGFnKHRoaXMsICdhbGwnKVxuICAgICAgLCBleHBlY3RlZCA9IGtleXM7XG5cbiAgICBpZiAoIWFueSAmJiAhYWxsKSB7XG4gICAgICBhbGwgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhhcyBhbnlcbiAgICBpZiAoYW55KSB7XG4gICAgICBvayA9IGV4cGVjdGVkLnNvbWUoZnVuY3Rpb24oZXhwZWN0ZWRLZXkpIHtcbiAgICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBfLmVxbChleHBlY3RlZEtleSwgYWN0dWFsS2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkS2V5ID09PSBhY3R1YWxLZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhhcyBhbGxcbiAgICBpZiAoYWxsKSB7XG4gICAgICBvayA9IGV4cGVjdGVkLmV2ZXJ5KGZ1bmN0aW9uKGV4cGVjdGVkS2V5KSB7XG4gICAgICAgIHJldHVybiBhY3R1YWwuc29tZShmdW5jdGlvbihhY3R1YWxLZXkpIHtcbiAgICAgICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgICAgICByZXR1cm4gXy5lcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZEtleSA9PT0gYWN0dWFsS2V5O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFmbGFnKHRoaXMsICdjb250YWlucycpKSB7XG4gICAgICAgIG9rID0gb2sgJiYga2V5cy5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBLZXkgc3RyaW5nXG4gICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgIGtleXMgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIF8uaW5zcGVjdChrZXkpO1xuICAgICAgfSk7XG4gICAgICB2YXIgbGFzdCA9IGtleXMucG9wKCk7XG4gICAgICBpZiAoYWxsKSB7XG4gICAgICAgIHN0ciA9IGtleXMuam9pbignLCAnKSArICcsIGFuZCAnICsgbGFzdDtcbiAgICAgIH1cbiAgICAgIGlmIChhbnkpIHtcbiAgICAgICAgc3RyID0ga2V5cy5qb2luKCcsICcpICsgJywgb3IgJyArIGxhc3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IF8uaW5zcGVjdChrZXlzWzBdKTtcbiAgICB9XG5cbiAgICAvLyBGb3JtXG4gICAgc3RyID0gKGxlbiA+IDEgPyAna2V5cyAnIDogJ2tleSAnKSArIHN0cjtcblxuICAgIC8vIEhhdmUgLyBpbmNsdWRlXG4gICAgc3RyID0gKGZsYWcodGhpcywgJ2NvbnRhaW5zJykgPyAnY29udGFpbiAnIDogJ2hhdmUgJykgKyBzdHI7XG5cbiAgICAvLyBBc3NlcnRpb25cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgb2tcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gJyArIGRlZXBTdHIgKyBzdHJcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90ICcgKyBkZWVwU3RyICsgc3RyXG4gICAgICAsIGV4cGVjdGVkLnNsaWNlKDApLnNvcnQoXy5jb21wYXJlQnlJbnNwZWN0KVxuICAgICAgLCBhY3R1YWwuc29ydChfLmNvbXBhcmVCeUluc3BlY3QpXG4gICAgICAsIHRydWVcbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgna2V5cycsIGFzc2VydEtleXMpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdrZXknLCBhc3NlcnRLZXlzKTtcblxuICAvKipcbiAgICogIyMjIC50aHJvdyhbZXJyb3JMaWtlXSwgW2Vyck1zZ01hdGNoZXJdLCBbbXNnXSlcbiAgICpcbiAgICogV2hlbiBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBgLnRocm93YCBpbnZva2VzIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kXG4gICAqIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgc2FsbW9uIScpOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdygpO1xuICAgKlxuICAgKiBXaGVuIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgYW5kIGl0J3MgYW4gZXJyb3IgY29uc3RydWN0b3IsIGAudGhyb3dgXG4gICAqIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBhbmQgYXNzZXJ0cyB0aGF0IGFuIGVycm9yIGlzIHRocm93biB0aGF0J3MgYW5cbiAgICogaW5zdGFuY2Ugb2YgdGhhdCBlcnJvciBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBhbmQgaXQncyBhbiBlcnJvciBpbnN0YW5jZSwgYC50aHJvd2AgaW52b2tlc1xuICAgKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGFuZCBhc3NlcnRzIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duIHRoYXQncyBzdHJpY3RseVxuICAgKiAoYD09PWApIGVxdWFsIHRvIHRoYXQgZXJyb3IgaW5zdGFuY2UuXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7XG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IGVycjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coZXJyKTtcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGFuZCBpdCdzIGEgc3RyaW5nLCBgLnRocm93YCBpbnZva2VzIHRoZVxuICAgKiB0YXJnZXQgZnVuY3Rpb24gYW5kIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24gd2l0aCBhIG1lc3NhZ2UgdGhhdFxuICAgKiBjb250YWlucyB0aGF0IHN0cmluZy5cbiAgICpcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KCdzYWxtb24nKTtcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGFuZCBpdCdzIGEgcmVndWxhciBleHByZXNzaW9uLCBgLnRocm93YFxuICAgKiBpbnZva2VzIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24gd2l0aCBhXG4gICAqIG1lc3NhZ2UgdGhhdCBtYXRjaGVzIHRoYXQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiAgICAgdmFyIGJhZEZuID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIHNhbG1vbiEnKTsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coL3NhbG1vbi8pO1xuICAgKlxuICAgKiBXaGVuIHR3byBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBhbmQgdGhlIGZpcnN0IGlzIGFuIGVycm9yIGluc3RhbmNlIG9yXG4gICAqIGNvbnN0cnVjdG9yLCBhbmQgdGhlIHNlY29uZCBpcyBhIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24sIGAudGhyb3dgXG4gICAqIGludm9rZXMgdGhlIGZ1bmN0aW9uIGFuZCBhc3NlcnRzIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duIHRoYXQgZnVsZmlsbHMgYm90aFxuICAgKiBjb25kaXRpb25zIGFzIGRlc2NyaWJlZCBhYm92ZS5cbiAgICpcbiAgICogICAgIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIHNhbG1vbiEnKTtcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgZXJyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICdzYWxtb24nKTtcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coVHlwZUVycm9yLCAvc2FsbW9uLyk7XG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KGVyciwgJ3NhbG1vbicpO1xuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhlcnIsIC9zYWxtb24vKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC50aHJvd2AuXG4gICAqXG4gICAqICAgICB2YXIgZ29vZEZuID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QoZ29vZEZuKS50by5ub3QudGhyb3coKTtcbiAgICpcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAudGhyb3dgIHdoZW4gcHJvdmlkaW5nIGFueSBhcmd1bWVudHMuXG4gICAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zIGJ5IGFzc2VydGluZyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgZWl0aGVyIGRvZXNuJ3QgdGhyb3cgYW4gZXJyb3IsIG9yIHRoYXQgaXQgdGhyb3dzIGFuIGVycm9yIGJ1dCBvZiBhXG4gICAqIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhlIGdpdmVuIHR5cGUsIG9yIHRoYXQgaXQgdGhyb3dzIGFuIGVycm9yIG9mIHRoZSBnaXZlblxuICAgKiB0eXBlIGJ1dCB3aXRoIGEgbWVzc2FnZSB0aGF0IGRvZXNuJ3QgaW5jbHVkZSB0aGUgZ2l2ZW4gc3RyaW5nLiBJdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuXG4gICAqIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzbid0IGV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIHZhciBnb29kRm4gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChnb29kRm4pLnRvLm5vdC50aHJvdygpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGdvb2RGbikudG8ubm90LnRocm93KFJlZmVyZW5jZUVycm9yLCAneCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIHRoYXQgdGhlIGVycm9yIGlzIG9mIGl0cyBleHBlY3RlZCB0eXBlLCBhbmQgaGFzIGEgbWVzc2FnZSB0aGF0IGluY2x1ZGVzIGFuXG4gICAqIGV4cGVjdGVkIHN0cmluZywgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55XG4gICAqIHVuZXhwZWN0ZWQgdHlwZXMsIGFuZCBkb2Vzbid0IGhhdmUgYSBtZXNzYWdlIHRoYXQgaW5jbHVkZXMgc29tZSBzdHJpbmcuXG4gICAqXG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgc2FsbW9uIScpOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICdzYWxtb24nKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8ubm90LnRocm93KFJlZmVyZW5jZUVycm9yLCAneCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC50aHJvd2AgY2hhbmdlcyB0aGUgdGFyZ2V0IG9mIGFueSBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0b1xuICAgKiBiZSB0aGUgZXJyb3Igb2JqZWN0IHRoYXQncyB0aHJvd24uXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7XG4gICAqICAgICBlcnIuY29kZSA9IDQyO1xuICAgKiAgICAgdmFyIGJhZEZuID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBlcnI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KFR5cGVFcnJvcikud2l0aC5wcm9wZXJ0eSgnY29kZScsIDQyKTtcbiAgICpcbiAgICogYC50aHJvd2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzIHVzZVxuICAgKiB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgZ29vZEZuID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QoZ29vZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICd4JywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KGdvb2RGbiwgJ25vb28gd2h5IGZhaWw/PycpLnRvLnRocm93KCk7XG4gICAqXG4gICAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBFUzUsIGAudGhyb3dgIG1heSBub3QgYWx3YXlzIHdvcmsgYXMgZXhwZWN0ZWQgd2hlblxuICAgKiB1c2luZyBhIHRyYW5zcGlsZXIgc3VjaCBhcyBCYWJlbCBvciBUeXBlU2NyaXB0LiBJbiBwYXJ0aWN1bGFyLCBpdCBtYXlcbiAgICogcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiBzdWJjbGFzc2luZyB0aGUgYnVpbHQtaW4gYEVycm9yYCBvYmplY3QgYW5kXG4gICAqIHRoZW4gcGFzc2luZyB0aGUgc3ViY2xhc3NlZCBjb25zdHJ1Y3RvciB0byBgLnRocm93YC4gU2VlIHlvdXIgdHJhbnNwaWxlcidzXG4gICAqIGRvY3MgZm9yIGRldGFpbHM6XG4gICAqXG4gICAqIC0gKFtCYWJlbF0oaHR0cHM6Ly9iYWJlbGpzLmlvL2RvY3MvdXNhZ2UvY2F2ZWF0cy8jY2xhc3NlcykpXG4gICAqIC0gKFtUeXBlU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29yaykpXG4gICAqXG4gICAqIEJld2FyZSBvZiBzb21lIGNvbW1vbiBtaXN0YWtlcyB3aGVuIHVzaW5nIHRoZSBgdGhyb3dgIGFzc2VydGlvbi4gT25lIGNvbW1vblxuICAgKiBtaXN0YWtlIGlzIHRvIGFjY2lkZW50YWxseSBpbnZva2UgdGhlIGZ1bmN0aW9uIHlvdXJzZWxmIGluc3RlYWQgb2YgbGV0dGluZ1xuICAgKiB0aGUgYHRocm93YCBhc3NlcnRpb24gaW52b2tlIHRoZSBmdW5jdGlvbiBmb3IgeW91LiBGb3IgZXhhbXBsZSwgd2hlblxuICAgKiB0ZXN0aW5nIGlmIGEgZnVuY3Rpb24gbmFtZWQgYGZuYCB0aHJvd3MsIHByb3ZpZGUgYGZuYCBpbnN0ZWFkIG9mIGBmbigpYCBhc1xuICAgKiB0aGUgdGFyZ2V0IGZvciB0aGUgYXNzZXJ0aW9uLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZuKS50by50aHJvdygpOyAgICAgLy8gR29vZCEgVGVzdHMgYGZuYCBhcyBkZXNpcmVkXG4gICAqICAgICBleHBlY3QoZm4oKSkudG8udGhyb3coKTsgICAvLyBCYWQhIFRlc3RzIHJlc3VsdCBvZiBgZm4oKWAsIG5vdCBgZm5gXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIGFzc2VydCB0aGF0IHlvdXIgZnVuY3Rpb24gYGZuYCB0aHJvd3Mgd2hlbiBwYXNzZWQgY2VydGFpblxuICAgKiBhcmd1bWVudHMsIHRoZW4gd3JhcCBhIGNhbGwgdG8gYGZuYCBpbnNpZGUgb2YgYW5vdGhlciBmdW5jdGlvbi5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7IGZuKDQyKTsgfSkudG8udGhyb3coKTsgIC8vIEZ1bmN0aW9uIGV4cHJlc3Npb25cbiAgICogICAgIGV4cGVjdCgoKSA9PiBmbig0MikpLnRvLnRocm93KCk7ICAgICAgICAgICAgIC8vIEVTNiBhcnJvdyBmdW5jdGlvblxuICAgKlxuICAgKiBBbm90aGVyIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHByb3ZpZGUgYW4gb2JqZWN0IG1ldGhvZCAob3IgYW55IHN0YW5kLWFsb25lXG4gICAqIGZ1bmN0aW9uIHRoYXQgcmVsaWVzIG9uIGB0aGlzYCkgYXMgdGhlIHRhcmdldCBvZiB0aGUgYXNzZXJ0aW9uLiBEb2luZyBzbyBpc1xuICAgKiBwcm9ibGVtYXRpYyBiZWNhdXNlIHRoZSBgdGhpc2AgY29udGV4dCB3aWxsIGJlIGxvc3Qgd2hlbiB0aGUgZnVuY3Rpb24gaXNcbiAgICogaW52b2tlZCBieSBgLnRocm93YDsgdGhlcmUncyBubyB3YXkgZm9yIGl0IHRvIGtub3cgd2hhdCBgdGhpc2AgaXMgc3VwcG9zZWRcbiAgICogdG8gYmUuIFRoZXJlIGFyZSB0d28gd2F5cyBhcm91bmQgdGhpcyBwcm9ibGVtLiBPbmUgc29sdXRpb24gaXMgdG8gd3JhcCB0aGVcbiAgICogbWV0aG9kIG9yIGZ1bmN0aW9uIGNhbGwgaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24uIEFub3RoZXIgc29sdXRpb24gaXMgdG9cbiAgICogdXNlIGBiaW5kYC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7IGNhdC5tZW93KCk7IH0pLnRvLnRocm93KCk7ICAvLyBGdW5jdGlvbiBleHByZXNzaW9uXG4gICAqICAgICBleHBlY3QoKCkgPT4gY2F0Lm1lb3coKSkudG8udGhyb3coKTsgICAgICAgICAgICAgLy8gRVM2IGFycm93IGZ1bmN0aW9uXG4gICAqICAgICBleHBlY3QoY2F0Lm1lb3cuYmluZChjYXQpKS50by50aHJvdygpOyAgICAgICAgICAgLy8gQmluZFxuICAgKlxuICAgKiBGaW5hbGx5LCBpdCdzIHdvcnRoIG1lbnRpb25pbmcgdGhhdCBpdCdzIGEgYmVzdCBwcmFjdGljZSBpbiBKYXZhU2NyaXB0IHRvXG4gICAqIG9ubHkgdGhyb3cgYEVycm9yYCBhbmQgZGVyaXZhdGl2ZXMgb2YgYEVycm9yYCBzdWNoIGFzIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAqIGBUeXBlRXJyb3JgLCBhbmQgdXNlci1kZWZpbmVkIG9iamVjdHMgdGhhdCBleHRlbmQgYEVycm9yYC4gTm8gb3RoZXIgdHlwZSBvZlxuICAgKiB2YWx1ZSB3aWxsIGdlbmVyYXRlIGEgc3RhY2sgdHJhY2Ugd2hlbiBpbml0aWFsaXplZC4gV2l0aCB0aGF0IHNhaWQsIHRoZVxuICAgKiBgdGhyb3dgIGFzc2VydGlvbiBkb2VzIHRlY2huaWNhbGx5IHN1cHBvcnQgYW55IHR5cGUgb2YgdmFsdWUgYmVpbmcgdGhyb3duLFxuICAgKiBub3QganVzdCBgRXJyb3JgIGFuZCBpdHMgZGVyaXZhdGl2ZXMuXG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAudGhyb3dzYCBhbmQgYC5UaHJvd2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGhcbiAgICogYC50aHJvd2AuXG4gICAqXG4gICAqIEBuYW1lIHRocm93XG4gICAqIEBhbGlhcyB0aHJvd3NcbiAgICogQGFsaWFzIFRocm93XG4gICAqIEBwYXJhbSB7RXJyb3J8RXJyb3JDb25zdHJ1Y3Rvcn0gZXJyb3JMaWtlXG4gICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gZXJyTXNnTWF0Y2hlciBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0Vycm9yX3R5cGVzXG4gICAqIEByZXR1cm5zIGVycm9yIGZvciBjaGFpbmluZyAobnVsbCBpZiBubyBlcnJvcilcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0VGhyb3dzIChlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgbmVnYXRlID0gZmxhZyh0aGlzLCAnbmVnYXRlJykgfHwgZmFsc2U7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHR5cGVvZiBlcnJvckxpa2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY2F1Z2h0RXJyO1xuICAgIHRyeSB7XG4gICAgICBvYmooKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhdWdodEVyciA9IGVycjtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIHRoZSBuZWdhdGUgZmxhZyBlbmFibGVkIGFuZCBhdCBsZWFzdCBvbmUgdmFsaWQgYXJndW1lbnQgaXQgbWVhbnMgd2UgZG8gZXhwZWN0IGFuIGVycm9yXG4gICAgLy8gYnV0IHdlIHdhbnQgaXQgdG8gbWF0Y2ggYSBnaXZlbiBzZXQgb2YgY3JpdGVyaWFcbiAgICB2YXIgZXZlcnlBcmdJc1VuZGVmaW5lZCA9IGVycm9yTGlrZSA9PT0gdW5kZWZpbmVkICYmIGVyck1zZ01hdGNoZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHdlJ3ZlIGdvdCB0aGUgbmVnYXRlIGZsYWcgZW5hYmxlZCBhbmQgYm90aCBhcmdzLCB3ZSBzaG91bGQgb25seSBmYWlsIGlmIGJvdGggYXJlbid0IGNvbXBhdGlibGVcbiAgICAvLyBTZWUgSXNzdWUgIzU1MSBhbmQgUFIgIzY4M0BHaXRIdWJcbiAgICB2YXIgZXZlcnlBcmdJc0RlZmluZWQgPSBCb29sZWFuKGVycm9yTGlrZSAmJiBlcnJNc2dNYXRjaGVyKTtcbiAgICB2YXIgZXJyb3JMaWtlRmFpbCA9IGZhbHNlO1xuICAgIHZhciBlcnJNc2dNYXRjaGVyRmFpbCA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgZXJyb3Igd2FzIHRocm93blxuICAgIGlmIChldmVyeUFyZ0lzVW5kZWZpbmVkIHx8ICFldmVyeUFyZ0lzVW5kZWZpbmVkICYmICFuZWdhdGUpIHtcbiAgICAgIC8vIFdlIG5lZWQgdGhpcyB0byBkaXNwbGF5IHJlc3VsdHMgY29ycmVjdGx5IGFjY29yZGluZyB0byB0aGVpciB0eXBlc1xuICAgICAgdmFyIGVycm9yTGlrZVN0cmluZyA9ICdhbiBlcnJvcic7XG4gICAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgZXJyb3JMaWtlU3RyaW5nID0gJyN7ZXhwfSc7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yTGlrZSkge1xuICAgICAgICBlcnJvckxpa2VTdHJpbmcgPSBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGNhdWdodEVyclxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICcgKyBlcnJvckxpa2VTdHJpbmdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgYW4gZXJyb3IgYnV0ICN7YWN0fSB3YXMgdGhyb3duJ1xuICAgICAgICAsIGVycm9yTGlrZSAmJiBlcnJvckxpa2UudG9TdHJpbmcoKVxuICAgICAgICAsIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/XG4gICAgICAgICAgICBjYXVnaHRFcnIudG9TdHJpbmcoKSA6ICh0eXBlb2YgY2F1Z2h0RXJyID09PSAnc3RyaW5nJyA/IGNhdWdodEVyciA6IGNhdWdodEVyciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5jaGVja0Vycm9yLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yTGlrZSAmJiBjYXVnaHRFcnIpIHtcbiAgICAgIC8vIFdlIHNob3VsZCBjb21wYXJlIGluc3RhbmNlcyBvbmx5IGlmIGBlcnJvckxpa2VgIGlzIGFuIGluc3RhbmNlIG9mIGBFcnJvcmBcbiAgICAgIGlmIChlcnJvckxpa2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB2YXIgaXNDb21wYXRpYmxlSW5zdGFuY2UgPSBfLmNoZWNrRXJyb3IuY29tcGF0aWJsZUluc3RhbmNlKGNhdWdodEVyciwgZXJyb3JMaWtlKTtcblxuICAgICAgICBpZiAoaXNDb21wYXRpYmxlSW5zdGFuY2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICAgIC8vIFRoZXNlIGNoZWNrcyB3ZXJlIGNyZWF0ZWQgdG8gZW5zdXJlIHdlIHdvbid0IGZhaWwgdG9vIHNvb24gd2hlbiB3ZSd2ZSBnb3QgYm90aCBhcmdzIGFuZCBhIG5lZ2F0ZVxuICAgICAgICAgIC8vIFNlZSBJc3N1ZSAjNTUxIGFuZCBQUiAjNjgzQEdpdEh1YlxuICAgICAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgICAgIGVycm9yTGlrZUZhaWwgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyAje2V4cH0gYnV0ICN7YWN0fSB3YXMgdGhyb3duJ1xuICAgICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH0nICsgKGNhdWdodEVyciAmJiAhbmVnYXRlID8gJyBidXQgI3thY3R9IHdhcyB0aHJvd24nIDogJycpXG4gICAgICAgICAgICAgICwgZXJyb3JMaWtlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgLCBjYXVnaHRFcnIudG9TdHJpbmcoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGlzQ29tcGF0aWJsZUNvbnN0cnVjdG9yID0gXy5jaGVja0Vycm9yLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihjYXVnaHRFcnIsIGVycm9yTGlrZSk7XG4gICAgICBpZiAoaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgICBlcnJvckxpa2VGYWlsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgbmVnYXRlXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICN7ZXhwfSBidXQgI3thY3R9IHdhcyB0aHJvd24nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH0nICsgKGNhdWdodEVyciA/ICcgYnV0ICN7YWN0fSB3YXMgdGhyb3duJyA6ICcnKVxuICAgICAgICAgICAgLCAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkpXG4gICAgICAgICAgICAsIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVyci50b1N0cmluZygpIDogY2F1Z2h0RXJyICYmIF8uY2hlY2tFcnJvci5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNhdWdodEVyciAmJiBlcnJNc2dNYXRjaGVyICE9PSB1bmRlZmluZWQgJiYgZXJyTXNnTWF0Y2hlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSGVyZSB3ZSBjaGVjayBjb21wYXRpYmxlIG1lc3NhZ2VzXG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSAnaW5jbHVkaW5nJztcbiAgICAgIGlmIChlcnJNc2dNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyID0gJ21hdGNoaW5nJ1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNDb21wYXRpYmxlTWVzc2FnZSA9IF8uY2hlY2tFcnJvci5jb21wYXRpYmxlTWVzc2FnZShjYXVnaHRFcnIsIGVyck1zZ01hdGNoZXIpO1xuICAgICAgaWYgKGlzQ29tcGF0aWJsZU1lc3NhZ2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgICBlcnJNc2dNYXRjaGVyRmFpbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3IgJyArIHBsYWNlaG9sZGVyICsgJyAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IGVycm9yIG5vdCAnICsgcGxhY2Vob2xkZXIgKyAnICN7ZXhwfSdcbiAgICAgICAgICAgICwgIGVyck1zZ01hdGNoZXJcbiAgICAgICAgICAgICwgIF8uY2hlY2tFcnJvci5nZXRNZXNzYWdlKGNhdWdodEVycilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYm90aCBhc3NlcnRpb25zIGZhaWxlZCBhbmQgYm90aCBzaG91bGQndmUgbWF0Y2hlZCB3ZSB0aHJvdyBhbiBlcnJvclxuICAgIGlmIChlcnJvckxpa2VGYWlsICYmIGVyck1zZ01hdGNoZXJGYWlsKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbmVnYXRlXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93bidcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgI3tleHB9JyArIChjYXVnaHRFcnIgPyAnIGJ1dCAje2FjdH0gd2FzIHRocm93bicgOiAnJylcbiAgICAgICAgLCAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkpXG4gICAgICAgICwgKGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyLnRvU3RyaW5nKCkgOiBjYXVnaHRFcnIgJiYgXy5jaGVja0Vycm9yLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBjYXVnaHRFcnIpO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3Rocm93JywgYXNzZXJ0VGhyb3dzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgndGhyb3dzJywgYXNzZXJ0VGhyb3dzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnVGhyb3cnLCBhc3NlcnRUaHJvd3MpO1xuXG4gIC8qKlxuICAgKiAjIyMgLnJlc3BvbmRUbyhtZXRob2RbLCBtc2ddKVxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBgLnJlc3BvbmRUb2AgYXNzZXJ0cyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgaGFzIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgYG1ldGhvZGAuIFRoZSBtZXRob2QgY2FuIGJlIG93biBvclxuICAgKiBpbmhlcml0ZWQsIGFuZCBpdCBjYW4gYmUgZW51bWVyYWJsZSBvciBub24tZW51bWVyYWJsZS5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7fVxuICAgKiAgICAgQ2F0LnByb3RvdHlwZS5tZW93ID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IENhdCgpKS50by5yZXNwb25kVG8oJ21lb3cnKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgZnVuY3Rpb24sIGAucmVzcG9uZFRvYCBhc3NlcnRzIHRoYXQgdGhlIHRhcmdldCdzXG4gICAqIGBwcm90b3R5cGVgIHByb3BlcnR5IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGBtZXRob2RgLiBBZ2FpbiwgdGhlXG4gICAqIG1ldGhvZCBjYW4gYmUgb3duIG9yIGluaGVyaXRlZCwgYW5kIGl0IGNhbiBiZSBlbnVtZXJhYmxlIG9yIG5vbi1lbnVtZXJhYmxlLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gQ2F0ICgpIHt9XG4gICAqICAgICBDYXQucHJvdG90eXBlLm1lb3cgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLnRvLnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBBZGQgYC5pdHNlbGZgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGZvcmNlIGAucmVzcG9uZFRvYCB0byB0cmVhdCB0aGVcbiAgICogdGFyZ2V0IGFzIGEgbm9uLWZ1bmN0aW9uIG9iamVjdCwgZXZlbiBpZiBpdCdzIGEgZnVuY3Rpb24uIFRodXMsIGl0IGFzc2VydHNcbiAgICogdGhhdCB0aGUgdGFyZ2V0IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGBtZXRob2RgLCByYXRoZXIgdGhhblxuICAgKiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0J3MgYHByb3RvdHlwZWAgcHJvcGVydHkgaGFzIGEgbWV0aG9kIHdpdGggdGhlXG4gICAqIGdpdmVuIG5hbWUgYG1ldGhvZGAuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiBDYXQgKCkge31cbiAgICogICAgIENhdC5wcm90b3R5cGUubWVvdyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKiAgICAgQ2F0Lmhpc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLml0c2VsZi50by5yZXNwb25kVG8oJ2hpc3MnKS5idXQubm90LnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBXaGVuIG5vdCBhZGRpbmcgYC5pdHNlbGZgLCBpdCdzIGltcG9ydGFudCB0byBjaGVjayB0aGUgdGFyZ2V0J3MgdHlwZSBiZWZvcmVcbiAgICogdXNpbmcgYC5yZXNwb25kVG9gLiBTZWUgdGhlIGAuYWAgZG9jIGZvciBpbmZvIG9uIGNoZWNraW5nIGEgdGFyZ2V0J3MgdHlwZS5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7fVxuICAgKiAgICAgQ2F0LnByb3RvdHlwZS5tZW93ID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IENhdCgpKS50by5iZS5hbignb2JqZWN0JykudGhhdC5yZXNwb25kc1RvKCdtZW93Jyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAucmVzcG9uZFRvYC5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIERvZyAoKSB7fVxuICAgKiAgICAgRG9nLnByb3RvdHlwZS5iYXJrID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IERvZygpKS50by5ub3QucmVzcG9uZFRvKCdtZW93Jyk7XG4gICAqXG4gICAqIGAucmVzcG9uZFRvYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe30pLnRvLnJlc3BvbmRUbygnbWVvdycsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7fSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5yZXNwb25kc1RvYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLnJlc3BvbmRUb2AuXG4gICAqXG4gICAqIEBuYW1lIHJlc3BvbmRUb1xuICAgKiBAYWxpYXMgcmVzcG9uZHNUb1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiByZXNwb25kVG8gKG1ldGhvZCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGl0c2VsZiA9IGZsYWcodGhpcywgJ2l0c2VsZicpXG4gICAgICAsIGNvbnRleHQgPSAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iaiAmJiAhaXRzZWxmKVxuICAgICAgICA/IG9iai5wcm90b3R5cGVbbWV0aG9kXVxuICAgICAgICA6IG9ialttZXRob2RdO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBjb250ZXh0XG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHJlc3BvbmQgdG8gJyArIF8uaW5zcGVjdChtZXRob2QpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCByZXNwb25kIHRvICcgKyBfLmluc3BlY3QobWV0aG9kKVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdyZXNwb25kVG8nLCByZXNwb25kVG8pO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdyZXNwb25kc1RvJywgcmVzcG9uZFRvKTtcblxuICAvKipcbiAgICogIyMjIC5pdHNlbGZcbiAgICpcbiAgICogRm9yY2VzIGFsbCBgLnJlc3BvbmRUb2AgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gYmVoYXZlIGFzIGlmXG4gICAqIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBldmVuIGlmIGl0J3MgYSBmdW5jdGlvbi4gVGh1cywgaXRcbiAgICogY2F1c2VzIGAucmVzcG9uZFRvYCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlblxuICAgKiBuYW1lLCByYXRoZXIgdGhhbiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0J3MgYHByb3RvdHlwZWAgcHJvcGVydHkgaGFzIGFcbiAgICogbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiBDYXQgKCkge31cbiAgICogICAgIENhdC5wcm90b3R5cGUubWVvdyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKiAgICAgQ2F0Lmhpc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLml0c2VsZi50by5yZXNwb25kVG8oJ2hpc3MnKS5idXQubm90LnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBAbmFtZSBpdHNlbGZcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdpdHNlbGYnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnaXRzZWxmJywgdHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLnNhdGlzZnkobWF0Y2hlclssIG1zZ10pXG4gICAqXG4gICAqIEludm9rZXMgdGhlIGdpdmVuIGBtYXRjaGVyYCBmdW5jdGlvbiB3aXRoIHRoZSB0YXJnZXQgYmVpbmcgcGFzc2VkIGFzIHRoZVxuICAgKiBmaXJzdCBhcmd1bWVudCwgYW5kIGFzc2VydHMgdGhhdCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgdHJ1dGh5LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLnNhdGlzZnkoZnVuY3Rpb24obnVtKSB7XG4gICAqICAgICAgIHJldHVybiBudW0gPiAwO1xuICAgKiAgICAgfSk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuc2F0aXNmeWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LnNhdGlzZnkoZnVuY3Rpb24obnVtKSB7XG4gICAqICAgICAgIHJldHVybiBudW0gPiAyO1xuICAgKiAgICAgfSk7XG4gICAqXG4gICAqIGAuc2F0aXNmeWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLnNhdGlzZnkoZnVuY3Rpb24obnVtKSB7XG4gICAqICAgICAgIHJldHVybiBudW0gPiAyO1xuICAgKiAgICAgfSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5zYXRpc2Z5KGZ1bmN0aW9uKG51bSkge1xuICAgKiAgICAgICByZXR1cm4gbnVtID4gMjtcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5zYXRpc2ZpZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuc2F0aXNmeWAuXG4gICAqXG4gICAqIEBuYW1lIHNhdGlzZnlcbiAgICogQGFsaWFzIHNhdGlzZmllc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBzYXRpc2Z5IChtYXRjaGVyLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgdmFyIHJlc3VsdCA9IG1hdGNoZXIob2JqKTtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgcmVzdWx0XG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHNhdGlzZnkgJyArIF8ub2JqRGlzcGxheShtYXRjaGVyKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3Qgc2F0aXNmeScgKyBfLm9iakRpc3BsYXkobWF0Y2hlcilcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyBmYWxzZSA6IHRydWVcbiAgICAgICwgcmVzdWx0XG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3NhdGlzZnknLCBzYXRpc2Z5KTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnc2F0aXNmaWVzJywgc2F0aXNmeSk7XG5cbiAgLyoqXG4gICAqICMjIyAuY2xvc2VUbyhleHBlY3RlZCwgZGVsdGFbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciB0aGF0J3Mgd2l0aGluIGEgZ2l2ZW4gKy8tIGBkZWx0YWAgcmFuZ2VcbiAgICogb2YgdGhlIGdpdmVuIG51bWJlciBgZXhwZWN0ZWRgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlXG4gICAqIHRhcmdldCBpcyBlcXVhbCB0byBpdHMgZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uZXF1YWwoMS41KTtcbiAgICpcbiAgICogICAgIC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uYmUuY2xvc2VUbygxLCAwLjUpO1xuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uYmUuY2xvc2VUbygyLCAwLjUpO1xuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uYmUuY2xvc2VUbygxLCAxKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5jbG9zZVRvYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmVxdWFsKDEuNSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMS41KS50by5ub3QuYmUuY2xvc2VUbygzLCAxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuY2xvc2VUb2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEuNSkudG8uYmUuY2xvc2VUbygzLCAxLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMS41LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuY2xvc2VUbygzLCAxKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuYXBwcm94aW1hdGVseWAgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5jbG9zZVRvYC5cbiAgICpcbiAgICogQG5hbWUgY2xvc2VUb1xuICAgKiBAYWxpYXMgYXBwcm94aW1hdGVseVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBjbG9zZVRvKGV4cGVjdGVkLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcblxuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKCdudW1iZXInKTtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgZGVsdGEgIT09ICdudW1iZXInKSB7XG4gICAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG4gICAgICB2YXIgZGVsdGFNZXNzYWdlID0gZGVsdGEgPT09IHVuZGVmaW5lZCA/IFwiLCBhbmQgYSBkZWx0YSBpcyByZXF1aXJlZFwiIDogXCJcIjtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICBmbGFnTXNnICsgJ3RoZSBhcmd1bWVudHMgdG8gY2xvc2VUbyBvciBhcHByb3hpbWF0ZWx5IG11c3QgYmUgbnVtYmVycycgKyBkZWx0YU1lc3NhZ2UsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIE1hdGguYWJzKG9iaiAtIGV4cGVjdGVkKSA8PSBkZWx0YVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byAnICsgZXhwZWN0ZWQgKyAnICsvLSAnICsgZGVsdGFcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIGNsb3NlIHRvICcgKyBleHBlY3RlZCArICcgKy8tICcgKyBkZWx0YVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdjbG9zZVRvJywgY2xvc2VUbyk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2FwcHJveGltYXRlbHknLCBjbG9zZVRvKTtcblxuICAvLyBOb3RlOiBEdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGlmIHRlc3RpbmcgZm9yIGluY2x1c2lvbiBpbnN0ZWFkIG9mIHNhbWVuZXNzLlxuICBmdW5jdGlvbiBpc1N1YnNldE9mKHN1YnNldCwgc3VwZXJzZXQsIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpIHtcbiAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICBpZiAoc3Vic2V0Lmxlbmd0aCAhPT0gc3VwZXJzZXQubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBzdXBlcnNldCA9IHN1cGVyc2V0LnNsaWNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnNldC5ldmVyeShmdW5jdGlvbihlbGVtLCBpZHgpIHtcbiAgICAgIGlmIChvcmRlcmVkKSByZXR1cm4gY21wID8gY21wKGVsZW0sIHN1cGVyc2V0W2lkeF0pIDogZWxlbSA9PT0gc3VwZXJzZXRbaWR4XTtcblxuICAgICAgaWYgKCFjbXApIHtcbiAgICAgICAgdmFyIG1hdGNoSWR4ID0gc3VwZXJzZXQuaW5kZXhPZihlbGVtKTtcbiAgICAgICAgaWYgKG1hdGNoSWR4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIFJlbW92ZSBtYXRjaCBmcm9tIHN1cGVyc2V0IHNvIG5vdCBjb3VudGVkIHR3aWNlIGlmIGR1cGxpY2F0ZSBpbiBzdWJzZXQuXG4gICAgICAgIGlmICghY29udGFpbnMpIHN1cGVyc2V0LnNwbGljZShtYXRjaElkeCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VwZXJzZXQuc29tZShmdW5jdGlvbihlbGVtMiwgbWF0Y2hJZHgpIHtcbiAgICAgICAgaWYgKCFjbXAoZWxlbSwgZWxlbTIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVtb3ZlIG1hdGNoIGZyb20gc3VwZXJzZXQgc28gbm90IGNvdW50ZWQgdHdpY2UgaWYgZHVwbGljYXRlIGluIHN1YnNldC5cbiAgICAgICAgaWYgKCFjb250YWlucykgc3VwZXJzZXQuc3BsaWNlKG1hdGNoSWR4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm1lbWJlcnMoc2V0WywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgYXJyYXkgaGFzIHRoZSBzYW1lIG1lbWJlcnMgYXMgdGhlIGdpdmVuIGFycmF5XG4gICAqIGBzZXRgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5tZW1iZXJzKFsyLCAxLCAzXSk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDJdKS50by5oYXZlLm1lbWJlcnMoWzIsIDEsIDJdKTtcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgbWVtYmVycyBhcmUgY29tcGFyZWQgdXNpbmcgc3RyaWN0IChgPT09YCkgZXF1YWxpdHkuIEFkZCBgLmRlZXBgXG4gICAqIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5IGluc3RlYWQuIFNlZSB0aGUgYGRlZXAtZXFsYFxuICAgKiBwcm9qZWN0IHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIG1lbWJlciBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KFt7YTogMX1dKS50by5oYXZlLmRlZXAubWVtYmVycyhbe2E6IDF9XSk7XG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLm5vdC5oYXZlLm1lbWJlcnMoW3thOiAxfV0pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBvcmRlciBkb2Vzbid0IG1hdHRlci4gQWRkIGAub3JkZXJlZGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG9cbiAgICogcmVxdWlyZSB0aGF0IG1lbWJlcnMgYXBwZWFyIGluIHRoZSBzYW1lIG9yZGVyLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5vcmRlcmVkLm1lbWJlcnMoWzEsIDIsIDNdKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubWVtYmVycyhbMiwgMSwgM10pXG4gICAqICAgICAgIC5idXQubm90Lm9yZGVyZWQubWVtYmVycyhbMiwgMSwgM10pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBib3RoIGFycmF5cyBtdXN0IGJlIHRoZSBzYW1lIHNpemUuIEFkZCBgLmluY2x1ZGVgIGVhcmxpZXIgaW5cbiAgICogdGhlIGNoYWluIHRvIHJlcXVpcmUgdGhhdCB0aGUgdGFyZ2V0J3MgbWVtYmVycyBiZSBhIHN1cGVyc2V0IG9mIHRoZVxuICAgKiBleHBlY3RlZCBtZW1iZXJzLiBOb3RlIHRoYXQgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBpbiB0aGUgc3Vic2V0IHdoZW5cbiAgICogYC5pbmNsdWRlYCBpcyBhZGRlZC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBpcyBhIHN1cGVyc2V0IG9mIFsxLCAyXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaW5jbHVkZS5tZW1iZXJzKFsxLCAyXSk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5ub3QuaGF2ZS5tZW1iZXJzKFsxLCAyXSk7XG4gICAqXG4gICAqICAgICAvLyBEdXBsaWNhdGVzIGluIHRoZSBzdWJzZXQgYXJlIGlnbm9yZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUubWVtYmVycyhbMSwgMiwgMiwgMl0pO1xuICAgKlxuICAgKiBgLmRlZXBgLCBgLm9yZGVyZWRgLCBhbmQgYC5pbmNsdWRlYCBjYW4gYWxsIGJlIGNvbWJpbmVkLiBIb3dldmVyLCBpZlxuICAgKiBgLmluY2x1ZGVgIGFuZCBgLm9yZGVyZWRgIGFyZSBjb21iaW5lZCwgdGhlIG9yZGVyaW5nIGJlZ2lucyBhdCB0aGUgc3RhcnQgb2ZcbiAgICogYm90aCBhcnJheXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoW3thOiAxfSwge2I6IDJ9LCB7YzogM31dKVxuICAgKiAgICAgICAudG8uaW5jbHVkZS5kZWVwLm9yZGVyZWQubWVtYmVycyhbe2E6IDF9LCB7YjogMn1dKVxuICAgKiAgICAgICAuYnV0Lm5vdC5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKFt7YjogMn0sIHtjOiAzfV0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm1lbWJlcnNgLiBIb3dldmVyLCBpdCdzXG4gICAqIGRhbmdlcm91cyB0byBkbyBzby4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnNcbiAgICogYnkgYXNzZXJ0aW5nIHRoYXQgdGhlIHRhcmdldCBhcnJheSBkb2Vzbid0IGhhdmUgYWxsIG9mIHRoZSBzYW1lIG1lbWJlcnMgYXNcbiAgICogdGhlIGdpdmVuIGFycmF5IGBzZXRgIGJ1dCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNvbWUgb2YgdGhlbS4gSXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb25cbiAgICogdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5ub3QuaW5jbHVkZSgzKS5hbmQubm90LmluY2x1ZGUoNCk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5ub3QuaGF2ZS5tZW1iZXJzKFszLCA0XSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLm1lbWJlcnNgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmhhdmUubWVtYmVycyhbMSwgMiwgM10sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdChbMSwgMl0sICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLm1lbWJlcnMoWzEsIDIsIDNdKTtcbiAgICpcbiAgICogQG5hbWUgbWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ21lbWJlcnMnLCBmdW5jdGlvbiAoc3Vic2V0LCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuXG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLmFuKCdhcnJheScpO1xuICAgIG5ldyBBc3NlcnRpb24oc3Vic2V0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5hbignYXJyYXknKTtcblxuICAgIHZhciBjb250YWlucyA9IGZsYWcodGhpcywgJ2NvbnRhaW5zJyk7XG4gICAgdmFyIG9yZGVyZWQgPSBmbGFnKHRoaXMsICdvcmRlcmVkJyk7XG5cbiAgICB2YXIgc3ViamVjdCwgZmFpbE1zZywgZmFpbE5lZ2F0ZU1zZztcblxuICAgIGlmIChjb250YWlucykge1xuICAgICAgc3ViamVjdCA9IG9yZGVyZWQgPyAnYW4gb3JkZXJlZCBzdXBlcnNldCcgOiAnYSBzdXBlcnNldCc7XG4gICAgICBmYWlsTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgJyArIHN1YmplY3QgKyAnIG9mICN7ZXhwfSc7XG4gICAgICBmYWlsTmVnYXRlTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlICcgKyBzdWJqZWN0ICsgJyBvZiAje2V4cH0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJqZWN0ID0gb3JkZXJlZCA/ICdvcmRlcmVkIG1lbWJlcnMnIDogJ21lbWJlcnMnO1xuICAgICAgZmFpbE1zZyA9ICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgdGhlIHNhbWUgJyArIHN1YmplY3QgKyAnIGFzICN7ZXhwfSc7XG4gICAgICBmYWlsTmVnYXRlTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgdGhlIHNhbWUgJyArIHN1YmplY3QgKyAnIGFzICN7ZXhwfSc7XG4gICAgfVxuXG4gICAgdmFyIGNtcCA9IGZsYWcodGhpcywgJ2RlZXAnKSA/IF8uZXFsIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGlzU3Vic2V0T2Yoc3Vic2V0LCBvYmosIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpXG4gICAgICAsIGZhaWxNc2dcbiAgICAgICwgZmFpbE5lZ2F0ZU1zZ1xuICAgICAgLCBzdWJzZXRcbiAgICAgICwgb2JqXG4gICAgICAsIHRydWVcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5vbmVPZihsaXN0WywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBtZW1iZXIgb2YgdGhlIGdpdmVuIGFycmF5IGBsaXN0YC4gSG93ZXZlcixcbiAgICogaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLm9uZU9mKFsxLCAyLCAzXSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBDb21wYXJpc29ucyBhcmUgcGVyZm9ybWVkIHVzaW5nIHN0cmljdCAoYD09PWApIGVxdWFsaXR5LlxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm9uZU9mYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUub25lT2YoWzIsIDMsIDRdKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEl0IGNhbiBhbHNvIGJlIGNoYWluZWQgd2l0aCBgLmNvbnRhaW5gIG9yIGAuaW5jbHVkZWAsIHdoaWNoIHdpbGwgd29yayB3aXRoXG4gICAqIGJvdGggYXJyYXlzIGFuZCBzdHJpbmdzOlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdUb2RheSBpcyBzdW5ueScpLnRvLmNvbnRhaW4ub25lT2YoWydzdW5ueScsICdjbG91ZHknXSlcbiAgICogICAgIGV4cGVjdCgnVG9kYXkgaXMgcmFpbnknKS50by5ub3QuY29udGFpbi5vbmVPZihbJ3N1bm55JywgJ2Nsb3VkeSddKVxuICAgKiAgICAgZXhwZWN0KFsxLDIsM10pLnRvLmNvbnRhaW4ub25lT2YoWzMsNCw1XSlcbiAgICogICAgIGV4cGVjdChbMSwyLDNdKS50by5ub3QuY29udGFpbi5vbmVPZihbNCw1LDZdKVxuICAgKlxuICAgKiBgLm9uZU9mYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUub25lT2YoWzIsIDMsIDRdLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLm9uZU9mKFsyLCAzLCA0XSk7XG4gICAqXG4gICAqIEBuYW1lIG9uZU9mXG4gICAqIEBwYXJhbSB7QXJyYXk8Kj59IGxpc3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIG9uZU9mIChsaXN0LCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgZXhwZWN0ZWQgPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgY29udGFpbnMgPSBmbGFnKHRoaXMsICdjb250YWlucycpXG4gICAgICAsIGlzRGVlcCA9IGZsYWcodGhpcywgJ2RlZXAnKTtcbiAgICBuZXcgQXNzZXJ0aW9uKGxpc3QsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLmFuKCdhcnJheScpO1xuXG4gICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbGlzdC5zb21lKGZ1bmN0aW9uKHBvc3NpYmlsaXR5KSB7IHJldHVybiBleHBlY3RlZC5pbmRleE9mKHBvc3NpYmlsaXR5KSA+IC0xIH0pXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiBvbmUgb2YgI3tleHB9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIG9uZSBvZiAje2V4cH0nXG4gICAgICAgICwgbGlzdFxuICAgICAgICAsIGV4cGVjdGVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkgeyByZXR1cm4gXy5lcWwoZXhwZWN0ZWQsIHBvc3NpYmlsaXR5KSB9KVxuICAgICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gZGVlcGx5IGVxdWFsIG9uZSBvZiAje2V4cH0nXG4gICAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgb25lIG9mICN7ZXhwfSdcbiAgICAgICAgICAsIGxpc3RcbiAgICAgICAgICAsIGV4cGVjdGVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBsaXN0LmluZGV4T2YoZXhwZWN0ZWQpID4gLTFcbiAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIG9uZSBvZiAje2V4cH0nXG4gICAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgb25lIG9mICN7ZXhwfSdcbiAgICAgICAgICAsIGxpc3RcbiAgICAgICAgICAsIGV4cGVjdGVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnb25lT2YnLCBvbmVPZik7XG5cbiAgLyoqXG4gICAqICMjIyAuY2hhbmdlKHN1YmplY3RbLCBwcm9wWywgbXNnXV0pXG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBgLmNoYW5nZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBmdW5jdGlvblxuICAgKiBgc3ViamVjdGAgcmV0dXJucyBhIGRpZmZlcmVudCB2YWx1ZSB3aGVuIGl0J3MgaW52b2tlZCBiZWZvcmUgdGhlIHRhcmdldFxuICAgKiBmdW5jdGlvbiBjb21wYXJlZCB0byB3aGVuIGl0J3MgaW52b2tlZCBhZnRlcndhcmQuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCBgc3ViamVjdGAgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgdmFyIGRvdHMgPSAnJ1xuICAgKiAgICAgICAsIGFkZERvdCA9IGZ1bmN0aW9uICgpIHsgZG90cyArPSAnLic7IH1cbiAgICogICAgICAgLCBnZXREb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG90czsgfTtcbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoZ2V0RG90cygpKS50by5lcXVhbCgnJyk7XG4gICAqICAgICBhZGREb3QoKTtcbiAgICogICAgIGV4cGVjdChnZXREb3RzKCkpLnRvLmVxdWFsKCcuJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChhZGREb3QpLnRvLmNoYW5nZShnZXREb3RzKTtcbiAgICpcbiAgICogV2hlbiB0d28gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgYC5jaGFuZ2VgIGFzc2VydHMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIGdpdmVuIG9iamVjdCBgc3ViamVjdGAncyBgcHJvcGAgcHJvcGVydHkgaXMgZGlmZmVyZW50IGJlZm9yZSBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIGFmdGVyd2FyZC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHtkb3RzOiAnJ31cbiAgICogICAgICAgLCBhZGREb3QgPSBmdW5jdGlvbiAoKSB7IG15T2JqLmRvdHMgKz0gJy4nOyB9O1xuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChteU9iaikudG8uaGF2ZS5wcm9wZXJ0eSgnZG90cycsICcnKTtcbiAgICogICAgIGFkZERvdCgpO1xuICAgKiAgICAgZXhwZWN0KG15T2JqKS50by5oYXZlLnByb3BlcnR5KCdkb3RzJywgJy4nKTtcbiAgICpcbiAgICogICAgIC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZERvdCkudG8uY2hhbmdlKG15T2JqLCAnZG90cycpO1xuICAgKlxuICAgKiBTdHJpY3QgKGA9PT1gKSBlcXVhbGl0eSBpcyB1c2VkIHRvIGNvbXBhcmUgYmVmb3JlIGFuZCBhZnRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuY2hhbmdlYC5cbiAgICpcbiAgICogICAgIHZhciBkb3RzID0gJydcbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge31cbiAgICogICAgICAgLCBnZXREb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG90czsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wKS50by5ub3QuY2hhbmdlKGdldERvdHMpO1xuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge2RvdHM6ICcnfVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wKS50by5ub3QuY2hhbmdlKG15T2JqLCAnZG90cycpO1xuICAgKlxuICAgKiBgLmNoYW5nZWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzXG4gICAqIHVzZSB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7ZG90czogJyd9XG4gICAqICAgICAgICwgYWRkRG90ID0gZnVuY3Rpb24gKCkgeyBteU9iai5kb3RzICs9ICcuJzsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGREb3QpLnRvLm5vdC5jaGFuZ2UobXlPYmosICdkb3RzJywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiAgICAgdmFyIGRvdHMgPSAnJ1xuICAgKiAgICAgICAsIGFkZERvdCA9IGZ1bmN0aW9uICgpIHsgZG90cyArPSAnLic7IH1cbiAgICogICAgICAgLCBnZXREb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG90czsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGREb3QsICdub29vIHdoeSBmYWlsPz8nKS50by5ub3QuY2hhbmdlKGdldERvdHMpO1xuICAgKlxuICAgKiBgLmNoYW5nZWAgYWxzbyBjYXVzZXMgYWxsIGAuYnlgIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluIHRvXG4gICAqIGFzc2VydCBob3cgbXVjaCBhIG51bWVyaWMgc3ViamVjdCB3YXMgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBieS4gSG93ZXZlcixcbiAgICogaXQncyBkYW5nZXJvdXMgdG8gdXNlIGAuY2hhbmdlLmJ5YC4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzXG4gICAqIHVuY2VydGFpbiBleHBlY3RhdGlvbnMgYnkgYXNzZXJ0aW5nIHRoYXQgdGhlIHN1YmplY3QgZWl0aGVyIGluY3JlYXNlcyBieVxuICAgKiB0aGUgZ2l2ZW4gZGVsdGEsIG9yIHRoYXQgaXQgZGVjcmVhc2VzIGJ5IHRoZSBnaXZlbiBkZWx0YS4gSXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb25cbiAgICogdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uY2hhbmdlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5jaGFuZ2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmNoYW5nZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuY2hhbmdlYC5cbiAgICpcbiAgICogQG5hbWUgY2hhbmdlXG4gICAqIEBhbGlhcyBjaGFuZ2VzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlcyAoc3ViamVjdCwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIGZuID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICB2YXIgaW5pdGlhbDtcbiAgICBpZiAoIXByb3ApIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICAgIH1cblxuICAgIGZuKCk7XG5cbiAgICB2YXIgZmluYWwgPSBwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcCA9PT0gbnVsbCA/IHN1YmplY3QoKSA6IHN1YmplY3RbcHJvcF07XG4gICAgdmFyIG1zZ09iaiA9IHByb3AgPT09IHVuZGVmaW5lZCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6ICcuJyArIHByb3A7XG5cbiAgICAvLyBUaGlzIGdldHMgZmxhZ2dlZCBiZWNhdXNlIG9mIHRoZSAuYnkoZGVsdGEpIGFzc2VydGlvblxuICAgIGZsYWcodGhpcywgJ2RlbHRhTXNnT2JqJywgbXNnT2JqKTtcbiAgICBmbGFnKHRoaXMsICdpbml0aWFsRGVsdGFWYWx1ZScsIGluaXRpYWwpO1xuICAgIGZsYWcodGhpcywgJ2ZpbmFsRGVsdGFWYWx1ZScsIGZpbmFsKTtcbiAgICBmbGFnKHRoaXMsICdkZWx0YUJlaGF2aW9yJywgJ2NoYW5nZScpO1xuICAgIGZsYWcodGhpcywgJ3JlYWxEZWx0YScsIGZpbmFsICE9PSBpbml0aWFsKTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaW5pdGlhbCAhPT0gZmluYWxcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIGNoYW5nZSdcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIG5vdCBjaGFuZ2UnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2NoYW5nZScsIGFzc2VydENoYW5nZXMpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdjaGFuZ2VzJywgYXNzZXJ0Q2hhbmdlcyk7XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jcmVhc2Uoc3ViamVjdFssIHByb3BbLCBtc2ddXSlcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGAuaW5jcmVhc2VgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb25cbiAgICogYHN1YmplY3RgIHJldHVybnMgYSBncmVhdGVyIG51bWJlciB3aGVuIGl0J3MgaW52b2tlZCBhZnRlciBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIHdoZW4gaXQncyBpbnZva2VkIGJlZm9yZWhhbmQuIGAuaW5jcmVhc2VgIGFsc29cbiAgICogY2F1c2VzIGFsbCBgLmJ5YCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byBhc3NlcnQgaG93IG11Y2hcbiAgICogZ3JlYXRlciBvZiBhIG51bWJlciBpcyByZXR1cm5lZC4gSXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSByZXR1cm5cbiAgICogdmFsdWUgaW5jcmVhc2VkIGJ5IHRoZSBleHBlY3RlZCBhbW91bnQsIHJhdGhlciB0aGFuIGFzc2VydGluZyBpdCBpbmNyZWFzZWRcbiAgICogYnkgYW55IGFtb3VudC5cbiAgICpcbiAgICogICAgIHZhciB2YWwgPSAxXG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyB2YWwgKz0gMjsgfVxuICAgKiAgICAgICAsIGdldFZhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbDsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmluY3JlYXNlKGdldFZhbCkuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShnZXRWYWwpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0d28gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgYC5pbmNyZWFzZWAgYXNzZXJ0cyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGVcbiAgICogZ2l2ZW4gb2JqZWN0IGBzdWJqZWN0YCdzIGBwcm9wYCBwcm9wZXJ0eSBpcyBncmVhdGVyIGFmdGVyIGludm9raW5nIHRoZVxuICAgKiB0YXJnZXQgZnVuY3Rpb24gY29tcGFyZWQgdG8gYmVmb3JlaGFuZC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgKz0gMjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmluY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5pbmNyZWFzZWAuIEhvd2V2ZXIsIGl0J3NcbiAgICogZGFuZ2Vyb3VzIHRvIGRvIHNvLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9uc1xuICAgKiBieSBhc3NlcnRpbmcgdGhhdCB0aGUgc3ViamVjdCBlaXRoZXIgZGVjcmVhc2VzLCBvciB0aGF0IGl0IHN0YXlzIHRoZSBzYW1lLlxuICAgKiBJdCdzIG9mdGVuIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuXG4gICAqIHdyaXRlIGFuIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgc3ViamVjdCBpcyBleHBlY3RlZCB0byBkZWNyZWFzZSwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IGl0XG4gICAqIGRlY3JlYXNlZCBieSB0aGUgZXhwZWN0ZWQgYW1vdW50LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLm5vdC5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgc3ViamVjdCBpcyBleHBlY3RlZCB0byBzdGF5IHRoZSBzYW1lLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vb3ApLnRvLm5vdC5jaGFuZ2UobXlPYmosICd2YWwnKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChub29wKS50by5ub3QuaW5jcmVhc2UobXlPYmosICd2YWwnKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuaW5jcmVhc2VgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nIHR3byBhcmd1bWVudHMsIGFsd2F5c1xuICAgKiB1c2UgdGhlIHNlY29uZCBmb3JtLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8uaW5jcmVhc2UobXlPYmosICd2YWwnLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqXG4gICAqICAgICB2YXIgdmFsID0gMVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxuICAgKiAgICAgICAsIGdldFZhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbDsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaW5jcmVhc2UoZ2V0VmFsKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuaW5jcmVhc2VzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmluY3JlYXNlYC5cbiAgICpcbiAgICogQG5hbWUgaW5jcmVhc2VcbiAgICogQGFsaWFzIGluY3JlYXNlc1xuICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc3ViamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEluY3JlYXNlcyAoc3ViamVjdCwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIGZuID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICB2YXIgaW5pdGlhbDtcbiAgICBpZiAoIXByb3ApIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXJcbiAgICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ251bWJlcicpO1xuXG4gICAgZm4oKTtcblxuICAgIHZhciBmaW5hbCA9IHByb3AgPT09IHVuZGVmaW5lZCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgICB2YXIgbXNnT2JqID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBpbml0aWFsIDogJy4nICsgcHJvcDtcblxuICAgIGZsYWcodGhpcywgJ2RlbHRhTXNnT2JqJywgbXNnT2JqKTtcbiAgICBmbGFnKHRoaXMsICdpbml0aWFsRGVsdGFWYWx1ZScsIGluaXRpYWwpO1xuICAgIGZsYWcodGhpcywgJ2ZpbmFsRGVsdGFWYWx1ZScsIGZpbmFsKTtcbiAgICBmbGFnKHRoaXMsICdkZWx0YUJlaGF2aW9yJywgJ2luY3JlYXNlJyk7XG4gICAgZmxhZyh0aGlzLCAncmVhbERlbHRhJywgZmluYWwgLSBpbml0aWFsKTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZmluYWwgLSBpbml0aWFsID4gMFxuICAgICAgLCAnZXhwZWN0ZWQgJyArIG1zZ09iaiArICcgdG8gaW5jcmVhc2UnXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBub3QgaW5jcmVhc2UnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2luY3JlYXNlJywgYXNzZXJ0SW5jcmVhc2VzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaW5jcmVhc2VzJywgYXNzZXJ0SW5jcmVhc2VzKTtcblxuICAvKipcbiAgICogIyMjIC5kZWNyZWFzZShzdWJqZWN0WywgcHJvcFssIG1zZ11dKVxuICAgKlxuICAgKiBXaGVuIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgYC5kZWNyZWFzZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBmdW5jdGlvblxuICAgKiBgc3ViamVjdGAgcmV0dXJucyBhIGxlc3NlciBudW1iZXIgd2hlbiBpdCdzIGludm9rZWQgYWZ0ZXIgaW52b2tpbmcgdGhlXG4gICAqIHRhcmdldCBmdW5jdGlvbiBjb21wYXJlZCB0byB3aGVuIGl0J3MgaW52b2tlZCBiZWZvcmVoYW5kLiBgLmRlY3JlYXNlYCBhbHNvXG4gICAqIGNhdXNlcyBhbGwgYC5ieWAgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IGhvdyBtdWNoXG4gICAqIGxlc3NlciBvZiBhIG51bWJlciBpcyByZXR1cm5lZC4gSXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSByZXR1cm5cbiAgICogdmFsdWUgZGVjcmVhc2VkIGJ5IHRoZSBleHBlY3RlZCBhbW91bnQsIHJhdGhlciB0aGFuIGFzc2VydGluZyBpdCBkZWNyZWFzZWRcbiAgICogYnkgYW55IGFtb3VudC5cbiAgICpcbiAgICogICAgIHZhciB2YWwgPSAxXG4gICAqICAgICAgICwgc3VidHJhY3RUd28gPSBmdW5jdGlvbiAoKSB7IHZhbCAtPSAyOyB9XG4gICAqICAgICAgICwgZ2V0VmFsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShnZXRWYWwpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShnZXRWYWwpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0d28gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgYC5kZWNyZWFzZWAgYXNzZXJ0cyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGVcbiAgICogZ2l2ZW4gb2JqZWN0IGBzdWJqZWN0YCdzIGBwcm9wYCBwcm9wZXJ0eSBpcyBsZXNzZXIgYWZ0ZXIgaW52b2tpbmcgdGhlXG4gICAqIHRhcmdldCBmdW5jdGlvbiBjb21wYXJlZCB0byBiZWZvcmVoYW5kLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmRlY3JlYXNlYC4gSG93ZXZlciwgaXQnc1xuICAgKiBkYW5nZXJvdXMgdG8gZG8gc28uIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zXG4gICAqIGJ5IGFzc2VydGluZyB0aGF0IHRoZSBzdWJqZWN0IGVpdGhlciBpbmNyZWFzZXMsIG9yIHRoYXQgaXQgc3RheXMgdGhlIHNhbWUuXG4gICAqIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQncyBleHBlY3RlZCwgYW5kIHRoZW5cbiAgICogd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiBXaGVuIHRoZSBzdWJqZWN0IGlzIGV4cGVjdGVkIHRvIGluY3JlYXNlLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgaXRcbiAgICogaW5jcmVhc2VkIGJ5IHRoZSBleHBlY3RlZCBhbW91bnQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8ubm90LmRlY3JlYXNlKG15T2JqLCAndmFsJyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSBzdWJqZWN0IGlzIGV4cGVjdGVkIHRvIHN0YXkgdGhlIHNhbWUsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnRcbiAgICogZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8ubm90LmNoYW5nZShteU9iaiwgJ3ZhbCcpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KG5vb3ApLnRvLm5vdC5kZWNyZWFzZShteU9iaiwgJ3ZhbCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5kZWNyZWFzZWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzXG4gICAqIHVzZSB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wKS50by5kZWNyZWFzZShteU9iaiwgJ3ZhbCcsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIHZhciB2YWwgPSAxXG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG4gICAqICAgICAgICwgZ2V0VmFsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vb3AsICdub29vIHdoeSBmYWlsPz8nKS50by5kZWNyZWFzZShnZXRWYWwpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5kZWNyZWFzZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuZGVjcmVhc2VgLlxuICAgKlxuICAgKiBAbmFtZSBkZWNyZWFzZVxuICAgKiBAYWxpYXMgZGVjcmVhc2VzXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzdWJqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0RGVjcmVhc2VzIChzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgZm4gPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG4gICAgbmV3IEFzc2VydGlvbihmbiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcblxuICAgIHZhciBpbml0aWFsO1xuICAgIGlmICghcHJvcCkge1xuICAgICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKCdmdW5jdGlvbicpO1xuICAgICAgaW5pdGlhbCA9IHN1YmplY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgICAgaW5pdGlhbCA9IHN1YmplY3RbcHJvcF07XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlclxuICAgIG5ldyBBc3NlcnRpb24oaW5pdGlhbCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnbnVtYmVyJyk7XG5cbiAgICBmbigpO1xuXG4gICAgdmFyIGZpbmFsID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBzdWJqZWN0KCkgOiBzdWJqZWN0W3Byb3BdO1xuICAgIHZhciBtc2dPYmogPSBwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcCA9PT0gbnVsbCA/IGluaXRpYWwgOiAnLicgKyBwcm9wO1xuXG4gICAgZmxhZyh0aGlzLCAnZGVsdGFNc2dPYmonLCBtc2dPYmopO1xuICAgIGZsYWcodGhpcywgJ2luaXRpYWxEZWx0YVZhbHVlJywgaW5pdGlhbCk7XG4gICAgZmxhZyh0aGlzLCAnZmluYWxEZWx0YVZhbHVlJywgZmluYWwpO1xuICAgIGZsYWcodGhpcywgJ2RlbHRhQmVoYXZpb3InLCAnZGVjcmVhc2UnKTtcbiAgICBmbGFnKHRoaXMsICdyZWFsRGVsdGEnLCBpbml0aWFsIC0gZmluYWwpO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBmaW5hbCAtIGluaXRpYWwgPCAwXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBkZWNyZWFzZSdcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIG5vdCBkZWNyZWFzZSdcbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZGVjcmVhc2UnLCBhc3NlcnREZWNyZWFzZXMpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdkZWNyZWFzZXMnLCBhc3NlcnREZWNyZWFzZXMpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmJ5KGRlbHRhWywgbXNnXSlcbiAgICpcbiAgICogV2hlbiBmb2xsb3dpbmcgYW4gYC5pbmNyZWFzZWAgYXNzZXJ0aW9uIGluIHRoZSBjaGFpbiwgYC5ieWAgYXNzZXJ0cyB0aGF0XG4gICAqIHRoZSBzdWJqZWN0IG9mIHRoZSBgLmluY3JlYXNlYCBhc3NlcnRpb24gaW5jcmVhc2VkIGJ5IHRoZSBnaXZlbiBgZGVsdGFgLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBhZGRUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCArPSAyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTtcbiAgICpcbiAgICogV2hlbiBmb2xsb3dpbmcgYSBgLmRlY3JlYXNlYCBhc3NlcnRpb24gaW4gdGhlIGNoYWluLCBgLmJ5YCBhc3NlcnRzIHRoYXQgdGhlXG4gICAqIHN1YmplY3Qgb2YgdGhlIGAuZGVjcmVhc2VgIGFzc2VydGlvbiBkZWNyZWFzZWQgYnkgdGhlIGdpdmVuIGBkZWx0YWAuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIHN1YnRyYWN0VHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgLT0gMjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uZGVjcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTtcbiAgICpcbiAgICogV2hlbiBmb2xsb3dpbmcgYSBgLmNoYW5nZWAgYXNzZXJ0aW9uIGluIHRoZSBjaGFpbiwgYC5ieWAgYXNzZXJ0cyB0aGF0IHRoZVxuICAgKiBzdWJqZWN0IG9mIHRoZSBgLmNoYW5nZWAgYXNzZXJ0aW9uIGVpdGhlciBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGJ5IHRoZVxuICAgKiBnaXZlbiBgZGVsdGFgLiBIb3dldmVyLCBpdCdzIGRhbmdlcm91cyB0byB1c2UgYC5jaGFuZ2UuYnlgLiBUaGUgcHJvYmxlbSBpc1xuICAgKiB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9ucy4gSXQncyBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZVxuICAgKiBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHNcbiAgICogdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uY2hhbmdlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5jaGFuZ2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuYnlgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3RcbiAgICogdG8gYXNzZXJ0IHRoYXQgdGhlIHN1YmplY3QgY2hhbmdlZCBieSBpdHMgZXhwZWN0ZWQgZGVsdGEsIHJhdGhlciB0aGFuXG4gICAqIGFzc2VydGluZyB0aGF0IGl0IGRpZG4ndCBjaGFuZ2UgYnkgb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIGRlbHRhcy5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgKz0gMjsgfTtcbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ1dC5ub3QuYnkoMyk7XG4gICAqXG4gICAqIGAuYnlgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSB0b1xuICAgKiBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZFxuICAgKiBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgKz0gMjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmluY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KGFkZFR3bywgJ25vb28gd2h5IGZhaWw/PycpLnRvLmluY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMyk7XG4gICAqXG4gICAqIEBuYW1lIGJ5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0RGVsdGEoZGVsdGEsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuXG4gICAgdmFyIG1zZ09iaiA9IGZsYWcodGhpcywgJ2RlbHRhTXNnT2JqJyk7XG4gICAgdmFyIGluaXRpYWwgPSBmbGFnKHRoaXMsICdpbml0aWFsRGVsdGFWYWx1ZScpO1xuICAgIHZhciBmaW5hbCA9IGZsYWcodGhpcywgJ2ZpbmFsRGVsdGFWYWx1ZScpO1xuICAgIHZhciBiZWhhdmlvciA9IGZsYWcodGhpcywgJ2RlbHRhQmVoYXZpb3InKTtcbiAgICB2YXIgcmVhbERlbHRhID0gZmxhZyh0aGlzLCAncmVhbERlbHRhJyk7XG5cbiAgICB2YXIgZXhwcmVzc2lvbjtcbiAgICBpZiAoYmVoYXZpb3IgPT09ICdjaGFuZ2UnKSB7XG4gICAgICBleHByZXNzaW9uID0gTWF0aC5hYnMoZmluYWwgLSBpbml0aWFsKSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByZXNzaW9uID0gcmVhbERlbHRhID09PSBNYXRoLmFicyhkZWx0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBleHByZXNzaW9uXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byAnICsgYmVoYXZpb3IgKyAnIGJ5ICcgKyBkZWx0YVxuICAgICAgLCAnZXhwZWN0ZWQgJyArIG1zZ09iaiArICcgdG8gbm90ICcgKyBiZWhhdmlvciArICcgYnkgJyArIGRlbHRhXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2J5JywgYXNzZXJ0RGVsdGEpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmV4dGVuc2libGVcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgZXh0ZW5zaWJsZSwgd2hpY2ggbWVhbnMgdGhhdCBuZXcgcHJvcGVydGllcyBjYW5cbiAgICogYmUgYWRkZWQgdG8gaXQuIFByaW1pdGl2ZXMgYXJlIG5ldmVyIGV4dGVuc2libGUuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5iZS5leHRlbnNpYmxlO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmV4dGVuc2libGVgLlxuICAgKlxuICAgKiAgICAgdmFyIG5vbkV4dGVuc2libGVPYmplY3QgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pXG4gICAqICAgICAgICwgc2VhbGVkT2JqZWN0ID0gT2JqZWN0LnNlYWwoe30pXG4gICAqICAgICAgICwgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9uRXh0ZW5zaWJsZU9iamVjdCkudG8ubm90LmJlLmV4dGVuc2libGU7XG4gICAqICAgICBleHBlY3Qoc2VhbGVkT2JqZWN0KS50by5ub3QuYmUuZXh0ZW5zaWJsZTtcbiAgICogICAgIGV4cGVjdChmcm96ZW5PYmplY3QpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5leHRlbnNpYmxlO1xuICAgKlxuICAgKiBAbmFtZSBleHRlbnNpYmxlXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZXh0ZW5zaWJsZScsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKTtcblxuICAgIC8vIEluIEVTNSwgaWYgdGhlIGFyZ3VtZW50IHRvIHRoaXMgbWV0aG9kIGlzIGEgcHJpbWl0aXZlLCB0aGVuIGl0IHdpbGwgY2F1c2UgYSBUeXBlRXJyb3IuXG4gICAgLy8gSW4gRVM2LCBhIG5vbi1vYmplY3QgYXJndW1lbnQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdhcyBhIG5vbi1leHRlbnNpYmxlIG9yZGluYXJ5IG9iamVjdCwgc2ltcGx5IHJldHVybiBmYWxzZS5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNFeHRlbnNpYmxlXG4gICAgLy8gVGhlIGZvbGxvd2luZyBwcm92aWRlcyBFUzYgYmVoYXZpb3IgZm9yIEVTNSBlbnZpcm9ubWVudHMuXG5cbiAgICB2YXIgaXNFeHRlbnNpYmxlID0gb2JqID09PSBPYmplY3Qob2JqKSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKG9iaik7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGlzRXh0ZW5zaWJsZVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBleHRlbnNpYmxlJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgZXh0ZW5zaWJsZSdcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5zZWFsZWRcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgc2VhbGVkLCB3aGljaCBtZWFucyB0aGF0IG5ldyBwcm9wZXJ0aWVzIGNhbid0IGJlXG4gICAqIGFkZGVkIHRvIGl0LCBhbmQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2FuJ3QgYmUgcmVjb25maWd1cmVkIG9yIGRlbGV0ZWQuXG4gICAqIEhvd2V2ZXIsIGl0J3MgcG9zc2libGUgdGhhdCBpdHMgZXhpc3RpbmcgcHJvcGVydGllcyBjYW4gc3RpbGwgYmUgcmVhc3NpZ25lZFxuICAgKiB0byBkaWZmZXJlbnQgdmFsdWVzLiBQcmltaXRpdmVzIGFyZSBhbHdheXMgc2VhbGVkLlxuICAgKlxuICAgKiAgICAgdmFyIHNlYWxlZE9iamVjdCA9IE9iamVjdC5zZWFsKHt9KTtcbiAgICogICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICpcbiAgICogICAgIGV4cGVjdChzZWFsZWRPYmplY3QpLnRvLmJlLnNlYWxlZDtcbiAgICogICAgIGV4cGVjdChmcm96ZW5PYmplY3QpLnRvLmJlLnNlYWxlZDtcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5zZWFsZWQ7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuc2VhbGVkYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLm5vdC5iZS5zZWFsZWQ7XG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuc2VhbGVkO1xuICAgKlxuICAgKiBAbmFtZSBzZWFsZWRcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdzZWFsZWQnLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG5cbiAgICAvLyBJbiBFUzUsIGlmIHRoZSBhcmd1bWVudCB0byB0aGlzIG1ldGhvZCBpcyBhIHByaW1pdGl2ZSwgdGhlbiBpdCB3aWxsIGNhdXNlIGEgVHlwZUVycm9yLlxuICAgIC8vIEluIEVTNiwgYSBub24tb2JqZWN0IGFyZ3VtZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3YXMgYSBzZWFsZWQgb3JkaW5hcnkgb2JqZWN0LCBzaW1wbHkgcmV0dXJuIHRydWUuXG4gICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1NlYWxlZFxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvdmlkZXMgRVM2IGJlaGF2aW9yIGZvciBFUzUgZW52aXJvbm1lbnRzLlxuXG4gICAgdmFyIGlzU2VhbGVkID0gb2JqID09PSBPYmplY3Qob2JqKSA/IE9iamVjdC5pc1NlYWxlZChvYmopIDogdHJ1ZTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXNTZWFsZWRcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgc2VhbGVkJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgc2VhbGVkJ1xuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmZyb3plblxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBmcm96ZW4sIHdoaWNoIG1lYW5zIHRoYXQgbmV3IHByb3BlcnRpZXMgY2FuJ3QgYmVcbiAgICogYWRkZWQgdG8gaXQsIGFuZCBpdHMgZXhpc3RpbmcgcHJvcGVydGllcyBjYW4ndCBiZSByZWFzc2lnbmVkIHRvIGRpZmZlcmVudFxuICAgKiB2YWx1ZXMsIHJlY29uZmlndXJlZCwgb3IgZGVsZXRlZC4gUHJpbWl0aXZlcyBhcmUgYWx3YXlzIGZyb3plbi5cbiAgICpcbiAgICogICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICpcbiAgICogICAgIGV4cGVjdChmcm96ZW5PYmplY3QpLnRvLmJlLmZyb3plbjtcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5mcm96ZW47XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuZnJvemVuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLm5vdC5iZS5mcm96ZW47XG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZnJvemVuO1xuICAgKlxuICAgKiBAbmFtZSBmcm96ZW5cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdmcm96ZW4nLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG5cbiAgICAvLyBJbiBFUzUsIGlmIHRoZSBhcmd1bWVudCB0byB0aGlzIG1ldGhvZCBpcyBhIHByaW1pdGl2ZSwgdGhlbiBpdCB3aWxsIGNhdXNlIGEgVHlwZUVycm9yLlxuICAgIC8vIEluIEVTNiwgYSBub24tb2JqZWN0IGFyZ3VtZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3YXMgYSBmcm96ZW4gb3JkaW5hcnkgb2JqZWN0LCBzaW1wbHkgcmV0dXJuIHRydWUuXG4gICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc0Zyb3plblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvdmlkZXMgRVM2IGJlaGF2aW9yIGZvciBFUzUgZW52aXJvbm1lbnRzLlxuXG4gICAgdmFyIGlzRnJvemVuID0gb2JqID09PSBPYmplY3Qob2JqKSA/IE9iamVjdC5pc0Zyb3plbihvYmopIDogdHJ1ZTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXNGcm96ZW5cbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgZnJvemVuJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgZnJvemVuJ1xuICAgICk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLmZpbml0ZVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciwgYW5kIGlzbid0IGBOYU5gIG9yIHBvc2l0aXZlL25lZ2F0aXZlXG4gICAqIGBJbmZpbml0eWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuZmluaXRlO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmZpbml0ZWAuIEhvd2V2ZXIsIGl0J3NcbiAgICogZGFuZ2Vyb3VzIHRvIGRvIHNvLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9uc1xuICAgKiBieSBhc3NlcnRpbmcgdGhhdCB0aGUgc3ViamVjdCBlaXRoZXIgaXNuJ3QgYSBudW1iZXIsIG9yIHRoYXQgaXQncyBgTmFOYCwgb3JcbiAgICogdGhhdCBpdCdzIHBvc2l0aXZlIGBJbmZpbml0eWAsIG9yIHRoYXQgaXQncyBuZWdhdGl2ZSBgSW5maW5pdHlgLiBJdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuXG4gICAqIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzbid0IGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIHRoYXQgaXQncyB0aGUgZXhwZWN0ZWQgdHlwZSwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgaXNuJ3Qgb25lIG9mXG4gICAqIG1hbnkgdW5leHBlY3RlZCB0eXBlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uYmUuYSgnc3RyaW5nJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLm5vdC5iZS5maW5pdGU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gYmUgYE5hTmAsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgZXhhY3RseVxuICAgKiB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KE5hTikudG8uYmUuTmFOOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KE5hTikudG8ubm90LmJlLmZpbml0ZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBiZSBwb3NpdGl2ZSBpbmZpbml0eSwgaXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCBleGFjdGx5IHRoYXQuXG4gICAqXG4gICAqICAgICBleHBlY3QoSW5maW5pdHkpLnRvLmVxdWFsKEluZmluaXR5KTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChJbmZpbml0eSkudG8ubm90LmJlLmZpbml0ZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBiZSBuZWdhdGl2ZSBpbmZpbml0eSwgaXQncyBvZnRlbiBiZXN0IHRvXG4gICAqIGFzc2VydCBleGFjdGx5IHRoYXQuXG4gICAqXG4gICAqICAgICBleHBlY3QoLUluZmluaXR5KS50by5lcXVhbCgtSW5maW5pdHkpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KC1JbmZpbml0eSkudG8ubm90LmJlLmZpbml0ZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5maW5pdGU7XG4gICAqXG4gICAqIEBuYW1lIGZpbml0ZVxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2Zpbml0ZScsIGZ1bmN0aW9uKG1zZykge1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShvYmopXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGEgZmluaXRlIG51bWJlcidcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGEgZmluaXRlIG51bWJlcidcbiAgICApO1xuICB9KTtcbn07XG4iLCAiLyohXG4gKiBjaGFpXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2hhaSwgdXRpbCkge1xuICBjaGFpLmV4cGVjdCA9IGZ1bmN0aW9uICh2YWwsIG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbmV3IGNoYWkuQXNzZXJ0aW9uKHZhbCwgbWVzc2FnZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZmFpbChbbWVzc2FnZV0pXG4gICAqICMjIyAuZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0sIFtvcGVyYXRvcl0pXG4gICAqXG4gICAqIFRocm93IGEgZmFpbHVyZS5cbiAgICpcbiAgICogICAgIGV4cGVjdC5mYWlsKCk7XG4gICAqICAgICBleHBlY3QuZmFpbChcImN1c3RvbSBlcnJvciBtZXNzYWdlXCIpO1xuICAgKiAgICAgZXhwZWN0LmZhaWwoMSwgMik7XG4gICAqICAgICBleHBlY3QuZmFpbCgxLCAyLCBcImN1c3RvbSBlcnJvciBtZXNzYWdlXCIpO1xuICAgKiAgICAgZXhwZWN0LmZhaWwoMSwgMiwgXCJjdXN0b20gZXJyb3IgbWVzc2FnZVwiLCBcIj5cIik7XG4gICAqICAgICBleHBlY3QuZmFpbCgxLCAyLCB1bmRlZmluZWQsIFwiPlwiKTtcbiAgICpcbiAgICogQG5hbWUgZmFpbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IG9wZXJhdG9yXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGNoYWkuZXhwZWN0LmZhaWwgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFjdHVhbDtcbiAgICAgICAgYWN0dWFsID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdleHBlY3QuZmFpbCgpJztcbiAgICB0aHJvdyBuZXcgY2hhaS5Bc3NlcnRpb25FcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGFjdHVhbDogYWN0dWFsXG4gICAgICAsIGV4cGVjdGVkOiBleHBlY3RlZFxuICAgICAgLCBvcGVyYXRvcjogb3BlcmF0b3JcbiAgICB9LCBjaGFpLmV4cGVjdC5mYWlsKTtcbiAgfTtcbn07XG4iLCAiLyohXG4gKiBjaGFpXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2hhaSwgdXRpbCkge1xuICB2YXIgQXNzZXJ0aW9uID0gY2hhaS5Bc3NlcnRpb247XG5cbiAgZnVuY3Rpb24gbG9hZFNob3VsZCAoKSB7XG4gICAgLy8gZXhwbGljaXRseSBkZWZpbmUgdGhpcyBtZXRob2QgYXMgZnVuY3Rpb24gYXMgdG8gaGF2ZSBpdCdzIG5hbWUgdG8gaW5jbHVkZSBhcyBgc3NmaWBcbiAgICBmdW5jdGlvbiBzaG91bGRHZXR0ZXIoKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFN0cmluZ1xuICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBOdW1iZXJcbiAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgQm9vbGVhblxuICAgICAgICAgIHx8IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdGhpcyBpbnN0YW5jZW9mIFN5bWJvbFxuICAgICAgICAgIHx8IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgJiYgdGhpcyBpbnN0YW5jZW9mIEJpZ0ludCkge1xuICAgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbih0aGlzLnZhbHVlT2YoKSwgbnVsbCwgc2hvdWxkR2V0dGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMsIG51bGwsIHNob3VsZEdldHRlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNob3VsZFNldHRlcih2YWx1ZSkge1xuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvY2hhaS9pc3N1ZXMvODY6IHRoaXMgbWFrZXNcbiAgICAgIC8vIGB3aGF0ZXZlci5zaG91bGQgPSBzb21lVmFsdWVgIGFjdHVhbGx5IHNldCBgc29tZVZhbHVlYCwgd2hpY2ggaXNcbiAgICAgIC8vIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBgZ2xvYmFsLnNob3VsZCA9IHJlcXVpcmUoJ2NoYWknKS5zaG91bGQoKWAuXG4gICAgICAvL1xuICAgICAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgdG8gdXNlIFtbRGVmaW5lUHJvcGVydHldXSBpbnN0ZWFkIG9mIFtbUHV0XV1cbiAgICAgIC8vIHNpbmNlIG90aGVyd2lzZSB3ZSB3b3VsZCB0cmlnZ2VyIHRoaXMgdmVyeSBzZXR0ZXIhXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Nob3VsZCcsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gbW9kaWZ5IE9iamVjdC5wcm90b3R5cGUgdG8gaGF2ZSBgc2hvdWxkYFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QucHJvdG90eXBlLCAnc2hvdWxkJywge1xuICAgICAgc2V0OiBzaG91bGRTZXR0ZXJcbiAgICAgICwgZ2V0OiBzaG91bGRHZXR0ZXJcbiAgICAgICwgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG5cbiAgICB2YXIgc2hvdWxkID0ge307XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLmZhaWwoW21lc3NhZ2VdKVxuICAgICAqICMjIyAuZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0sIFtvcGVyYXRvcl0pXG4gICAgICpcbiAgICAgKiBUaHJvdyBhIGZhaWx1cmUuXG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLmZhaWwoKTtcbiAgICAgKiAgICAgc2hvdWxkLmZhaWwoXCJjdXN0b20gZXJyb3IgbWVzc2FnZVwiKTtcbiAgICAgKiAgICAgc2hvdWxkLmZhaWwoMSwgMik7XG4gICAgICogICAgIHNob3VsZC5mYWlsKDEsIDIsIFwiY3VzdG9tIGVycm9yIG1lc3NhZ2VcIik7XG4gICAgICogICAgIHNob3VsZC5mYWlsKDEsIDIsIFwiY3VzdG9tIGVycm9yIG1lc3NhZ2VcIiwgXCI+XCIpO1xuICAgICAqICAgICBzaG91bGQuZmFpbCgxLCAyLCB1bmRlZmluZWQsIFwiPlwiKTtcbiAgICAgKlxuICAgICAqXG4gICAgICogQG5hbWUgZmFpbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3BlcmF0b3JcbiAgICAgKiBAbmFtZXNwYWNlIEJERFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQuZmFpbCA9IGZ1bmN0aW9uIChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGFjdHVhbDtcbiAgICAgICAgICBhY3R1YWwgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdzaG91bGQuZmFpbCgpJztcbiAgICAgIHRocm93IG5ldyBjaGFpLkFzc2VydGlvbkVycm9yKG1lc3NhZ2UsIHtcbiAgICAgICAgICBhY3R1YWw6IGFjdHVhbFxuICAgICAgICAsIGV4cGVjdGVkOiBleHBlY3RlZFxuICAgICAgICAsIG9wZXJhdG9yOiBvcGVyYXRvclxuICAgICAgfSwgc2hvdWxkLmZhaWwpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICAgKlxuICAgICAqIEFzc2VydHMgbm9uLXN0cmljdCBlcXVhbGl0eSAoYD09YCkgb2YgYGFjdHVhbGAgYW5kIGBleHBlY3RlZGAuXG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLmVxdWFsKDMsICczJywgJz09IGNvZXJjZXMgdmFsdWVzIHRvIHN0cmluZ3MnKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIGVxdWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5lcXVhbCA9IGZ1bmN0aW9uICh2YWwxLCB2YWwyLCBtc2cpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24odmFsMSwgbXNnKS50by5lcXVhbCh2YWwyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIyMjIC50aHJvdyhmdW5jdGlvbiwgW2NvbnN0cnVjdG9yL3N0cmluZy9yZWdleHBdLCBbc3RyaW5nL3JlZ2V4cF0sIFttZXNzYWdlXSlcbiAgICAgKlxuICAgICAqIEFzc2VydHMgdGhhdCBgZnVuY3Rpb25gIHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZlxuICAgICAqIGBjb25zdHJ1Y3RvcmAsIG9yIGFsdGVybmF0ZWx5IHRoYXQgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciB3aXRoIG1lc3NhZ2VcbiAgICAgKiBtYXRjaGluZyBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqICAgICBzaG91bGQudGhyb3coZm4sICdmdW5jdGlvbiB0aHJvd3MgYSByZWZlcmVuY2UgZXJyb3InKTtcbiAgICAgKiAgICAgc2hvdWxkLnRocm93KGZuLCAvZnVuY3Rpb24gdGhyb3dzIGEgcmVmZXJlbmNlIGVycm9yLyk7XG4gICAgICogICAgIHNob3VsZC50aHJvdyhmbiwgUmVmZXJlbmNlRXJyb3IpO1xuICAgICAqICAgICBzaG91bGQudGhyb3coZm4sIFJlZmVyZW5jZUVycm9yLCAnZnVuY3Rpb24gdGhyb3dzIGEgcmVmZXJlbmNlIGVycm9yJyk7XG4gICAgICogICAgIHNob3VsZC50aHJvdyhmbiwgUmVmZXJlbmNlRXJyb3IsIC9mdW5jdGlvbiB0aHJvd3MgYSByZWZlcmVuY2UgZXJyb3IvKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIHRocm93XG4gICAgICogQGFsaWFzIFRocm93XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvciNFcnJvcl90eXBlc1xuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5UaHJvdyA9IGZ1bmN0aW9uIChmbiwgZXJydCwgZXJycywgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2cpLnRvLlRocm93KGVycnQsIGVycnMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLmV4aXN0XG4gICAgICpcbiAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiAgICAgdmFyIGZvbyA9ICdoaSc7XG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLmV4aXN0KGZvbywgJ2ZvbyBleGlzdHMnKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIGV4aXN0XG4gICAgICogQG5hbWVzcGFjZSBTaG91bGRcbiAgICAgKiBAYXBpIHB1YmxpY1xuICAgICAqL1xuXG4gICAgc2hvdWxkLmV4aXN0ID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnKS50by5leGlzdDtcbiAgICB9XG5cbiAgICAvLyBuZWdhdGlvblxuICAgIHNob3VsZC5ub3QgPSB7fVxuXG4gICAgLyoqXG4gICAgICogIyMjIC5ub3QuZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgW21lc3NhZ2VdKVxuICAgICAqXG4gICAgICogQXNzZXJ0cyBub24tc3RyaWN0IGluZXF1YWxpdHkgKGAhPWApIG9mIGBhY3R1YWxgIGFuZCBgZXhwZWN0ZWRgLlxuICAgICAqXG4gICAgICogICAgIHNob3VsZC5ub3QuZXF1YWwoMywgNCwgJ3RoZXNlIG51bWJlcnMgYXJlIG5vdCBlcXVhbCcpO1xuICAgICAqXG4gICAgICogQG5hbWUgbm90LmVxdWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5ub3QuZXF1YWwgPSBmdW5jdGlvbiAodmFsMSwgdmFsMiwgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHZhbDEsIG1zZykudG8ubm90LmVxdWFsKHZhbDIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLnRocm93KGZ1bmN0aW9uLCBbY29uc3RydWN0b3IvcmVnZXhwXSwgW21lc3NhZ2VdKVxuICAgICAqXG4gICAgICogQXNzZXJ0cyB0aGF0IGBmdW5jdGlvbmAgd2lsbCBfbm90XyB0aHJvdyBhbiBlcnJvciB0aGF0IGlzIGFuIGluc3RhbmNlIG9mXG4gICAgICogYGNvbnN0cnVjdG9yYCwgb3IgYWx0ZXJuYXRlbHkgdGhhdCBpdCB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciB3aXRoIG1lc3NhZ2VcbiAgICAgKiBtYXRjaGluZyBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqICAgICBzaG91bGQubm90LnRocm93KGZuLCBFcnJvciwgJ2Z1bmN0aW9uIGRvZXMgbm90IHRocm93Jyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSBub3QudGhyb3dcbiAgICAgKiBAYWxpYXMgbm90LlRocm93XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvciNFcnJvcl90eXBlc1xuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5ub3QuVGhyb3cgPSBmdW5jdGlvbiAoZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgICAgbmV3IEFzc2VydGlvbihmbiwgbXNnKS50by5ub3QuVGhyb3coZXJydCwgZXJycyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICMjIyAubm90LmV4aXN0XG4gICAgICpcbiAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiAgICAgdmFyIGJhciA9IG51bGw7XG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLm5vdC5leGlzdChiYXIsICdiYXIgZG9lcyBub3QgZXhpc3QnKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIG5vdC5leGlzdFxuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5ub3QuZXhpc3QgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2cpLnRvLm5vdC5leGlzdDtcbiAgICB9XG5cbiAgICBzaG91bGRbJ3Rocm93J10gPSBzaG91bGRbJ1Rocm93J107XG4gICAgc2hvdWxkLm5vdFsndGhyb3cnXSA9IHNob3VsZC5ub3RbJ1Rocm93J107XG5cbiAgICByZXR1cm4gc2hvdWxkO1xuICB9O1xuXG4gIGNoYWkuc2hvdWxkID0gbG9hZFNob3VsZDtcbiAgY2hhaS5TaG91bGQgPSBsb2FkU2hvdWxkO1xufTtcbiIsICIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjaGFpLCB1dGlsKSB7XG4gIC8qIVxuICAgKiBDaGFpIGRlcGVuZGVuY2llcy5cbiAgICovXG5cbiAgdmFyIEFzc2VydGlvbiA9IGNoYWkuQXNzZXJ0aW9uXG4gICAgLCBmbGFnID0gdXRpbC5mbGFnO1xuXG4gIC8qIVxuICAgKiBNb2R1bGUgZXhwb3J0LlxuICAgKi9cblxuICAvKipcbiAgICogIyMjIGFzc2VydChleHByZXNzaW9uLCBtZXNzYWdlKVxuICAgKlxuICAgKiBXcml0ZSB5b3VyIG93biB0ZXN0IGV4cHJlc3Npb25zLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0KCdmb28nICE9PSAnYmFyJywgJ2ZvbyBpcyBub3QgYmFyJyk7XG4gICAqICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShbXSksICdlbXB0eSBhcnJheXMgYXJlIGFycmF5cycpO1xuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSBleHByZXNzaW9uIHRvIHRlc3QgZm9yIHRydXRoaW5lc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgdG8gZGlzcGxheSBvbiBlcnJvclxuICAgKiBAbmFtZSBhc3NlcnRcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdmFyIGFzc2VydCA9IGNoYWkuYXNzZXJ0ID0gZnVuY3Rpb24gKGV4cHJlc3MsIGVycm1zZykge1xuICAgIHZhciB0ZXN0ID0gbmV3IEFzc2VydGlvbihudWxsLCBudWxsLCBjaGFpLmFzc2VydCwgdHJ1ZSk7XG4gICAgdGVzdC5hc3NlcnQoXG4gICAgICAgIGV4cHJlc3NcbiAgICAgICwgZXJybXNnXG4gICAgICAsICdbIG5lZ2F0aW9uIG1lc3NhZ2UgdW5hdmFpbGFibGUgXSdcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmZhaWwoW21lc3NhZ2VdKVxuICAgKiAjIyMgLmZhaWwoYWN0dWFsLCBleHBlY3RlZCwgW21lc3NhZ2VdLCBbb3BlcmF0b3JdKVxuICAgKlxuICAgKiBUaHJvdyBhIGZhaWx1cmUuIE5vZGUuanMgYGFzc2VydGAgbW9kdWxlLWNvbXBhdGlibGUuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZmFpbCgpO1xuICAgKiAgICAgYXNzZXJ0LmZhaWwoXCJjdXN0b20gZXJyb3IgbWVzc2FnZVwiKTtcbiAgICogICAgIGFzc2VydC5mYWlsKDEsIDIpO1xuICAgKiAgICAgYXNzZXJ0LmZhaWwoMSwgMiwgXCJjdXN0b20gZXJyb3IgbWVzc2FnZVwiKTtcbiAgICogICAgIGFzc2VydC5mYWlsKDEsIDIsIFwiY3VzdG9tIGVycm9yIG1lc3NhZ2VcIiwgXCI+XCIpO1xuICAgKiAgICAgYXNzZXJ0LmZhaWwoMSwgMiwgdW5kZWZpbmVkLCBcIj5cIik7XG4gICAqXG4gICAqIEBuYW1lIGZhaWxcbiAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBvcGVyYXRvclxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZmFpbCA9IGZ1bmN0aW9uIChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICAvLyBDb21wbHkgd2l0aCBOb2RlJ3MgZmFpbChbbWVzc2FnZV0pIGludGVyZmFjZVxuXG4gICAgICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgICAgIGFjdHVhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnYXNzZXJ0LmZhaWwoKSc7XG4gICAgdGhyb3cgbmV3IGNoYWkuQXNzZXJ0aW9uRXJyb3IobWVzc2FnZSwge1xuICAgICAgICBhY3R1YWw6IGFjdHVhbFxuICAgICAgLCBleHBlY3RlZDogZXhwZWN0ZWRcbiAgICAgICwgb3BlcmF0b3I6IG9wZXJhdG9yXG4gICAgfSwgYXNzZXJ0LmZhaWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzT2sob2JqZWN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyB0cnV0aHkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNPaygnZXZlcnl0aGluZycsICdldmVyeXRoaW5nIGlzIG9rJyk7XG4gICAqICAgICBhc3NlcnQuaXNPayhmYWxzZSwgJ3RoaXMgd2lsbCBmYWlsJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzT2tcbiAgICogQGFsaWFzIG9rXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdCB0byB0ZXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc09rID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzT2ssIHRydWUpLmlzLm9rO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTm90T2sob2JqZWN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBmYWxzeS5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc05vdE9rKCdldmVyeXRoaW5nJywgJ3RoaXMgd2lsbCBmYWlsJyk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RPayhmYWxzZSwgJ3RoaXMgd2lsbCBwYXNzJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90T2tcbiAgICogQGFsaWFzIG5vdE9rXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdCB0byB0ZXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdE9rID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90T2ssIHRydWUpLmlzLm5vdC5vaztcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgbm9uLXN0cmljdCBlcXVhbGl0eSAoYD09YCkgb2YgYGFjdHVhbGAgYW5kIGBleHBlY3RlZGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZXF1YWwoMywgJzMnLCAnPT0gY29lcmNlcyB2YWx1ZXMgdG8gc3RyaW5ncycpO1xuICAgKlxuICAgKiBAbmFtZSBlcXVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBtc2cpIHtcbiAgICB2YXIgdGVzdCA9IG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5lcXVhbCwgdHJ1ZSk7XG5cbiAgICB0ZXN0LmFzc2VydChcbiAgICAgICAgZXhwID09IGZsYWcodGVzdCwgJ29iamVjdCcpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGVxdWFsICN7ZXhwfSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7YWN0fSdcbiAgICAgICwgZXhwXG4gICAgICAsIGFjdFxuICAgICAgLCB0cnVlXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgbm9uLXN0cmljdCBpbmVxdWFsaXR5IChgIT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RFcXVhbCgzLCA0LCAndGhlc2UgbnVtYmVycyBhcmUgbm90IGVxdWFsJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIHZhciB0ZXN0ID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdEVxdWFsLCB0cnVlKTtcblxuICAgIHRlc3QuYXNzZXJ0KFxuICAgICAgICBleHAgIT0gZmxhZyh0ZXN0LCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gZXF1YWwgI3thY3R9J1xuICAgICAgLCBleHBcbiAgICAgICwgYWN0XG4gICAgICAsIHRydWVcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBzdHJpY3QgZXF1YWxpdHkgKGA9PT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCB0cnVlLCAndGhlc2UgYm9vbGVhbnMgYXJlIHN0cmljdGx5IGVxdWFsJyk7XG4gICAqXG4gICAqIEBuYW1lIHN0cmljdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5zdHJpY3RFcXVhbCwgdHJ1ZSkudG8uZXF1YWwoZXhwKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgc3RyaWN0IGluZXF1YWxpdHkgKGAhPT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbCgzLCAnMycsICdubyBjb2VyY2lvbiBmb3Igc3RyaWN0IGVxdWFsaXR5Jyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFN0cmljdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RTdHJpY3RFcXVhbCwgdHJ1ZSkudG8ubm90LmVxdWFsKGV4cCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBhY3R1YWxgIGlzIGRlZXBseSBlcXVhbCB0byBgZXhwZWN0ZWRgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBFcXVhbCh7IHRlYTogJ2dyZWVuJyB9LCB7IHRlYTogJ2dyZWVuJyB9KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYWxpYXMgZGVlcFN0cmljdEVxdWFsXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWVwRXF1YWwgPSBhc3NlcnQuZGVlcFN0cmljdEVxdWFsID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZGVlcEVxdWFsLCB0cnVlKS50by5lcWwoZXhwKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnQgdGhhdCBgYWN0dWFsYCBpcyBub3QgZGVlcGx5IGVxdWFsIHRvIGBleHBlY3RlZGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcEVxdWFsKHsgdGVhOiAnZ3JlZW4nIH0sIHsgdGVhOiAnamFzbWluZScgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBFcXVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIChhY3QsIGV4cCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdERlZXBFcXVhbCwgdHJ1ZSkudG8ubm90LmVxbChleHApO1xuICB9O1xuXG4gICAvKipcbiAgICogIyMjIC5pc0Fib3ZlKHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQWJvdmUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gKD4pIGB2YWx1ZVRvQmVBYm92ZWAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBYm92ZSg1LCAyLCAnNSBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gMicpO1xuICAgKlxuICAgKiBAbmFtZSBpc0Fib3ZlXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVBYm92ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNBYm92ZSA9IGZ1bmN0aW9uICh2YWwsIGFidiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQWJvdmUsIHRydWUpLnRvLmJlLmFib3ZlKGFidik7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLmlzQXRMZWFzdCh2YWx1ZVRvQ2hlY2ssIHZhbHVlVG9CZUF0TGVhc3QsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKD49KSBgdmFsdWVUb0JlQXRMZWFzdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBdExlYXN0KDUsIDIsICc1IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMicpO1xuICAgKiAgICAgYXNzZXJ0LmlzQXRMZWFzdCgzLCAzLCAnMyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDMnKTtcbiAgICpcbiAgICogQG5hbWUgaXNBdExlYXN0XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVBdExlYXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0F0TGVhc3QgPSBmdW5jdGlvbiAodmFsLCBhdGxzdCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXRMZWFzdCwgdHJ1ZSkudG8uYmUubGVhc3QoYXRsc3QpO1xuICB9O1xuXG4gICAvKipcbiAgICogIyMjIC5pc0JlbG93KHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQmVsb3csIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBzdHJpY3RseSBsZXNzIHRoYW4gKDwpIGB2YWx1ZVRvQmVCZWxvd2AuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNCZWxvdygzLCA2LCAnMyBpcyBzdHJpY3RseSBsZXNzIHRoYW4gNicpO1xuICAgKlxuICAgKiBAbmFtZSBpc0JlbG93XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVCZWxvd1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNCZWxvdyA9IGZ1bmN0aW9uICh2YWwsIGJsdywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQmVsb3csIHRydWUpLnRvLmJlLmJlbG93KGJsdyk7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLmlzQXRNb3N0KHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQXRNb3N0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgYHZhbHVlVG9DaGVja2AgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICg8PSkgYHZhbHVlVG9CZUF0TW9zdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBdE1vc3QoMywgNiwgJzMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDYnKTtcbiAgICogICAgIGFzc2VydC5pc0F0TW9zdCg0LCA0LCAnNCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCcpO1xuICAgKlxuICAgKiBAbmFtZSBpc0F0TW9zdFxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQ2hlY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVUb0JlQXRNb3N0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0F0TW9zdCA9IGZ1bmN0aW9uICh2YWwsIGF0bXN0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdE1vc3QsIHRydWUpLnRvLmJlLm1vc3QoYXRtc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzVHJ1ZSh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyB0cnVlLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYVNlcnZlZCA9IHRydWU7XG4gICAqICAgICBhc3NlcnQuaXNUcnVlKHRlYVNlcnZlZCwgJ3RoZSB0ZWEgaGFzIGJlZW4gc2VydmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzVHJ1ZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNUcnVlID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzVHJ1ZSwgdHJ1ZSkuaXNbJ3RydWUnXTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFRydWUodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IHRydWUuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90VHJ1ZSh0ZWEsICdncmVhdCwgdGltZSBmb3IgdGVhIScpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdFRydWVcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90VHJ1ZSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFRydWUsIHRydWUpLnRvLm5vdC5lcXVhbCh0cnVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0ZhbHNlKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIGZhbHNlLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYVNlcnZlZCA9IGZhbHNlO1xuICAgKiAgICAgYXNzZXJ0LmlzRmFsc2UodGVhU2VydmVkLCAnbm8gdGVhIHlldD8gaG1tLi4uJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRmFsc2VcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRmFsc2UgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGYWxzZSwgdHJ1ZSkuaXNbJ2ZhbHNlJ107XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RGYWxzZSh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBub3QgZmFsc2UuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RmFsc2UodGVhLCAnZ3JlYXQsIHRpbWUgZm9yIHRlYSEnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RGYWxzZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RGYWxzZSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEZhbHNlLCB0cnVlKS50by5ub3QuZXF1YWwoZmFsc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTnVsbCh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBudWxsLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTnVsbChlcnIsICd0aGVyZSB3YXMgbm8gZXJyb3InKTtcbiAgICpcbiAgICogQG5hbWUgaXNOdWxsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc051bGwgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOdWxsLCB0cnVlKS50by5lcXVhbChudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdE51bGwodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IG51bGwuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90TnVsbCh0ZWEsICdncmVhdCwgdGltZSBmb3IgdGVhIScpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE51bGxcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90TnVsbCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bGwsIHRydWUpLnRvLm5vdC5lcXVhbChudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05hTlxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgTmFOLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTmFOKE5hTiwgJ05hTiBpcyBOYU4nKTtcbiAgICpcbiAgICogQG5hbWUgaXNOYU5cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTmFOID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTmFOLCB0cnVlKS50by5iZS5OYU47XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3ROYU5cbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIG5vdCBOYU4uXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3ROYU4oNCwgJzQgaXMgbm90IE5hTicpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE5hTlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgYXNzZXJ0LmlzTm90TmFOID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90TmFOLCB0cnVlKS5ub3QudG8uYmUuTmFOO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmV4aXN0c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICB2YXIgZm9vID0gJ2hpJztcbiAgICpcbiAgICogICAgIGFzc2VydC5leGlzdHMoZm9vLCAnZm9vIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYCcpO1xuICAgKlxuICAgKiBAbmFtZSBleGlzdHNcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmV4aXN0cyA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5leGlzdHMsIHRydWUpLnRvLmV4aXN0O1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEV4aXN0c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBlaXRoZXIgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiAgICAgdmFyIGJhciA9IG51bGxcbiAgICogICAgICAgLCBiYXo7XG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RXhpc3RzKGJhcik7XG4gICAqICAgICBhc3NlcnQubm90RXhpc3RzKGJheiwgJ2JheiBpcyBlaXRoZXIgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICpcbiAgICogQG5hbWUgbm90RXhpc3RzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RFeGlzdHMgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90RXhpc3RzLCB0cnVlKS50by5ub3QuZXhpc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNVbmRlZmluZWQodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICB2YXIgdGVhO1xuICAgKiAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHRlYSwgJ25vIHRlYSBkZWZpbmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzVW5kZWZpbmVkXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1VuZGVmaW5lZCwgdHJ1ZSkudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0RlZmluZWQodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYSA9ICdjdXAgb2YgY2hhaSc7XG4gICAqICAgICBhc3NlcnQuaXNEZWZpbmVkKHRlYSwgJ3RlYSBoYXMgYmVlbiBkZWZpbmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNEZWZpbmVkID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRGVmaW5lZCwgdHJ1ZSkudG8ubm90LmVxdWFsKHVuZGVmaW5lZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNGdW5jdGlvbih2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gc2VydmVUZWEoKSB7IHJldHVybiAnY3VwIG9mIHRlYSc7IH07XG4gICAqICAgICBhc3NlcnQuaXNGdW5jdGlvbihzZXJ2ZVRlYSwgJ2dyZWF0LCB3ZSBjYW4gaGF2ZSB0ZWEgbm93Jyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRnVuY3Rpb25cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGdW5jdGlvbiwgdHJ1ZSkudG8uYmUuYSgnZnVuY3Rpb24nKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEZ1bmN0aW9uKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqICAgICB2YXIgc2VydmVUZWEgPSBbICdoZWF0JywgJ3BvdXInLCAnc2lwJyBdO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RnVuY3Rpb24oc2VydmVUZWEsICdncmVhdCwgd2UgaGF2ZSBsaXN0ZWQgdGhlIHN0ZXBzJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90RnVuY3Rpb25cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90RnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RGdW5jdGlvbiwgdHJ1ZSkudG8ubm90LmJlLmEoJ2Z1bmN0aW9uJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNPYmplY3QodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gb2JqZWN0IG9mIHR5cGUgJ09iamVjdCcgKGFzIHJldmVhbGVkIGJ5IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCkuXG4gICAqIF9UaGUgYXNzZXJ0aW9uIGRvZXMgbm90IG1hdGNoIHN1YmNsYXNzZWQgb2JqZWN0cy5fXG4gICAqXG4gICAqICAgICB2YXIgc2VsZWN0aW9uID0geyBuYW1lOiAnQ2hhaScsIHNlcnZlOiAnd2l0aCBzcGljZXMnIH07XG4gICAqICAgICBhc3NlcnQuaXNPYmplY3Qoc2VsZWN0aW9uLCAndGVhIHNlbGVjdGlvbiBpcyBhbiBvYmplY3QnKTtcbiAgICpcbiAgICogQG5hbWUgaXNPYmplY3RcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzT2JqZWN0ID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzT2JqZWN0LCB0cnVlKS50by5iZS5hKCdvYmplY3QnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdE9iamVjdCh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBfbm90XyBhbiBvYmplY3Qgb2YgdHlwZSAnT2JqZWN0JyAoYXMgcmV2ZWFsZWQgYnkgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgKS5cbiAgICpcbiAgICogICAgIHZhciBzZWxlY3Rpb24gPSAnY2hhaSdcbiAgICogICAgIGFzc2VydC5pc05vdE9iamVjdChzZWxlY3Rpb24sICd0ZWEgc2VsZWN0aW9uIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICogICAgIGFzc2VydC5pc05vdE9iamVjdChudWxsLCAnbnVsbCBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90T2JqZWN0XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdE9iamVjdCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE9iamVjdCwgdHJ1ZSkudG8ubm90LmJlLmEoJ29iamVjdCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzQXJyYXkodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gYXJyYXkuXG4gICAqXG4gICAqICAgICB2YXIgbWVudSA9IFsgJ2dyZWVuJywgJ2NoYWknLCAnb29sb25nJyBdO1xuICAgKiAgICAgYXNzZXJ0LmlzQXJyYXkobWVudSwgJ3doYXQga2luZCBvZiB0ZWEgZG8gd2Ugd2FudD8nKTtcbiAgICpcbiAgICogQG5hbWUgaXNBcnJheVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNBcnJheSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0FycmF5LCB0cnVlKS50by5iZS5hbignYXJyYXknKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEFycmF5KHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGFuIGFycmF5LlxuICAgKlxuICAgKiAgICAgdmFyIG1lbnUgPSAnZ3JlZW58Y2hhaXxvb2xvbmcnO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90QXJyYXkobWVudSwgJ3doYXQga2luZCBvZiB0ZWEgZG8gd2Ugd2FudD8nKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RBcnJheVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RBcnJheSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEFycmF5LCB0cnVlKS50by5ub3QuYmUuYW4oJ2FycmF5Jyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNTdHJpbmcodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBzdHJpbmcuXG4gICAqXG4gICAqICAgICB2YXIgdGVhT3JkZXIgPSAnY2hhaSc7XG4gICAqICAgICBhc3NlcnQuaXNTdHJpbmcodGVhT3JkZXIsICdvcmRlciBwbGFjZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNTdHJpbmdcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzU3RyaW5nID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzU3RyaW5nLCB0cnVlKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFN0cmluZyh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBfbm90XyBhIHN0cmluZy5cbiAgICpcbiAgICogICAgIHZhciB0ZWFPcmRlciA9IDQ7XG4gICAqICAgICBhc3NlcnQuaXNOb3RTdHJpbmcodGVhT3JkZXIsICdvcmRlciBwbGFjZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RTdHJpbmdcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90U3RyaW5nID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90U3RyaW5nLCB0cnVlKS50by5ub3QuYmUuYSgnc3RyaW5nJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOdW1iZXIodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBudW1iZXIuXG4gICAqXG4gICAqICAgICB2YXIgY3VwcyA9IDI7XG4gICAqICAgICBhc3NlcnQuaXNOdW1iZXIoY3VwcywgJ2hvdyBtYW55IGN1cHMnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOdW1iZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc051bWJlciA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWJlciwgdHJ1ZSkudG8uYmUuYSgnbnVtYmVyJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3ROdW1iZXIodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgX25vdF8gYSBudW1iZXIuXG4gICAqXG4gICAqICAgICB2YXIgY3VwcyA9ICcyIGN1cHMgcGxlYXNlJztcbiAgICogICAgIGFzc2VydC5pc05vdE51bWJlcihjdXBzLCAnaG93IG1hbnkgY3VwcycpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE51bWJlclxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3ROdW1iZXIgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdW1iZXIsIHRydWUpLnRvLm5vdC5iZS5hKCdudW1iZXInKTtcbiAgfTtcblxuICAgLyoqXG4gICAqICMjIyAuaXNGaW5pdGUodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLiBVbmxpa2UgYC5pc051bWJlcmAsIHRoaXMgd2lsbCBmYWlsIGZvciBgTmFOYCBhbmQgYEluZmluaXR5YC5cbiAgICpcbiAgICogICAgIHZhciBjdXBzID0gMjtcbiAgICogICAgIGFzc2VydC5pc0Zpbml0ZShjdXBzLCAnaG93IG1hbnkgY3VwcycpO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzRmluaXRlKE5hTik7IC8vIHRocm93c1xuICAgKlxuICAgKiBAbmFtZSBpc0Zpbml0ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRmluaXRlID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRmluaXRlLCB0cnVlKS50by5iZS5maW5pdGU7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNCb29sZWFuKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIGEgYm9vbGVhbi5cbiAgICpcbiAgICogICAgIHZhciB0ZWFSZWFkeSA9IHRydWVcbiAgICogICAgICAgLCB0ZWFTZXJ2ZWQgPSBmYWxzZTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pc0Jvb2xlYW4odGVhUmVhZHksICdpcyB0aGUgdGVhIHJlYWR5Jyk7XG4gICAqICAgICBhc3NlcnQuaXNCb29sZWFuKHRlYVNlcnZlZCwgJ2hhcyB0ZWEgYmVlbiBzZXJ2ZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNCb29sZWFuXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0Jvb2xlYW4gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCb29sZWFuLCB0cnVlKS50by5iZS5hKCdib29sZWFuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RCb29sZWFuKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGEgYm9vbGVhbi5cbiAgICpcbiAgICogICAgIHZhciB0ZWFSZWFkeSA9ICd5ZXAnXG4gICAqICAgICAgICwgdGVhU2VydmVkID0gJ25vcGUnO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTm90Qm9vbGVhbih0ZWFSZWFkeSwgJ2lzIHRoZSB0ZWEgcmVhZHknKTtcbiAgICogICAgIGFzc2VydC5pc05vdEJvb2xlYW4odGVhU2VydmVkLCAnaGFzIHRlYSBiZWVuIHNlcnZlZCcpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdEJvb2xlYW5cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90Qm9vbGVhbiA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEJvb2xlYW4sIHRydWUpLnRvLm5vdC5iZS5hKCdib29sZWFuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAudHlwZU9mKHZhbHVlLCBuYW1lLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgJ3MgdHlwZSBpcyBgbmFtZWAsIGFzIGRldGVybWluZWQgYnlcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnR5cGVPZih7IHRlYTogJ2NoYWknIH0sICdvYmplY3QnLCAnd2UgaGF2ZSBhbiBvYmplY3QnKTtcbiAgICogICAgIGFzc2VydC50eXBlT2YoWydjaGFpJywgJ2phc21pbmUnXSwgJ2FycmF5JywgJ3dlIGhhdmUgYW4gYXJyYXknKTtcbiAgICogICAgIGFzc2VydC50eXBlT2YoJ3RlYScsICdzdHJpbmcnLCAnd2UgaGF2ZSBhIHN0cmluZycpO1xuICAgKiAgICAgYXNzZXJ0LnR5cGVPZigvdGVhLywgJ3JlZ2V4cCcsICd3ZSBoYXZlIGEgcmVndWxhciBleHByZXNzaW9uJyk7XG4gICAqICAgICBhc3NlcnQudHlwZU9mKG51bGwsICdudWxsJywgJ3dlIGhhdmUgYSBudWxsJyk7XG4gICAqICAgICBhc3NlcnQudHlwZU9mKHVuZGVmaW5lZCwgJ3VuZGVmaW5lZCcsICd3ZSBoYXZlIGFuIHVuZGVmaW5lZCcpO1xuICAgKlxuICAgKiBAbmFtZSB0eXBlT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnR5cGVPZiA9IGZ1bmN0aW9uICh2YWwsIHR5cGUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC50eXBlT2YsIHRydWUpLnRvLmJlLmEodHlwZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90VHlwZU9mKHZhbHVlLCBuYW1lLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgJ3MgdHlwZSBpcyBfbm90XyBgbmFtZWAsIGFzIGRldGVybWluZWQgYnlcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFR5cGVPZigndGVhJywgJ251bWJlcicsICdzdHJpbmdzIGFyZSBub3QgbnVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RUeXBlT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVvZiBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RUeXBlT2YgPSBmdW5jdGlvbiAodmFsLCB0eXBlLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90VHlwZU9mLCB0cnVlKS50by5ub3QuYmUuYSh0eXBlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pbnN0YW5jZU9mKG9iamVjdCwgY29uc3RydWN0b3IsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYGNvbnN0cnVjdG9yYC5cbiAgICpcbiAgICogICAgIHZhciBUZWEgPSBmdW5jdGlvbiAobmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9XG4gICAqICAgICAgICwgY2hhaSA9IG5ldyBUZWEoJ2NoYWknKTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pbnN0YW5jZU9mKGNoYWksIFRlYSwgJ2NoYWkgaXMgYW4gaW5zdGFuY2Ugb2YgdGVhJyk7XG4gICAqXG4gICAqIEBuYW1lIGluc3RhbmNlT2ZcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5zdGFuY2VPZiA9IGZ1bmN0aW9uICh2YWwsIHR5cGUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pbnN0YW5jZU9mLCB0cnVlKS50by5iZS5pbnN0YW5jZU9mKHR5cGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluc3RhbmNlT2Yob2JqZWN0LCBjb25zdHJ1Y3RvciwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIGB2YWx1ZWAgaXMgbm90IGFuIGluc3RhbmNlIG9mIGBjb25zdHJ1Y3RvcmAuXG4gICAqXG4gICAqICAgICB2YXIgVGVhID0gZnVuY3Rpb24gKG5hbWUpIHsgdGhpcy5uYW1lID0gbmFtZTsgfVxuICAgKiAgICAgICAsIGNoYWkgPSBuZXcgU3RyaW5nKCdjaGFpJyk7XG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5zdGFuY2VPZihjaGFpLCBUZWEsICdjaGFpIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0ZWEnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5zdGFuY2VPZlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RJbnN0YW5jZU9mID0gZnVuY3Rpb24gKHZhbCwgdHlwZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lm5vdEluc3RhbmNlT2YsIHRydWUpXG4gICAgICAudG8ubm90LmJlLmluc3RhbmNlT2YodHlwZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgaGF5c3RhY2tgIGluY2x1ZGVzIGBuZWVkbGVgLiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlXG4gICAqIGluY2x1c2lvbiBvZiBhIHZhbHVlIGluIGFuIGFycmF5LCBhIHN1YnN0cmluZyBpbiBhIHN0cmluZywgb3IgYSBzdWJzZXQgb2ZcbiAgICogcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZShbMSwyLDNdLCAyLCAnYXJyYXkgY29udGFpbnMgdmFsdWUnKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKCdmb29iYXInLCAnZm9vJywgJ3N0cmluZyBjb250YWlucyBzdWJzdHJpbmcnKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKHsgZm9vOiAnYmFyJywgaGVsbG86ICd1bml2ZXJzZScgfSwgeyBmb286ICdiYXInIH0sICdvYmplY3QgY29udGFpbnMgcHJvcGVydHknKTtcbiAgICpcbiAgICogU3RyaWN0IGVxdWFsaXR5ICg9PT0pIGlzIHVzZWQuIFdoZW4gYXNzZXJ0aW5nIHRoZSBpbmNsdXNpb24gb2YgYSB2YWx1ZSBpblxuICAgKiBhbiBhcnJheSwgdGhlIGFycmF5IGlzIHNlYXJjaGVkIGZvciBhbiBlbGVtZW50IHRoYXQncyBzdHJpY3RseSBlcXVhbCB0byB0aGVcbiAgICogZ2l2ZW4gdmFsdWUuIFdoZW4gYXNzZXJ0aW5nIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LCB0aGUgb2JqZWN0XG4gICAqIGlzIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkga2V5cywgY2hlY2tpbmcgdGhhdCBlYWNoIG9uZSBpcyBwcmVzZW50XG4gICAqIGFuZCBzdHJpY3RseSBlcXVhbCB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgdmFsdWUuIEZvciBpbnN0YW5jZTpcbiAgICpcbiAgICogICAgIHZhciBvYmoxID0ge2E6IDF9XG4gICAqICAgICAgICwgb2JqMiA9IHtiOiAyfTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKFtvYmoxLCBvYmoyXSwgb2JqMSk7XG4gICAqICAgICBhc3NlcnQuaW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiBvYmoxfSk7XG4gICAqICAgICBhc3NlcnQuaW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9KTtcbiAgICpcbiAgICogQG5hbWUgaW5jbHVkZVxuICAgKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuaW5jbHVkZSwgdHJ1ZSkuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYGhheXN0YWNrYCBkb2VzIG5vdCBpbmNsdWRlIGBuZWVkbGVgLiBDYW4gYmUgdXNlZCB0byBhc3NlcnRcbiAgICogdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSBpbiBhbiBhcnJheSwgYSBzdWJzdHJpbmcgaW4gYSBzdHJpbmcsIG9yIGEgc3Vic2V0IG9mXG4gICAqIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGUoWzEsMiwzXSwgNCwgXCJhcnJheSBkb2Vzbid0IGNvbnRhaW4gdmFsdWVcIik7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSgnZm9vYmFyJywgJ2JheicsIFwic3RyaW5nIGRvZXNuJ3QgY29udGFpbiBzdWJzdHJpbmdcIik7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSh7IGZvbzogJ2JhcicsIGhlbGxvOiAndW5pdmVyc2UnIH0sIHsgZm9vOiAnYmF6JyB9LCAnb2JqZWN0IGRvZXNuJ3QgY29udGFpbiBwcm9wZXJ0eScpO1xuICAgKlxuICAgKiBTdHJpY3QgZXF1YWxpdHkgKD09PSkgaXMgdXNlZC4gV2hlbiBhc3NlcnRpbmcgdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSBpbiBhblxuICAgKiBhcnJheSwgdGhlIGFycmF5IGlzIHNlYXJjaGVkIHRvIGNvbmZpcm0gdGhlIGFic2VuY2Ugb2YgYW4gZWxlbWVudCB0aGF0J3NcbiAgICogc3RyaWN0bHkgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLiBXaGVuIGFzc2VydGluZyBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluXG4gICAqIGFuIG9iamVjdCwgdGhlIG9iamVjdCBpcyBzZWFyY2hlZCB0byBjb25maXJtIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlblxuICAgKiBwcm9wZXJ0eSBrZXlzIGlzIGVpdGhlciBub3QgcHJlc2VudCBvciBub3Qgc3RyaWN0bHkgZXF1YWwgdG8gdGhlIGdpdmVuXG4gICAqIHByb3BlcnR5IHZhbHVlLiBGb3IgaW5zdGFuY2U6XG4gICAqXG4gICAqICAgICB2YXIgb2JqMSA9IHthOiAxfVxuICAgKiAgICAgICAsIG9iajIgPSB7YjogMn07XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZShbb2JqMSwgb2JqMl0sIHthOiAxfSk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiB7YTogMX19KTtcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IG9iajEsIGJhcjoge2I6IDJ9fSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVcbiAgICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90SW5jbHVkZSA9IGZ1bmN0aW9uIChleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGUsIHRydWUpLm5vdC5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYGhheXN0YWNrYCBpbmNsdWRlcyBgbmVlZGxlYC4gQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZVxuICAgKiBpbmNsdXNpb24gb2YgYSB2YWx1ZSBpbiBhbiBhcnJheSBvciBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdC5cbiAgICogRGVlcCBlcXVhbGl0eSBpcyB1c2VkLlxuICAgKlxuICAgKiAgICAgdmFyIG9iajEgPSB7YTogMX1cbiAgICogICAgICAgLCBvYmoyID0ge2I6IDJ9O1xuICAgKiAgICAgYXNzZXJ0LmRlZXBJbmNsdWRlKFtvYmoxLCBvYmoyXSwge2E6IDF9KTtcbiAgICogICAgIGFzc2VydC5kZWVwSW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiB7YTogMX19KTtcbiAgICogICAgIGFzc2VydC5kZWVwSW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiB7YTogMX0sIGJhcjoge2I6IDJ9fSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBJbmNsdWRlXG4gICAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge01peGVkfSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuZGVlcEluY2x1ZGUsIHRydWUpLmRlZXAuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdERlZXBJbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBoYXlzdGFja2AgZG9lcyBub3QgaW5jbHVkZSBgbmVlZGxlYC4gQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0XG4gICAqIHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gYW4gYXJyYXkgb3IgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqIERlZXAgZXF1YWxpdHkgaXMgdXNlZC5cbiAgICpcbiAgICogICAgIHZhciBvYmoxID0ge2E6IDF9XG4gICAqICAgICAgICwgb2JqMiA9IHtiOiAyfTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwSW5jbHVkZShbb2JqMSwgb2JqMl0sIHthOiA5fSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDl9fSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDF9LCBiYXI6IHtiOiA5fX0pO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwSW5jbHVkZVxuICAgKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3REZWVwSW5jbHVkZSA9IGZ1bmN0aW9uIChleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdERlZXBJbmNsdWRlLCB0cnVlKS5ub3QuZGVlcC5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubmVzdGVkSW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGluY2x1c2lvbiBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuXG4gICAqIG9iamVjdC5cbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIHJlZmVyZW5jaW5nIG5lc3RlZFxuICAgKiBwcm9wZXJ0aWVzLlxuICAgKiAnW10nIGFuZCAnLicgaW4gcHJvcGVydHkgbmFtZXMgY2FuIGJlIGVzY2FwZWQgdXNpbmcgZG91YmxlIGJhY2tzbGFzaGVzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUoeycuYSc6IHsnYic6ICd4J319LCB7J1xcXFwuYS5bYl0nOiAneCd9KTtcbiAgICogICAgIGFzc2VydC5uZXN0ZWRJbmNsdWRlKHsnYSc6IHsnW2JdJzogJ3gnfX0sIHsnYS5cXFxcW2JcXFxcXSc6ICd4J30pO1xuICAgKlxuICAgKiBAbmFtZSBuZXN0ZWRJbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5uZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubmVzdGVkSW5jbHVkZSwgdHJ1ZSkubmVzdGVkLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3ROZXN0ZWRJbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgZG9lcyBub3QgaW5jbHVkZSAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBhYnNlbmNlIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW5cbiAgICogb2JqZWN0LlxuICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgcmVmZXJlbmNpbmcgbmVzdGVkXG4gICAqIHByb3BlcnRpZXMuXG4gICAqICdbXScgYW5kICcuJyBpbiBwcm9wZXJ0eSBuYW1lcyBjYW4gYmUgZXNjYXBlZCB1c2luZyBkb3VibGUgYmFja3NsYXNoZXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90TmVzdGVkSW5jbHVkZSh7Jy5hJzogeydiJzogJ3gnfX0sIHsnXFxcXC5hLmInOiAneSd9KTtcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlKHsnYSc6IHsnW2JdJzogJ3gnfX0sIHsnYS5cXFxcW2JcXFxcXSc6ICd5J30pO1xuICAgKlxuICAgKiBAbmFtZSBub3ROZXN0ZWRJbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90TmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5ub3QubmVzdGVkLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5kZWVwTmVzdGVkSW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGluY2x1c2lvbiBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuXG4gICAqIG9iamVjdCB3aGlsZSBjaGVja2luZyBmb3IgZGVlcCBlcXVhbGl0eS5cbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIHJlZmVyZW5jaW5nIG5lc3RlZFxuICAgKiBwcm9wZXJ0aWVzLlxuICAgKiAnW10nIGFuZCAnLicgaW4gcHJvcGVydHkgbmFtZXMgY2FuIGJlIGVzY2FwZWQgdXNpbmcgZG91YmxlIGJhY2tzbGFzaGVzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlKHthOiB7YjogW3t4OiAxfV19fSwgeydhLmJbMF0nOiB7eDogMX19KTtcbiAgICogICAgIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSh7Jy5hJzogeydbYl0nOiB7eDogMX19fSwgeydcXFxcLmEuXFxcXFtiXFxcXF0nOiB7eDogMX19KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcE5lc3RlZEluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5kZWVwLm5lc3RlZC5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90RGVlcE5lc3RlZEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgJ2hheXN0YWNrJyBkb2VzIG5vdCBpbmNsdWRlICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGFic2VuY2Ugb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhblxuICAgKiBvYmplY3Qgd2hpbGUgY2hlY2tpbmcgZm9yIGRlZXAgZXF1YWxpdHkuXG4gICAqIEVuYWJsZXMgdGhlIHVzZSBvZiBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGZvciByZWZlcmVuY2luZyBuZXN0ZWRcbiAgICogcHJvcGVydGllcy5cbiAgICogJ1tdJyBhbmQgJy4nIGluIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBlc2NhcGVkIHVzaW5nIGRvdWJsZSBiYWNrc2xhc2hlcy5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSh7YToge2I6IFt7eDogMX1dfX0sIHsnYS5iWzBdJzoge3k6IDF9fSlcbiAgICogICAgIGFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSh7Jy5hJzogeydbYl0nOiB7eDogMX19fSwgeydcXFxcLmEuXFxcXFtiXFxcXF0nOiB7eTogMn19KTtcbiAgICpcbiAgICogQG5hbWUgbm90RGVlcE5lc3RlZEluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm93bkluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgJ2hheXN0YWNrJyBpbmNsdWRlcyAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBpbmNsdXNpb24gb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhblxuICAgKiBvYmplY3Qgd2hpbGUgaWdub3JpbmcgaW5oZXJpdGVkIHByb3BlcnRpZXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duSW5jbHVkZSh7IGE6IDEgfSwgeyBhOiAxIH0pO1xuICAgKlxuICAgKiBAbmFtZSBvd25JbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5vd25JbmNsdWRlLCB0cnVlKS5vd24uaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdE93bkluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgJ2hheXN0YWNrJyBpbmNsdWRlcyAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBhYnNlbmNlIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW5cbiAgICogb2JqZWN0IHdoaWxlIGlnbm9yaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAgICAgT2JqZWN0LnByb3RvdHlwZS5iID0gMjtcbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RPd25JbmNsdWRlKHsgYTogMSB9LCB7IGI6IDIgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdE93bkluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdE93bkluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlZXBPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgaW5jbHVkZXMgJ25lZWRsZScuXG4gICAqIENhbiBiZSB1c2VkIHRvIGFzc2VydCB0aGUgaW5jbHVzaW9uIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW5cbiAgICogb2JqZWN0IHdoaWxlIGlnbm9yaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGFuZCBjaGVja2luZyBmb3IgZGVlcCBlcXVhbGl0eS5cbiAgICpcbiAgICogICAgICBhc3NlcnQuZGVlcE93bkluY2x1ZGUoe2E6IHtiOiAyfX0sIHthOiB7YjogMn19KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcE93bkluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwT3duSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLm5vdERlZXBPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgaW5jbHVkZXMgJ25lZWRsZScuXG4gICAqIENhbiBiZSB1c2VkIHRvIGFzc2VydCB0aGUgYWJzZW5jZSBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuXG4gICAqIG9iamVjdCB3aGlsZSBpZ25vcmluZyBpbmhlcml0ZWQgcHJvcGVydGllcyBhbmQgY2hlY2tpbmcgZm9yIGRlZXAgZXF1YWxpdHkuXG4gICAqXG4gICAqICAgICAgYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlKHthOiB7YjogMn19LCB7YToge2M6IDN9fSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBPd25JbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3REZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpXG4gICAgICAubm90LmRlZXAub3duLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5tYXRjaCh2YWx1ZSwgcmVnZXhwLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBgcmVnZXhwYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5tYXRjaCgnZm9vYmFyJywgL15mb28vLCAncmVnZXhwIG1hdGNoZXMnKTtcbiAgICpcbiAgICogQG5hbWUgbWF0Y2hcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubWF0Y2ggPSBmdW5jdGlvbiAoZXhwLCByZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm1hdGNoLCB0cnVlKS50by5tYXRjaChyZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TWF0Y2godmFsdWUsIHJlZ2V4cCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uIGByZWdleHBgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdE1hdGNoKCdmb29iYXInLCAvXmZvby8sICdyZWdleHAgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICpcbiAgICogQG5hbWUgbm90TWF0Y2hcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90TWF0Y2ggPSBmdW5jdGlvbiAoZXhwLCByZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE1hdGNoLCB0cnVlKS50by5ub3QubWF0Y2gocmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YC5cbiAgICpcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEnKTtcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0b1N0cmluZycpO1xuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQucHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQucHJvcGVydHksIHRydWUpLnRvLmhhdmUucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lZFxuICAgKiBieSBgcHJvcGVydHlgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFByb3BlcnR5KHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ2NvZmZlZScpO1xuICAgKlxuICAgKiBAbmFtZSBub3RQcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90UHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHksIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAucHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YCB3aXRoIGEgdmFsdWUgZ2l2ZW4gYnkgYHZhbHVlYC4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVja1xuICAgKiAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eVZhbCh7IHRlYTogJ2lzIGdvb2QnIH0sICd0ZWEnLCAnaXMgZ29vZCcpO1xuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQucHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5wcm9wZXJ0eVZhbCwgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90UHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWRcbiAgICogYnkgYHByb3BlcnR5YCB3aXRoIHZhbHVlIGdpdmVuIGJ5IGB2YWx1ZWAuIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHkgY2hlY2tcbiAgICogKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90UHJvcGVydHlWYWwoeyB0ZWE6ICdpcyBnb29kJyB9LCAndGVhJywgJ2lzIGJhZCcpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdFByb3BlcnR5VmFsKHsgdGVhOiAnaXMgZ29vZCcgfSwgJ2NvZmZlZScsICdpcyBnb29kJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFByb3BlcnR5VmFsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcFByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVkIGJ5XG4gICAqIGBwcm9wZXJ0eWAgd2l0aCBhIHZhbHVlIGdpdmVuIGJ5IGB2YWx1ZWAuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuZGVlcC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdERlZXBQcm9wZXJ0eVZhbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lZFxuICAgKiBieSBgcHJvcGVydHlgIHdpdGggdmFsdWUgZ2l2ZW4gYnkgYHZhbHVlYC4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9IH0sICd0ZWEnLCB7IGJsYWNrOiAnbWF0Y2hhJyB9KTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwUHJvcGVydHlWYWwoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH0gfSwgJ3RlYScsIHsgZ3JlZW46ICdvb2xvbmcnIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAnY29mZmVlJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5vd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YC4gSW5oZXJpdGVkXG4gICAqIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duUHJvcGVydHkoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH19LCAndGVhJyk7XG4gICAqXG4gICAqIEBuYW1lIG93blByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5vd25Qcm9wZXJ0eSwgdHJ1ZSlcbiAgICAgIC50by5oYXZlLm93bi5wcm9wZXJ0eShwcm9wKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIF9ub3RfIGhhdmUgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YC4gSW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHkoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH19LCAnY29mZmVlJyk7XG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHkoe30sICd0b1N0cmluZycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RPd25Qcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90T3duUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90T3duUHJvcGVydHksIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUub3duLnByb3BlcnR5KHByb3ApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCBhbmQgYSB2YWx1ZVxuICAgKiBlcXVhbCB0byB0aGUgcHJvdmlkZWQgYHZhbHVlYC4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICogSW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duUHJvcGVydHlWYWwoeyBjb2ZmZWU6ICdpcyBnb29kJ30sICdjb2ZmZWUnLCAnaXMgZ29vZCcpO1xuICAgKlxuICAgKiBAbmFtZSBvd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25Qcm9wZXJ0eVZhbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWBcbiAgICogd2l0aCBhIHZhbHVlIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBgdmFsdWVgLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrXG4gICAqICg9PT0pLiBJbmhlcml0ZWQgcHJvcGVydGllcyBhcmVuJ3QgY2hlY2tlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RPd25Qcm9wZXJ0eVZhbCh7IHRlYTogJ2lzIGJldHRlcid9LCAndGVhJywgJ2lzIHdvcnNlJyk7XG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwoe30sICd0b1N0cmluZycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuICAgKlxuICAgKiBAbmFtZSBub3RPd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcE93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCBhbmQgYSB2YWx1ZVxuICAgKiBlcXVhbCB0byB0aGUgcHJvdmlkZWQgYHZhbHVlYC4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suIEluaGVyaXRlZFxuICAgKiBwcm9wZXJ0aWVzIGFyZW4ndCBjaGVja2VkLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBPd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kZWVwT3duUHJvcGVydHlWYWwsIHRydWUpXG4gICAgICAudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90RGVlcE93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIF9ub3RfIGhhdmUgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YFxuICAgKiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIGB2YWx1ZWAuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKiBJbmhlcml0ZWQgcHJvcGVydGllcyBhcmVuJ3QgY2hlY2tlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH0gfSwgJ3RlYScsIHsgYmxhY2s6ICdtYXRjaGEnIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ29vbG9uZycgfSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcE93blByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9IH0sICdjb2ZmZWUnLCB7IGdyZWVuOiAnbWF0Y2hhJyB9KTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwoe30sICd0b1N0cmluZycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwT3duUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcE93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmRlZXAub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5uZXN0ZWRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVkIGJ5XG4gICAqIGBwcm9wZXJ0eWAsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyB1c2luZyBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGZvclxuICAgKiBuZXN0ZWQgcmVmZXJlbmNlLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5lc3RlZFByb3BlcnR5KHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ3RlYS5ncmVlbicpO1xuICAgKlxuICAgKiBAbmFtZSBuZXN0ZWRQcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubmVzdGVkUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubmVzdGVkUHJvcGVydHksIHRydWUpXG4gICAgICAudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TmVzdGVkUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCwgd2hpY2hcbiAgICogY2FuIGJlIGEgc3RyaW5nIHVzaW5nIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIG5lc3RlZCByZWZlcmVuY2UuIFRoZVxuICAgKiBwcm9wZXJ0eSBjYW5ub3QgZXhpc3Qgb24gdGhlIG9iamVjdCBub3IgYW55d2hlcmUgaW4gaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEub29sb25nJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdE5lc3RlZFByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aCB2YWx1ZSBnaXZlblxuICAgKiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgbmVzdGVkXG4gICAqIHJlZmVyZW5jZS4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEuZ3JlZW4nLCAnbWF0Y2hhJyk7XG4gICAqXG4gICAqIEBuYW1lIG5lc3RlZFByb3BlcnR5VmFsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aFxuICAgKiB2YWx1ZSBnaXZlbiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3JcbiAgICogbmVzdGVkIHJlZmVyZW5jZS4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEuZ3JlZW4nLCAna29uYWNoYScpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ2NvZmZlZS5ncmVlbicsICdtYXRjaGEnKTtcbiAgICpcbiAgICogQG5hbWUgbm90TmVzdGVkUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90TmVzdGVkUHJvcGVydHlWYWwsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcE5lc3RlZFByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBwcm9wZXJ0eSBuYW1lZCBieSBgcHJvcGVydHlgIHdpdGggYSB2YWx1ZSBnaXZlblxuICAgKiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgbmVzdGVkXG4gICAqIHJlZmVyZW5jZS4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG1hdGNoYTogJ3l1bScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBOZXN0ZWRQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwTmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aFxuICAgKiB2YWx1ZSBnaXZlbiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3JcbiAgICogbmVzdGVkIHJlZmVyZW5jZS4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG9vbG9uZzogJ3l1bScgfSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG1hdGNoYTogJ3l1Y2snIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogeyBtYXRjaGE6ICd5dW0nIH0gfSB9LCAndGVhLmJsYWNrJywgeyBtYXRjaGE6ICd5dW0nIH0pO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwTmVzdGVkUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubGVuZ3RoT2Yob2JqZWN0LCBsZW5ndGgsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGBsZW5ndGhgIG9yIGBzaXplYCB3aXRoIHRoZSBleHBlY3RlZCB2YWx1ZS5cbiAgICpcbiAgICogICAgIGFzc2VydC5sZW5ndGhPZihbMSwyLDNdLCAzLCAnYXJyYXkgaGFzIGxlbmd0aCBvZiAzJyk7XG4gICAqICAgICBhc3NlcnQubGVuZ3RoT2YoJ2Zvb2JhcicsIDYsICdzdHJpbmcgaGFzIGxlbmd0aCBvZiA2Jyk7XG4gICAqICAgICBhc3NlcnQubGVuZ3RoT2YobmV3IFNldChbMSwyLDNdKSwgMywgJ3NldCBoYXMgc2l6ZSBvZiAzJyk7XG4gICAqICAgICBhc3NlcnQubGVuZ3RoT2YobmV3IE1hcChbWydhJywxXSxbJ2InLDJdLFsnYycsM11dKSwgMywgJ21hcCBoYXMgc2l6ZSBvZiAzJyk7XG4gICAqXG4gICAqIEBuYW1lIGxlbmd0aE9mXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5sZW5ndGhPZiA9IGZ1bmN0aW9uIChleHAsIGxlbiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lmxlbmd0aE9mLCB0cnVlKS50by5oYXZlLmxlbmd0aE9mKGxlbik7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaGFzQW55S2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5oYXNBbnlLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwgWydmb28nLCAnaURvbnRFeGlzdCcsICdiYXonXSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55S2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtmb286IDMwLCBpRG9udEV4aXN0OiA5OSwgYmF6OiAxMzM3fSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55S2V5cyhuZXcgTWFwKFtbe2ZvbzogMX0sICdiYXInXSwgWydrZXknLCAndmFsdWUnXV0pLCBbe2ZvbzogMX0sICdrZXknXSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55S2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10pLCBbe2ZvbzogJ2Jhcid9LCAnYW5vdGhlcktleSddKTtcbiAgICpcbiAgICogQG5hbWUgaGFzQW55S2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lmhhc0FueUtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55S2V5cywgdHJ1ZSkudG8uaGF2ZS5hbnkua2V5cyhrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmhhc0FsbEtleXMob2JqZWN0LCBba2V5c10sIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhbGwgYW5kIG9ubHkgYWxsIG9mIHRoZSBga2V5c2AgcHJvdmlkZWQuXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lmhhc0FsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ2ZvbycsICdiYXInLCAnYmF6J10pO1xuICAgKiAgICAgYXNzZXJ0Lmhhc0FsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCB7Zm9vOiAzMCwgYmFyOiA5OSwgYmF6OiAxMzM3XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsS2V5cyhuZXcgTWFwKFtbe2ZvbzogMX0sICdiYXInXSwgWydrZXknLCAndmFsdWUnXV0pLCBbe2ZvbzogMX0sICdrZXknXSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsS2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10sIFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10pO1xuICAgKlxuICAgKiBAbmFtZSBoYXNBbGxLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBrZXlzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5oYXNBbGxLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lmhhc0FsbEtleXMsIHRydWUpLnRvLmhhdmUuYWxsLmtleXMoa2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5jb250YWluc0FsbEtleXMob2JqZWN0LCBba2V5c10sIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZCBidXQgbWF5IGhhdmUgbW9yZSBrZXlzIG5vdCBsaXN0ZWQuXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIFsnZm9vJywgJ2JheiddKTtcbiAgICogICAgIGFzc2VydC5jb250YWluc0FsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ2ZvbycsICdiYXInLCAnYmF6J10pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtmb286IDMwLCBiYXo6IDEzMzd9KTtcbiAgICogICAgIGFzc2VydC5jb250YWluc0FsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCB7Zm9vOiAzMCwgYmFyOiA5OSwgYmF6OiAxMzM3fSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7Zm9vOiAxfV0pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyhuZXcgTWFwKFtbe2ZvbzogMX0sICdiYXInXSwgWydrZXknLCAndmFsdWUnXV0pLCBbe2ZvbzogMX0sICdrZXknXSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSwgW3tmb286ICdiYXInfV0pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10sIFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10pO1xuICAgKlxuICAgKiBAbmFtZSBjb250YWluc0FsbEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nW119IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5jb250YWluc0FsbEtleXMsIHRydWUpXG4gICAgICAudG8uY29udGFpbi5hbGwua2V5cyhrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmRvZXNOb3RIYXZlQW55S2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIG5vbmUgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwgWydvbmUnLCAndHdvJywgJ2V4YW1wbGUnXSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwge29uZTogMSwgdHdvOiAyLCBleGFtcGxlOiAnZm9vJ30pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cyhuZXcgTWFwKFtbe2ZvbzogMX0sICdiYXInXSwgWydrZXknLCAndmFsdWUnXV0pLCBbe29uZTogJ3R3byd9LCAnZXhhbXBsZSddKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMobmV3IFNldChbe2ZvbzogJ2Jhcid9LCAnYW5vdGhlcktleSddLCBbe29uZTogJ3R3byd9LCAnZXhhbXBsZSddKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdEhhdmVBbnlLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ1tdfSBrZXlzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmFueS5rZXlzKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdEhhdmVBbGxLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ29uZScsICd0d28nLCAnZXhhbXBsZSddKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCB7b25lOiAxLCB0d286IDIsIGV4YW1wbGU6ICdmb28nfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7b25lOiAndHdvJ30sICdleGFtcGxlJ10pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10sIFt7b25lOiAndHdvJ30sICdleGFtcGxlJ10pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SGF2ZUFsbEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nW119IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUuYWxsLmtleXMoa2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5oYXNBbnlEZWVwS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgWzEsIDJdXSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55RGVlcEtleXMobmV3IE1hcChbW3tvbmU6ICdvbmUnfSwgJ3ZhbHVlT25lJ10sIFsxLCAyXV0pLCBbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55RGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwge29uZTogJ29uZSd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCBbe29uZTogJ29uZSd9LCB7dGhyZWU6ICd0aHJlZSd9XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQW55RGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGhhc0FueURlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQW55RGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55RGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5oYXNBbGxEZWVwS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGFsbCBhbmQgb25seSBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogU2luY2UgU2V0cyBhbmQgTWFwcyBjYW4gaGF2ZSBvYmplY3RzIGFzIGtleXMgeW91IGNhbiB1c2UgdGhpcyBhc3NlcnRpb24gdG8gcGVyZm9ybVxuICAgKiBhIGRlZXAgY29tcGFyaXNvbi5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IE1hcChbW3tvbmU6ICdvbmUnfSwgJ3ZhbHVlT25lJ11dKSwge29uZTogJ29uZSd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9XSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGhhc0FsbERlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQWxsRGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQWxsRGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5hbGwuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5jb250YWluc0FsbERlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBjb250YWlucyBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogU2luY2UgU2V0cyBhbmQgTWFwcyBjYW4gaGF2ZSBvYmplY3RzIGFzIGtleXMgeW91IGNhbiB1c2UgdGhpcyBhc3NlcnRpb24gdG8gcGVyZm9ybVxuICAgKiBhIGRlZXAgY29tcGFyaXNvbi5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgWzEsIDJdXSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7b25lOiAnb25lJ30pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGNvbnRhaW5zQWxsRGVlcEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBrZXlzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jb250YWluc0FsbERlZXBLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgbm9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge3RoaXNEb2VzTm90OiAnZXhpc3QnfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3t0d2VudHk6ICd0d2VudHknfSwge2ZpZnR5OiAnZmlmdHknfV0pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwge3R3ZW50eTogJ3R3ZW50eSd9KTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG5ldyBTZXQoW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSksIFt7dHdlbnR5OiAndHdlbnR5J30sIHtmaWZ0eTogJ2ZpZnR5J31dKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdEhhdmVBbnlEZWVwS2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbnlEZWVwS2V5cywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge3RoaXNEb2VzTm90OiAnZXhpc3QnfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3t0d2VudHk6ICd0d2VudHknfSwge29uZTogJ29uZSd9XSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7dHdlbnR5OiAndHdlbnR5J30pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge2ZpZnR5OiAnZmlmdHknfV0pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SGF2ZUFsbERlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmFsbC5kZWVwLmtleXMoa2V5cyk7XG4gIH1cblxuIC8qKlxuICAgKiAjIyMgLnRocm93cyhmbiwgW2Vycm9yTGlrZS9zdHJpbmcvcmVnZXhwXSwgW3N0cmluZy9yZWdleHBdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIElmIGBlcnJvckxpa2VgIGlzIGFuIGBFcnJvcmAgY29uc3RydWN0b3IsIGFzc2VydHMgdGhhdCBgZm5gIHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhblxuICAgKiBpbnN0YW5jZSBvZiBgZXJyb3JMaWtlYC5cbiAgICogSWYgYGVycm9yTGlrZWAgaXMgYW4gYEVycm9yYCBpbnN0YW5jZSwgYXNzZXJ0cyB0aGF0IHRoZSBlcnJvciB0aHJvd24gaXMgdGhlIHNhbWVcbiAgICogaW5zdGFuY2UgYXMgYGVycm9yTGlrZWAuXG4gICAqIElmIGBlcnJNc2dNYXRjaGVyYCBpcyBwcm92aWRlZCwgaXQgYWxzbyBhc3NlcnRzIHRoYXQgdGhlIGVycm9yIHRocm93biB3aWxsIGhhdmUgYVxuICAgKiBtZXNzYWdlIG1hdGNoaW5nIGBlcnJNc2dNYXRjaGVyYC5cbiAgICpcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sICdFcnJvciB0aHJvd24gbXVzdCBoYXZlIHRoaXMgbXNnJyk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCAvRXJyb3IgdGhyb3duIG11c3QgaGF2ZSBhIG1zZyB0aGF0IG1hdGNoZXMgdGhpcy8pO1xuICAgKiAgICAgYXNzZXJ0LnRocm93cyhmbiwgUmVmZXJlbmNlRXJyb3IpO1xuICAgKiAgICAgYXNzZXJ0LnRocm93cyhmbiwgZXJyb3JJbnN0YW5jZSk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCBSZWZlcmVuY2VFcnJvciwgJ0Vycm9yIHRocm93biBtdXN0IGJlIGEgUmVmZXJlbmNlRXJyb3IgYW5kIGhhdmUgdGhpcyBtc2cnKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIGVycm9ySW5zdGFuY2UsICdFcnJvciB0aHJvd24gbXVzdCBiZSB0aGUgc2FtZSBlcnJvckluc3RhbmNlIGFuZCBoYXZlIHRoaXMgbXNnJyk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCBSZWZlcmVuY2VFcnJvciwgL0Vycm9yIHRocm93biBtdXN0IGJlIGEgUmVmZXJlbmNlRXJyb3IgYW5kIG1hdGNoIHRoaXMvKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIGVycm9ySW5zdGFuY2UsIC9FcnJvciB0aHJvd24gbXVzdCBiZSB0aGUgc2FtZSBlcnJvckluc3RhbmNlIGFuZCBtYXRjaCB0aGlzLyk7XG4gICAqXG4gICAqIEBuYW1lIHRocm93c1xuICAgKiBAYWxpYXMgdGhyb3dcbiAgICogQGFsaWFzIFRocm93XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3RvcnxFcnJvcn0gZXJyb3JMaWtlXG4gICAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gZXJyTXNnTWF0Y2hlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0Vycm9yX3R5cGVzXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC50aHJvd3MgPSBmdW5jdGlvbiAoZm4sIGVycm9yTGlrZSwgZXJyTXNnTWF0Y2hlciwgbXNnKSB7XG4gICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgZXJyb3JMaWtlIHx8IGVycm9yTGlrZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICAgIGVycm9yTGlrZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGFzc2VydEVyciA9IG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LnRocm93cywgdHJ1ZSlcbiAgICAgIC50by50aHJvdyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIpO1xuICAgIHJldHVybiBmbGFnKGFzc2VydEVyciwgJ29iamVjdCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmRvZXNOb3RUaHJvdyhmbiwgW2Vycm9yTGlrZS9zdHJpbmcvcmVnZXhwXSwgW3N0cmluZy9yZWdleHBdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIElmIGBlcnJvckxpa2VgIGlzIGFuIGBFcnJvcmAgY29uc3RydWN0b3IsIGFzc2VydHMgdGhhdCBgZm5gIHdpbGwgX25vdF8gdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhblxuICAgKiBpbnN0YW5jZSBvZiBgZXJyb3JMaWtlYC5cbiAgICogSWYgYGVycm9yTGlrZWAgaXMgYW4gYEVycm9yYCBpbnN0YW5jZSwgYXNzZXJ0cyB0aGF0IHRoZSBlcnJvciB0aHJvd24gaXMgX25vdF8gdGhlIHNhbWVcbiAgICogaW5zdGFuY2UgYXMgYGVycm9yTGlrZWAuXG4gICAqIElmIGBlcnJNc2dNYXRjaGVyYCBpcyBwcm92aWRlZCwgaXQgYWxzbyBhc3NlcnRzIHRoYXQgdGhlIGVycm9yIHRocm93biB3aWxsIF9ub3RfIGhhdmUgYVxuICAgKiBtZXNzYWdlIG1hdGNoaW5nIGBlcnJNc2dNYXRjaGVyYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90VGhyb3coZm4sICdBbnkgRXJyb3IgdGhyb3duIG11c3Qgbm90IGhhdmUgdGhpcyBtZXNzYWdlJyk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCAvQW55IEVycm9yIHRocm93biBtdXN0IG5vdCBtYXRjaCB0aGlzLyk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBFcnJvcik7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBlcnJvckluc3RhbmNlKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90VGhyb3coZm4sIEVycm9yLCAnRXJyb3IgbXVzdCBub3QgaGF2ZSB0aGlzIG1lc3NhZ2UnKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90VGhyb3coZm4sIGVycm9ySW5zdGFuY2UsICdFcnJvciBtdXN0IG5vdCBoYXZlIHRoaXMgbWVzc2FnZScpO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgRXJyb3IsIC9FcnJvciBtdXN0IG5vdCBtYXRjaCB0aGlzLyk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBlcnJvckluc3RhbmNlLCAvRXJyb3IgbXVzdCBub3QgbWF0Y2ggdGhpcy8pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90VGhyb3dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2VcbiAgICogQHBhcmFtIHtSZWdFeHB8U3RyaW5nfSBlcnJNc2dNYXRjaGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjRXJyb3JfdHlwZXNcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uIChmbiwgZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyLCBtc2cpIHtcbiAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgICB9XG5cbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90VGhyb3csIHRydWUpXG4gICAgICAudG8ubm90LnRocm93KGVycm9yTGlrZSwgZXJyTXNnTWF0Y2hlcik7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAub3BlcmF0b3IodmFsMSwgb3BlcmF0b3IsIHZhbDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQ29tcGFyZXMgdHdvIHZhbHVlcyB1c2luZyBgb3BlcmF0b3JgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm9wZXJhdG9yKDEsICc8JywgMiwgJ2V2ZXJ5dGhpbmcgaXMgb2snKTtcbiAgICogICAgIGFzc2VydC5vcGVyYXRvcigxLCAnPicsIDIsICd0aGlzIHdpbGwgZmFpbCcpO1xuICAgKlxuICAgKiBAbmFtZSBvcGVyYXRvclxuICAgKiBAcGFyYW0ge01peGVkfSB2YWwxXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBvcGVyYXRvclxuICAgKiBAcGFyYW0ge01peGVkfSB2YWwyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vcGVyYXRvciA9IGZ1bmN0aW9uICh2YWwsIG9wZXJhdG9yLCB2YWwyLCBtc2cpIHtcbiAgICB2YXIgb2s7XG4gICAgc3dpdGNoKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlICc9PSc6XG4gICAgICAgIG9rID0gdmFsID09IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPT09JzpcbiAgICAgICAgb2sgPSB2YWwgPT09IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPic6XG4gICAgICAgIG9rID0gdmFsID4gdmFsMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc+PSc6XG4gICAgICAgIG9rID0gdmFsID49IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIG9rID0gdmFsIDwgdmFsMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc8PSc6XG4gICAgICAgIG9rID0gdmFsIDw9IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnIT0nOlxuICAgICAgICBvayA9IHZhbCAhPSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgIG9rID0gdmFsICE9PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG1zZyA9IG1zZyA/IG1zZyArICc6ICcgOiBtc2c7XG4gICAgICAgIHRocm93IG5ldyBjaGFpLkFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIG1zZyArICdJbnZhbGlkIG9wZXJhdG9yIFwiJyArIG9wZXJhdG9yICsgJ1wiJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgYXNzZXJ0Lm9wZXJhdG9yXG4gICAgICAgICk7XG4gICAgfVxuICAgIHZhciB0ZXN0ID0gbmV3IEFzc2VydGlvbihvaywgbXNnLCBhc3NlcnQub3BlcmF0b3IsIHRydWUpO1xuICAgIHRlc3QuYXNzZXJ0KFxuICAgICAgICB0cnVlID09PSBmbGFnKHRlc3QsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgJyArIHV0aWwuaW5zcGVjdCh2YWwpICsgJyB0byBiZSAnICsgb3BlcmF0b3IgKyAnICcgKyB1dGlsLmluc3BlY3QodmFsMilcbiAgICAgICwgJ2V4cGVjdGVkICcgKyB1dGlsLmluc3BlY3QodmFsKSArICcgdG8gbm90IGJlICcgKyBvcGVyYXRvciArICcgJyArIHV0aWwuaW5zcGVjdCh2YWwyKSApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmNsb3NlVG8oYWN0dWFsLCBleHBlY3RlZCwgZGVsdGEsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgYGV4cGVjdGVkYCwgdG8gd2l0aGluIGEgKy8tIGBkZWx0YWAgcmFuZ2UuXG4gICAqXG4gICAqICAgICBhc3NlcnQuY2xvc2VUbygxLjUsIDEsIDAuNSwgJ251bWJlcnMgYXJlIGNsb3NlJyk7XG4gICAqXG4gICAqIEBuYW1lIGNsb3NlVG9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjdHVhbFxuICAgKiBAcGFyYW0ge051bWJlcn0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jbG9zZVRvID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmNsb3NlVG8sIHRydWUpLnRvLmJlLmNsb3NlVG8oZXhwLCBkZWx0YSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuYXBwcm94aW1hdGVseShhY3R1YWwsIGV4cGVjdGVkLCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCBgZXhwZWN0ZWRgLCB0byB3aXRoaW4gYSArLy0gYGRlbHRhYCByYW5nZS5cbiAgICpcbiAgICogICAgIGFzc2VydC5hcHByb3hpbWF0ZWx5KDEuNSwgMSwgMC41LCAnbnVtYmVycyBhcmUgY2xvc2UnKTtcbiAgICpcbiAgICogQG5hbWUgYXBwcm94aW1hdGVseVxuICAgKiBAcGFyYW0ge051bWJlcn0gYWN0dWFsXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmFwcHJveGltYXRlbHkgPSBmdW5jdGlvbiAoYWN0LCBleHAsIGRlbHRhLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuYXBwcm94aW1hdGVseSwgdHJ1ZSlcbiAgICAgIC50by5iZS5hcHByb3hpbWF0ZWx5KGV4cCwgZGVsdGEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnNhbWVNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiBhbnkgb3JkZXIuIFVzZXMgYVxuICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuc2FtZU1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMiwgMSwgMyBdLCAnc2FtZSBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIHNhbWVNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZU1lbWJlcnMgPSBmdW5jdGlvbiAoc2V0MSwgc2V0MiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzZXQxLCBtc2csIGFzc2VydC5zYW1lTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnNhbWUubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm5vdFNhbWVNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGRvbid0IGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiBhbnkgb3JkZXIuXG4gICAqIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90U2FtZU1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgNSwgMSwgMyBdLCAnbm90IHNhbWUgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RTYW1lTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdFNhbWVNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZU1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuc2FtZURlZXBNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiBhbnkgb3JkZXIuIFVzZXMgYVxuICAgKiBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgW3sgYjogMiB9LCB7IGE6IDEgfSwgeyBjOiAzIH1dLCAnc2FtZSBkZWVwIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgc2FtZURlZXBNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZURlZXBNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuc2FtZS5kZWVwLm1lbWJlcnMoc2V0Mik7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RTYW1lRGVlcE1lbWJlcnMoc2V0MSwgc2V0MiwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHNldDFgIGFuZCBgc2V0MmAgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBtZW1iZXJzIGluIGFueSBvcmRlci5cbiAgICogVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbeyBiOiAyIH0sIHsgYTogMSB9LCB7IGY6IDUgfV0sICdub3Qgc2FtZSBkZWVwIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90U2FtZURlZXBNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnNhbWUuZGVlcC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuc2FtZU9yZGVyZWRNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICogVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5zYW1lT3JkZXJlZE1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMSwgMiwgMyBdLCAnc2FtZSBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgc2FtZU9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuc2FtZS5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RTYW1lT3JkZXJlZE1lbWJlcnMoc2V0MSwgc2V0MiwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHNldDFgIGFuZCBgc2V0MmAgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBtZW1iZXJzIGluIHRoZSBzYW1lXG4gICAqIG9yZGVyLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycyhbIDEsIDIsIDMgXSwgWyAyLCAxLCAzIF0sICdub3Qgc2FtZSBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90U2FtZU9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnNhbWUub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuc2FtZURlZXBPcmRlcmVkTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCAnc2FtZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBzYW1lRGVlcE9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBkb24ndCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gdGhlIHNhbWVcbiAgICogb3JkZXIuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IHo6IDUgfSBdLCAnbm90IHNhbWUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICogICAgIGFzc2VydC5ub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGE6IDEgfSwgeyBjOiAzIH0gXSwgJ25vdCBzYW1lIGRlZXAgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnNcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MVxuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jbHVkZU1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXMgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiBhbnkgb3JkZXIuIFVzZXMgYVxuICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuIER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZU1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMiwgMSwgMiBdLCAnaW5jbHVkZSBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIGluY2x1ZGVNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5jbHVkZU1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQuaW5jbHVkZU1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaW5jbHVkZS5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RJbmNsdWRlTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpc24ndCBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIGFueSBvcmRlci4gVXNlcyBhXG4gICAqIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS4gRHVwbGljYXRlcyBhcmUgaWdub3JlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlTWVtYmVycyhbIDEsIDIsIDMgXSwgWyA1LCAxIF0sICdub3QgaW5jbHVkZSBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90SW5jbHVkZU1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZU1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmluY2x1ZGUubWVtYmVycyhzdWJzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jbHVkZURlZXBNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzIGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gYW55IG9yZGVyLiBVc2VzIGEgZGVlcFxuICAgKiBlcXVhbGl0eSBjaGVjay4gRHVwbGljYXRlcyBhcmUgaWdub3JlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBiOiAyIH0sIHsgYTogMSB9LCB7IGI6IDIgfSBdLCAnaW5jbHVkZSBkZWVwIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgaW5jbHVkZURlZXBNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5pbmNsdWRlLmRlZXAubWVtYmVycyhzdWJzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90SW5jbHVkZURlZXBNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzbid0IGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gYW55IG9yZGVyLiBVc2VzIGFcbiAgICogZGVlcCBlcXVhbGl0eSBjaGVjay4gRHVwbGljYXRlcyBhcmUgaWdub3JlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBiOiAyIH0sIHsgZjogNSB9IF0sICdub3QgaW5jbHVkZSBkZWVwIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5jbHVkZURlZXBNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY2x1ZGVPcmRlcmVkTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpcyBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIHRoZSBzYW1lIG9yZGVyXG4gICAqIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IGluIGBzdXBlcnNldGAuIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHlcbiAgICogY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZU9yZGVyZWRNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDEsIDIgXSwgJ2luY2x1ZGUgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIGluY2x1ZGVPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaW5jbHVkZS5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpc24ndCBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIHRoZSBzYW1lIG9yZGVyXG4gICAqIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IGluIGBzdXBlcnNldGAuIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHlcbiAgICogY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDIsIDEgXSwgJ25vdCBpbmNsdWRlIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyhbIDEsIDIsIDMgXSwgWyAyLCAzIF0sICdub3QgaW5jbHVkZSBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaW5jbHVkZS5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXMgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiB0aGUgc2FtZSBvcmRlclxuICAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBpbiBgc3VwZXJzZXRgLiBVc2VzIGEgZGVlcCBlcXVhbGl0eVxuICAgKiBjaGVjay5cbiAgICpcbiAgICogICAgIGFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYTogMSB9LCB7IGI6IDIgfSBdLCAnaW5jbHVkZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBpbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1cGVyc2V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN1YnNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmluY2x1ZGUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXNuJ3QgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiB0aGUgc2FtZSBvcmRlclxuICAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBpbiBgc3VwZXJzZXRgLiBVc2VzIGEgZGVlcCBlcXVhbGl0eVxuICAgKiBjaGVjay5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYTogMSB9LCB7IGY6IDUgfSBdLCAnbm90IGluY2x1ZGUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGE6IDEgfSBdLCAnbm90IGluY2x1ZGUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGM6IDMgfSBdLCAnbm90IGluY2x1ZGUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaW5jbHVkZS5kZWVwLm9yZGVyZWQubWVtYmVycyhzdWJzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAub25lT2YoaW5MaXN0LCBsaXN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBub24tb2JqZWN0LCBub24tYXJyYXkgdmFsdWUgYGluTGlzdGAgYXBwZWFycyBpbiB0aGUgZmxhdCBhcnJheSBgbGlzdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQub25lT2YoMSwgWyAyLCAxIF0sICdOb3QgZm91bmQgaW4gbGlzdCcpO1xuICAgKlxuICAgKiBAbmFtZSBvbmVPZlxuICAgKiBAcGFyYW0geyp9IGluTGlzdFxuICAgKiBAcGFyYW0ge0FycmF5PCo+fSBsaXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vbmVPZiA9IGZ1bmN0aW9uIChpbkxpc3QsIGxpc3QsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oaW5MaXN0LCBtc2csIGFzc2VydC5vbmVPZiwgdHJ1ZSkudG8uYmUub25lT2YobGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5jaGFuZ2VzKGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDIyIH07XG4gICAqICAgICBhc3NlcnQuY2hhbmdlcyhmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGNoYW5nZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jaGFuZ2VzID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1zZyA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5jaGFuZ2VzLCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKTtcbiAgfVxuXG4gICAvKipcbiAgICogIyMjIC5jaGFuZ2VzQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgYnkgYW4gYW1vdW50IChkZWx0YSkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCArPSAyIH07XG4gICAqICAgICBhc3NlcnQuY2hhbmdlc0J5KGZuLCBvYmosICd2YWwnLCAyKTtcbiAgICpcbiAgICogQG5hbWUgY2hhbmdlc0J5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jaGFuZ2VzQnkgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0bXBNc2cgPSBkZWx0YTtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIG1zZyA9IHRtcE1zZztcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmNoYW5nZXNCeSwgdHJ1ZSlcbiAgICAgIC50by5jaGFuZ2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG4gIH1cblxuICAgLyoqXG4gICAqICMjIyAuZG9lc05vdENoYW5nZShmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ZvbycpOyB9O1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RDaGFuZ2UoZm4sIG9iaiwgJ3ZhbCcpO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90Q2hhbmdlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdENoYW5nZSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3RDaGFuZ2UsIHRydWUpXG4gICAgICAudG8ubm90LmNoYW5nZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuY2hhbmdlc0J1dE5vdEJ5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb3Igb2YgYSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBieSBhbiBhbW91bnQgKGRlbHRhKVxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgKz0gMTAgfTtcbiAgICogICAgIGFzc2VydC5jaGFuZ2VzQnV0Tm90QnkoZm4sIG9iaiwgJ3ZhbCcsIDUpO1xuICAgKlxuICAgKiBAbmFtZSBjaGFuZ2VzQnV0Tm90QnlcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge051bWJlcn0gY2hhbmdlIGFtb3VudCAoZGVsdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmNoYW5nZXNCdXROb3RCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J1dE5vdEJ5LCB0cnVlKVxuICAgICAgLnRvLmNoYW5nZShvYmosIHByb3ApLmJ1dC5ub3QuYnkoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jcmVhc2VzKGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGluY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5LlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgPSAxMyB9O1xuICAgKiAgICAgYXNzZXJ0LmluY3JlYXNlcyhmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGluY3JlYXNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY3JlYXNlcyA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmluY3JlYXNlcywgdHJ1ZSlcbiAgICAgIC50by5pbmNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jcmVhc2VzQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGluY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCArPSAxMCB9O1xuICAgKiAgICAgYXNzZXJ0LmluY3JlYXNlc0J5KGZuLCBvYmosICd2YWwnLCAxMCk7XG4gICAqXG4gICAqIEBuYW1lIGluY3JlYXNlc0J5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNyZWFzZXNCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnksIHRydWUpXG4gICAgICAudG8uaW5jcmVhc2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90SW5jcmVhc2UoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgaW5jcmVhc2UgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eS5cbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gOCB9O1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RJbmNyZWFzZShmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGRvZXNOb3RJbmNyZWFzZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RJbmNyZWFzZSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3RJbmNyZWFzZSwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaW5jcmVhc2Uob2JqLCBwcm9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY3JlYXNlc0J1dE5vdEJ5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBpbmNyZWFzZSBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGJ5IGFuIGFtb3VudCAoZGVsdGEpLlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgPSAxNSB9O1xuICAgKiAgICAgYXNzZXJ0LmluY3JlYXNlc0J1dE5vdEJ5KGZuLCBvYmosICd2YWwnLCAxMCk7XG4gICAqXG4gICAqIEBuYW1lIGluY3JlYXNlc0J1dE5vdEJ5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnksIHRydWUpXG4gICAgICAudG8uaW5jcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmRlY3JlYXNlcyhmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkZWNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eS5cbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRlY3JlYXNlcyhmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlY3JlYXNlcyA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlcywgdHJ1ZSlcbiAgICAgIC50by5kZWNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZGVjcmVhc2VzQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsIC09IDUgfTtcbiAgICogICAgIGFzc2VydC5kZWNyZWFzZXNCeShmbiwgb2JqLCAndmFsJywgNSk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc0J5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWNyZWFzZXNCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZGVjcmVhc2VzQnksIHRydWUpXG4gICAgICAudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90RGVjcmVhc2UoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgZGVjcmVhc2VzIGEgbnVtZXJpYyBvYmplY3QgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDE1IH07XG4gICAqICAgICBhc3NlcnQuZG9lc05vdERlY3JlYXNlKGZuLCBvYmosICd2YWwnKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdERlY3JlYXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdERlY3JlYXNlID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1zZyA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdERlY3JlYXNlLCB0cnVlKVxuICAgICAgLnRvLm5vdC5kZWNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdERlY3JlYXNlQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRvZXMgbm90IGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5KGZuLCBvYmosICd2YWwnLCAxKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdERlY3JlYXNlQnlcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge051bWJlcn0gY2hhbmdlIGFtb3VudCAoZGVsdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5ID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdG1wTXNnID0gZGVsdGE7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBtc2cgPSB0bXBNc2c7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdERlY3JlYXNlQnksIHRydWUpXG4gICAgICAudG8ubm90LmRlY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZGVjcmVhc2VzQnV0Tm90QnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRvZXMgbm90IGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRlY3JlYXNlc0J1dE5vdEJ5KGZuLCBvYmosICd2YWwnLCAxKTtcbiAgICpcbiAgICogQG5hbWUgZGVjcmVhc2VzQnV0Tm90QnlcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge051bWJlcn0gY2hhbmdlIGFtb3VudCAoZGVsdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlY3JlYXNlc0J1dE5vdEJ5ID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdG1wTXNnID0gZGVsdGE7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBtc2cgPSB0bXBNc2c7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSwgdHJ1ZSlcbiAgICAgIC50by5kZWNyZWFzZShvYmosIHByb3ApLmJ1dC5ub3QuYnkoZGVsdGEpO1xuICB9XG5cbiAgLyohXG4gICAqICMjIyAuaWZFcnJvcihvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgaWYgdmFsdWUgaXMgbm90IGEgZmFsc2UgdmFsdWUsIGFuZCB0aHJvd3MgaWYgaXQgaXMgYSB0cnVlIHZhbHVlLlxuICAgKiBUaGlzIGlzIGFkZGVkIHRvIGFsbG93IGZvciBjaGFpIHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgTm9kZSdzXG4gICAqIGFzc2VydCBjbGFzcy5cbiAgICpcbiAgICogICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0kgYW0gYSBjdXN0b20gZXJyb3InKTtcbiAgICogICAgIGFzc2VydC5pZkVycm9yKGVycik7IC8vIFJldGhyb3dzIGVyciFcbiAgICpcbiAgICogQG5hbWUgaWZFcnJvclxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRocm93KHZhbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzRXh0ZW5zaWJsZShvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBleHRlbnNpYmxlIChjYW4gaGF2ZSBuZXcgcHJvcGVydGllcyBhZGRlZCB0byBpdCkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNFeHRlbnNpYmxlKHt9KTtcbiAgICpcbiAgICogQG5hbWUgaXNFeHRlbnNpYmxlXG4gICAqIEBhbGlhcyBleHRlbnNpYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNFeHRlbnNpYmxlID0gZnVuY3Rpb24gKG9iaiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzRXh0ZW5zaWJsZSwgdHJ1ZSkudG8uYmUuZXh0ZW5zaWJsZTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEV4dGVuc2libGUob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgX25vdF8gZXh0ZW5zaWJsZS5cbiAgICpcbiAgICogICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KTtcbiAgICogICAgIHZhciBzZWFsZWRPYmplY3QgPSBPYmplY3Quc2VhbCh7fSk7XG4gICAqICAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3RFeHRlbnNpYmxlKG5vbkV4dGVuc2libGVPYmplY3QpO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZShzZWFsZWRPYmplY3QpO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZShmcm96ZW5PYmplY3QpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdEV4dGVuc2libGVcbiAgICogQGFsaWFzIG5vdEV4dGVuc2libGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdEV4dGVuc2libGUgPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RFeHRlbnNpYmxlLCB0cnVlKS50by5ub3QuYmUuZXh0ZW5zaWJsZTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc1NlYWxlZChvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBzZWFsZWQgKGNhbm5vdCBoYXZlIG5ldyBwcm9wZXJ0aWVzIGFkZGVkIHRvIGl0XG4gICAqIGFuZCBpdHMgZXhpc3RpbmcgcHJvcGVydGllcyBjYW5ub3QgYmUgcmVtb3ZlZCkuXG4gICAqXG4gICAqICAgICB2YXIgc2VhbGVkT2JqZWN0ID0gT2JqZWN0LnNlYWwoe30pO1xuICAgKiAgICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5zZWFsKHt9KTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pc1NlYWxlZChzZWFsZWRPYmplY3QpO1xuICAgKiAgICAgYXNzZXJ0LmlzU2VhbGVkKGZyb3plbk9iamVjdCk7XG4gICAqXG4gICAqIEBuYW1lIGlzU2VhbGVkXG4gICAqIEBhbGlhcyBzZWFsZWRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc1NlYWxlZCA9IGZ1bmN0aW9uIChvYmosIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc1NlYWxlZCwgdHJ1ZSkudG8uYmUuc2VhbGVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTm90U2VhbGVkKG9iamVjdClcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGlzIF9ub3RfIHNlYWxlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc05vdFNlYWxlZCh7fSk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90U2VhbGVkXG4gICAqIEBhbGlhcyBub3RTZWFsZWRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdFNlYWxlZCA9IGZ1bmN0aW9uIChvYmosIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdFNlYWxlZCwgdHJ1ZSkudG8ubm90LmJlLnNlYWxlZDtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0Zyb3plbihvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBmcm96ZW4gKGNhbm5vdCBoYXZlIG5ldyBwcm9wZXJ0aWVzIGFkZGVkIHRvIGl0XG4gICAqIGFuZCBpdHMgZXhpc3RpbmcgcHJvcGVydGllcyBjYW5ub3QgYmUgbW9kaWZpZWQpLlxuICAgKlxuICAgKiAgICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgKiAgICAgYXNzZXJ0LmZyb3plbihmcm96ZW5PYmplY3QpO1xuICAgKlxuICAgKiBAbmFtZSBpc0Zyb3plblxuICAgKiBAYWxpYXMgZnJvemVuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNGcm96ZW4gPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNGcm96ZW4sIHRydWUpLnRvLmJlLmZyb3plbjtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEZyb3plbihvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBfbm90XyBmcm96ZW4uXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3RGcm96ZW4oe30pO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdEZyb3plblxuICAgKiBAYWxpYXMgbm90RnJvemVuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RGcm96ZW4gPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RGcm96ZW4sIHRydWUpLnRvLm5vdC5iZS5mcm96ZW47XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNFbXB0eSh0YXJnZXQpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGRvZXMgbm90IGNvbnRhaW4gYW55IHZhbHVlcy5cbiAgICogRm9yIGFycmF5cyBhbmQgc3RyaW5ncywgaXQgY2hlY2tzIHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eS5cbiAgICogRm9yIGBNYXBgIGFuZCBgU2V0YCBpbnN0YW5jZXMsIGl0IGNoZWNrcyB0aGUgYHNpemVgIHByb3BlcnR5LlxuICAgKiBGb3Igbm9uLWZ1bmN0aW9uIG9iamVjdHMsIGl0IGdldHMgdGhlIGNvdW50IG9mIG93blxuICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzRW1wdHkoW10pO1xuICAgKiAgICAgYXNzZXJ0LmlzRW1wdHkoJycpO1xuICAgKiAgICAgYXNzZXJ0LmlzRW1wdHkobmV3IE1hcCk7XG4gICAqICAgICBhc3NlcnQuaXNFbXB0eSh7fSk7XG4gICAqXG4gICAqIEBuYW1lIGlzRW1wdHlcbiAgICogQGFsaWFzIGVtcHR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ3xNYXB8U2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRW1wdHksIHRydWUpLnRvLmJlLmVtcHR5O1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTm90RW1wdHkodGFyZ2V0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBjb250YWlucyB2YWx1ZXMuXG4gICAqIEZvciBhcnJheXMgYW5kIHN0cmluZ3MsIGl0IGNoZWNrcyB0aGUgYGxlbmd0aGAgcHJvcGVydHkuXG4gICAqIEZvciBgTWFwYCBhbmQgYFNldGAgaW5zdGFuY2VzLCBpdCBjaGVja3MgdGhlIGBzaXplYCBwcm9wZXJ0eS5cbiAgICogRm9yIG5vbi1mdW5jdGlvbiBvYmplY3RzLCBpdCBnZXRzIHRoZSBjb3VudCBvZiBvd25cbiAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc05vdEVtcHR5KFsxLCAyXSk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RFbXB0eSgnMzQnKTtcbiAgICogICAgIGFzc2VydC5pc05vdEVtcHR5KG5ldyBTZXQoWzUsIDZdKSk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RFbXB0eSh7IGtleTogNyB9KTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RFbXB0eVxuICAgKiBAYWxpYXMgbm90RW1wdHlcbiAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl8U3RyaW5nfE1hcHxTZXR9IHRhcmdldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdEVtcHR5ID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RFbXB0eSwgdHJ1ZSkudG8ubm90LmJlLmVtcHR5O1xuICB9O1xuXG4gIC8qIVxuICAgKiBBbGlhc2VzLlxuICAgKi9cblxuICAoZnVuY3Rpb24gYWxpYXMobmFtZSwgYXMpe1xuICAgIGFzc2VydFthc10gPSBhc3NlcnRbbmFtZV07XG4gICAgcmV0dXJuIGFsaWFzO1xuICB9KVxuICAoJ2lzT2snLCAnb2snKVxuICAoJ2lzTm90T2snLCAnbm90T2snKVxuICAoJ3Rocm93cycsICd0aHJvdycpXG4gICgndGhyb3dzJywgJ1Rocm93JylcbiAgKCdpc0V4dGVuc2libGUnLCAnZXh0ZW5zaWJsZScpXG4gICgnaXNOb3RFeHRlbnNpYmxlJywgJ25vdEV4dGVuc2libGUnKVxuICAoJ2lzU2VhbGVkJywgJ3NlYWxlZCcpXG4gICgnaXNOb3RTZWFsZWQnLCAnbm90U2VhbGVkJylcbiAgKCdpc0Zyb3plbicsICdmcm96ZW4nKVxuICAoJ2lzTm90RnJvemVuJywgJ25vdEZyb3plbicpXG4gICgnaXNFbXB0eScsICdlbXB0eScpXG4gICgnaXNOb3RFbXB0eScsICdub3RFbXB0eScpO1xufTtcbiIsICIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgdXNlZCA9IFtdO1xuXG4vKiFcbiAqIENoYWkgdmVyc2lvblxuICovXG5cbmV4cG9ydHMudmVyc2lvbiA9ICc0LjMuMyc7XG5cbi8qIVxuICogQXNzZXJ0aW9uIEVycm9yXG4gKi9cblxuZXhwb3J0cy5Bc3NlcnRpb25FcnJvciA9IHJlcXVpcmUoJ2Fzc2VydGlvbi1lcnJvcicpO1xuXG4vKiFcbiAqIFV0aWxzIGZvciBwbHVnaW5zIChub3QgZXhwb3J0ZWQpXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL2NoYWkvdXRpbHMnKTtcblxuLyoqXG4gKiAjIC51c2UoZnVuY3Rpb24pXG4gKlxuICogUHJvdmlkZXMgYSB3YXkgdG8gZXh0ZW5kIHRoZSBpbnRlcm5hbHMgb2YgQ2hhaS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICogQHJldHVybnMge3RoaXN9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnVzZSA9IGZ1bmN0aW9uIChmbikge1xuICBpZiAoIX51c2VkLmluZGV4T2YoZm4pKSB7XG4gICAgZm4oZXhwb3J0cywgdXRpbCk7XG4gICAgdXNlZC5wdXNoKGZuKTtcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzO1xufTtcblxuLyohXG4gKiBVdGlsaXR5IEZ1bmN0aW9uc1xuICovXG5cbmV4cG9ydHMudXRpbCA9IHV0aWw7XG5cbi8qIVxuICogQ29uZmlndXJhdGlvblxuICovXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NoYWkvY29uZmlnJyk7XG5leHBvcnRzLmNvbmZpZyA9IGNvbmZpZztcblxuLyohXG4gKiBQcmltYXJ5IGBBc3NlcnRpb25gIHByb3RvdHlwZVxuICovXG5cbnZhciBhc3NlcnRpb24gPSByZXF1aXJlKCcuL2NoYWkvYXNzZXJ0aW9uJyk7XG5leHBvcnRzLnVzZShhc3NlcnRpb24pO1xuXG4vKiFcbiAqIENvcmUgQXNzZXJ0aW9uc1xuICovXG5cbnZhciBjb3JlID0gcmVxdWlyZSgnLi9jaGFpL2NvcmUvYXNzZXJ0aW9ucycpO1xuZXhwb3J0cy51c2UoY29yZSk7XG5cbi8qIVxuICogRXhwZWN0IGludGVyZmFjZVxuICovXG5cbnZhciBleHBlY3QgPSByZXF1aXJlKCcuL2NoYWkvaW50ZXJmYWNlL2V4cGVjdCcpO1xuZXhwb3J0cy51c2UoZXhwZWN0KTtcblxuLyohXG4gKiBTaG91bGQgaW50ZXJmYWNlXG4gKi9cblxudmFyIHNob3VsZCA9IHJlcXVpcmUoJy4vY2hhaS9pbnRlcmZhY2Uvc2hvdWxkJyk7XG5leHBvcnRzLnVzZShzaG91bGQpO1xuXG4vKiFcbiAqIEFzc2VydCBpbnRlcmZhY2VcbiAqL1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnLi9jaGFpL2ludGVyZmFjZS9hc3NlcnQnKTtcbmV4cG9ydHMudXNlKGFzc2VydCk7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9jaGFpJyk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5leHBvcnQge0Jhc2V9XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmcm9tIHdoaWNoIGFsbCBtb25zdGVyIGNsYXNzZXMgYXJlIGRlcml2ZWQuXG4gKlxuICogVGhlIGNsYXNzIHdhcyBmb3JtZXJseSBjYWxsZWQgT2JqZWN0LlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuY2xhc3MgQmFzZSBleHRlbmRzIE9iamVjdCB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICB9O1xuXG5cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmV4cG9ydCB7aXNJdGVyYWJsZSwgaXNQcmltaXRpdmUsIGlzU3ltYm9sLCBpc0Jvb2xlYW4sIGlzU3RyaW5nLCBpc09iamVjdCwgaXNJbnN0YW5jZSwgaXNBcnJheSwgaXNGdW5jdGlvbiwgaXNJbnRlZ2VyfVxuXG4vKipcbiAqIFdpdGggdGhpcyBmdW5jdGlvbiB5b3UgY2FuIGNoZWNrIGlmIGEgdmFsdWUgaXMgaXRlcmFibGUuXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogWW91IGNhbiBjYWxsIHRoZSBtZXRob2QgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5UeXBlcy5pc1ByaW1pdGl2ZSgpYC5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvaXMtMS5tanNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBwcmltaXRpdmUgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBOYU4sIHVuZGVmaW5lZCwgbnVsbCBvciBzeW1ib2wpXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL3R5cGVzL2lzLTIubWpzXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHtcbiAgICB2YXIgdHlwZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgcGFzc2VkIGlzIGEgc3ltYm9sXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL3R5cGVzL2lzLTMubWpzXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgICByZXR1cm4gKCdzeW1ib2wnID09PSB0eXBlb2YgdmFsdWUpID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBib29sZWFuLlxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy00Lm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuXG4gICAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIHBhc3NlZCBpcyBhIHN0cmluZ1xuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy01Lm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBvYmplY3RcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBsaWJyYXJ5IHRvIGhhdmUgY29uc2lzdGVudCBuYW1lcy5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvaXMtNi5tanNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuXG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYSBvYmplY3QgYW5kIGluc3RhbmNlIG9mIGluc3RhbmNlLlxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIGxpYnJhcnkgdG8gaGF2ZSBjb25zaXN0ZW50IG5hbWVzLlxuICogXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvaXMtNy5tanNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7Kn0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5mdW5jdGlvbiBpc0luc3RhbmNlKHZhbHVlLCBpbnN0YW5jZSkge1xuICAgIGlmICghaXNPYmplY3QodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGluc3RhbmNlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghaW5zdGFuY2UuaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIGluc3RhbmNlKSA/IHRydWUgOiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgcGFzc2VkIGlzIGEgYXJyYXlcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBsaWJyYXJ5IHRvIGhhdmUgY29uc2lzdGVudCBuYW1lcy5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvaXMtOC5tanNcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5XG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIHBhc3NlZCBpcyBhIGZ1bmN0aW9uXG4gKlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiB0aGUgbGlicmFyeSB0byBoYXZlIGNvbnNpc3RlbnQgbmFtZXMuXG4gKiBcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9pcy05Lm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcblxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB2YWx1ZSBwYXNzZWQgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIHRoZSBsaWJyYXJ5IHRvIGhhdmUgY29uc2lzdGVudCBuYW1lcy5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvaXMtMTAubWpzXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xufVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge1xuICAgIGlzQXJyYXksXG4gICAgaXNCb29sZWFuLFxuICAgIGlzRnVuY3Rpb24sXG4gICAgaXNJbnN0YW5jZSxcbiAgICBpc0ludGVnZXIsXG4gICAgaXNJdGVyYWJsZSxcbiAgICBpc09iamVjdCxcbiAgICBpc1ByaW1pdGl2ZSxcbiAgICBpc1N0cmluZyxcbiAgICBpc1N5bWJvbFxufSBmcm9tICcuL2lzLm1qcyc7XG5cbmV4cG9ydCB7XG4gICAgdmFsaWRhdGVJdGVyYWJsZSxcbiAgICB2YWxpZGF0ZVByaW1pdGl2ZSxcbiAgICB2YWxpZGF0ZUJvb2xlYW4sXG4gICAgdmFsaWRhdGVTdHJpbmcsXG4gICAgdmFsaWRhdGVPYmplY3QsXG4gICAgdmFsaWRhdGVJbnN0YW5jZSxcbiAgICB2YWxpZGF0ZUFycmF5LFxuICAgIHZhbGlkYXRlU3ltYm9sLFxuICAgIHZhbGlkYXRlRnVuY3Rpb24sXG4gICAgdmFsaWRhdGVJbnRlZ2VyXG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIHByaW1pdGl2ZSB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc1ByaW1pdGl2ZSgpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZUl0ZXJhYmxlfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVJdGVyYWJsZSgnMicpKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogY29uc29sZS5sb2codmFsaWRhdGVJdGVyYWJsZShbXSkpICAvLyBcdTIxQTYgdmFsdWVcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgcHJpbWl0aXZlXG4gKiBAc2VlIHtAbGluayBpc1ByaW1pdGl2ZX1cbiAqIEBzZWUge0BsaW5rIE1vbnN0ZXIuVHlwZXMuaXNQcmltaXRpdmV9XG4gKiBAc2VlIHtAbGluayBNb25zdGVyLlR5cGVzI2lzUHJpbWl0aXZlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUl0ZXJhYmxlKHZhbHVlKSB7XG4gICAgaWYgKCFpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgaXRlcmFibGUnKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgbWF0Y2hlcyB0aGUgcHJpbWl0aXZlIHR5cGUuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzUHJpbWl0aXZlKCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlUHJpbWl0aXZlfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVQcmltaXRpdmUoJzInKSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVQcmltaXRpdmUoW10pKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBwcmltaXRpdmVcbiAqIEBzZWUge0BsaW5rIGlzUHJpbWl0aXZlfVxuICogQHNlZSB7QGxpbmsgTW9uc3Rlci5UeXBlcy5pc1ByaW1pdGl2ZX1cbiAqIEBzZWUge0BsaW5rIE1vbnN0ZXIuVHlwZXMjaXNQcmltaXRpdmV9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgaWYgKCFpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGEgcHJpbWl0aXZlJylcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIGJvb2xlYW4gdHlwZS4gdGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXNCb29sZWFuKCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlQm9vbGVhbn0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlQm9vbGVhbihmYWxzZSkpICAvLyBcdTIxQTYgdmFsdWVcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlQm9vbGVhbignMicpKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogY29uc29sZS5sb2codmFsaWRhdGVCb29sZWFuKFtdKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcblxuICogQHRocm93cyB7VHlwZUVycm9yfSAgdmFsdWUgaXMgbm90IHByaW1pdGl2ZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJvb2xlYW4odmFsdWUpIHtcbiAgICBpZiAoIWlzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGEgYm9vbGVhbicpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdHlwZSBtYXRjaGVzIHRoZSBzdHJpbmcgdHlwZS4gdGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXNTdHJpbmcoKSBleGNlcHQgdGhhdCBhIFR5cGVFcnJvciBpcyB0aHJvd24uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZVN0cmluZygnMicpKSAgLy8gXHUyMUE2IHZhbHVlXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZVN0cmluZyhbXSkpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyh2YWx1ZSkge1xuICAgIGlmICghaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbHVlIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuXG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIG9iamVjdCB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc09iamVjdCgpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlT2JqZWN0KHt9KSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogY29uc29sZS5sb2codmFsaWRhdGVPYmplY3QoJzInKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlT2JqZWN0KFtdKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KHZhbHVlKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGEgb2JqZWN0JylcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIG9iamVjdCBpbnN0YW5jZS5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanMnO1xuICogY29uc29sZS5sb2codmFsaWRhdGVJbnN0YW5jZSh7fSwgT2JqZWN0KSkgLy8gXHUyMUE2IHZhbHVlXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUluc3RhbmNlKCcyJywgT2JqZWN0KSkgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogY29uc29sZS5sb2codmFsaWRhdGVJbnN0YW5jZShbXSwgT2JqZWN0KSkgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVJbnN0YW5jZSh2YWx1ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoIWlzSW5zdGFuY2UodmFsdWUsIGluc3RhbmNlKSkge1xuICAgICAgICBsZXQgbiA9IFwiXCI7XG4gICAgICAgIGlmIChpc09iamVjdChpbnN0YW5jZSkgfHwgaXNGdW5jdGlvbihpbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIG4gPSBpbnN0YW5jZT8uWyduYW1lJ11cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICBuID0gXCIgXCIgKyBuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mJyArIG4pXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdHlwZSBtYXRjaGVzIHRoZSBhcnJheSB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc0FycmF5KCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlQXJyYXl9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUFycmF5KCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUFycmF5KFtdKSkgIC8vIFx1MjFBNiB2YWx1ZVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gYXJyYXlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBcnJheSh2YWx1ZSkge1xuICAgIGlmICghaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGFuIGFycmF5JylcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIHN5bWJvbCB0eXBlLiB0aGlzIGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byBpc1N5bWJvbCgpIGV4Y2VwdCB0aGF0IGEgVHlwZUVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHt2YWxpZGF0ZVN5bWJvbH0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlU3ltYm9sKCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZVN5bWJvbCgpKSAgLy8gXHUyMUE2IHZhbHVlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBzeW1ib2xcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTeW1ib2wodmFsdWUpIHtcbiAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgYW4gc3ltYm9sJylcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0eXBlIG1hdGNoZXMgdGhlIGZ1bmN0aW9uIHR5cGUuIHRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIGlzRnVuY3Rpb24oKSBleGNlcHQgdGhhdCBhIFR5cGVFcnJvciBpcyB0aHJvd24uXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7dmFsaWRhdGVGdW5jdGlvbn0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzJztcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlRnVuY3Rpb24oKCk9Pnt9KSkgLy8gXHUyMUE2IHZhbHVlXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUZ1bmN0aW9uKCcyJykpICAvLyBcdTIxQTYgVHlwZUVycm9yXG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUZ1bmN0aW9uKFtdKSkgIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7Kn1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICghaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsdWUgaXMgbm90IGEgZnVuY3Rpb24nKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4gdGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaXNJbnRlZ2VyKCkgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3ZhbGlkYXRlRnVuY3Rpb259IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG4gKiBjb25zb2xlLmxvZyh2YWxpZGF0ZUludGVnZXIodHJ1ZSkpIC8vIFx1MjFBNiBUeXBlRXJyb3JcbiAqIGNvbnNvbGUubG9nKHZhbGlkYXRlSW50ZWdlcignMicpKSAgLy8gXHUyMUE2IFR5cGVFcnJvclxuICogY29uc29sZS5sb2codmFsaWRhdGVJbnRlZ2VyKDIpKSAgLy8gXHUyMUE2IHZhbHVlXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm4geyp9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlSW50ZWdlcih2YWx1ZSkge1xuICAgIGlmICghaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgYW4gaW50ZWdlcicpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxufVxuIiwgIlxuXG4vKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cblxuaW1wb3J0IHt2YWxpZGF0ZUZ1bmN0aW9uLCB2YWxpZGF0ZU9iamVjdCwgdmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge2dldEdsb2JhbCwgZ2V0R2xvYmFsT2JqZWN0LCBnZXRHbG9iYWxGdW5jdGlvbn1cblxuLyoqXG4gKiBAdHlwZSB7b2JqZWN9XG4gKiBAcHJpdmF0ZVxuICovXG5sZXQgZ2xvYmFsUmVmZXJlbmNlO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQuXG4gKi9cbihmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGdsb2JhbFJlZmVyZW5jZSA9IGdsb2JhbFRoaXM7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGdsb2JhbFJlZmVyZW5jZSA9IHNlbGY7XG4gICAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGdsb2JhbFJlZmVyZW5jZSA9IHdpbmRvdztcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QucHJvdG90eXBlLCAnX19tb25zdGVyX18nLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGVvZiBfX21vbnN0ZXJfXyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgX19tb25zdGVyX18uZ2xvYmFsVGhpcyA9IF9fbW9uc3Rlcl9fO1xuICAgICAgICBkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX21vbnN0ZXJfXztcblxuICAgICAgICBnbG9iYWxSZWZlcmVuY2UgPSBnbG9iYWxUaGlzO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgZ2xvYmFsUmVmZXJlbmNlID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiAgICB9IGNhdGNoIChlKSB7XG5cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBlbnZpcm9ubWVudC5cIilcblxuXG59KCkpO1xuXG4vKipcbiAqIFJldHVybiBnbG9iYWxUaGlzXG4gKlxuICogSWYgZ2xvYmFsVGhpcyBpcyBub3QgYXZhaWxhYmxlLCBpdCB3aWxsIGJlIHBvbHlmaWxsZWRcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjYuMFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEByZXR1cm5zIHtvYmplY30gZ2xvYmFsVGhpc1xuICovXG5mdW5jdGlvbiBnZXRHbG9iYWwoKSB7XG4gICAgcmV0dXJuIGdsb2JhbFJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gZ2xvYmFsIG9iamVjdCBvciB0aHJvdyBFcnJvclxuICpcbiAqIFlvdSBjYW4gY2FsbCB0aGUgbWV0aG9kIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYE1vbnN0ZXIuVHlwZXMuZ2V0R2xvYmFsT2JqZWN0KClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge01vbnN0ZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckAxLjMwLjAvZGlzdC9tb25zdGVyLm1qcyc7XG4gKiBNb25zdGVyLlR5cGVzLmdldEdsb2JhbE9iamVjdCgnZG9jdW1lbnQnKVxuICogLy8gXHUyMUE2IHsgfVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gaW50ZWdyYXRlIHRoaXMgZnVuY3Rpb24gaW5kaXZpZHVhbGx5LlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac2NodWthaS9tb25zdGVyQDEuMzAuMC9kaXN0L21vZHVsZXMvdHlwZXMvZ2xvYmFsLm1qcyc7XG4gKiBnZXRHbG9iYWxPYmplY3QoJ2RvY3VtZW50JylcbiAqIC8vIFx1MjFBNiB7IH1cbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge29iamVjfVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBvYmplY3QgaXMgbm90IGRlZmluZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRHbG9iYWxPYmplY3QobmFtZSkge1xuICAgIHZhbGlkYXRlU3RyaW5nKG5hbWUpO1xuICAgIGxldCBvID0gZ2xvYmFsUmVmZXJlbmNlPy5bbmFtZV07XG4gICAgaWYgKHR5cGVvZiBvID09PSAndW5kZWZpbmVkJykgdGhyb3cgbmV3IEVycm9yKCd0aGUgb2JqZWN0ICcgKyBuYW1lICsgJyBpcyBub3QgZGVmaW5lZCcpO1xuICAgIHZhbGlkYXRlT2JqZWN0KG8pO1xuICAgIHJldHVybiBvO1xufVxuXG4vKipcbiAqIFJldHVybiBnbG9iYWwgZnVuY3Rpb24gb3IgdGhyb3cgRXJyb3JcbiAqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIG1ldGhvZCB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLlR5cGVzLmdldEdsb2JhbEZ1bmN0aW9uKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge01vbnN0ZXJ9IGZyb20gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckAxLjMwLjAvZGlzdC9tb25zdGVyLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhNb25zdGVyLlR5cGVzLmdldEdsb2JhbEZ1bmN0aW9uKCdwYXJzZUludCcpKSAvLyBcdTIxQTYgZiBwYXJzZUludCgpIHsgfVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gaW50ZWdyYXRlIHRoaXMgZnVuY3Rpb24gaW5kaXZpZHVhbGx5LlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge2dldEdsb2JhbEZ1bmN0aW9ufSBmcm9tICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BzY2h1a2FpL21vbnN0ZXJAMS4zMC4wL2Rpc3QvbW9kdWxlcy90eXBlcy9nbG9iYWwubWpzJztcbiAqIGNvbnNvbGUubG9nKGdldEdsb2JhbEZ1bmN0aW9uKCdwYXJzZUludCcpKSAvLyBcdTIxQTYgZiBwYXJzZUludCgpIHsgfVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjYuMFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtvYmplY31cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgZnVuY3Rpb24gaXMgbm90IGRlZmluZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldEdsb2JhbEZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YWxpZGF0ZVN0cmluZyhuYW1lKTtcbiAgICBsZXQgZiA9IGdsb2JhbFJlZmVyZW5jZT8uW25hbWVdO1xuICAgIGlmICh0eXBlb2YgZiA9PT0gJ3VuZGVmaW5lZCcpIHRocm93IG5ldyBFcnJvcigndGhlIGZ1bmN0aW9uICcgKyBuYW1lICsgJyBpcyBub3QgZGVmaW5lZCcpO1xuICAgIHZhbGlkYXRlRnVuY3Rpb24oZik7XG4gICAgcmV0dXJuIGY7XG59XG5cblxuXG5cbiIsICIvKipcbiAqIFByb3BlcnR5LUtleXNcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKi9cblxuZXhwb3J0IHtcbiAgICBpbnRlcm5hbFN5bWJvbCxcbiAgICBpbnRlcm5hbFN0YXRlU3ltYm9sXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKiBAbWVtYmVyT2YgTW9uc3RlclxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNC4wXG4gKi9cbmNvbnN0IGludGVybmFsU3ltYm9sID0gU3ltYm9sKCdpbnRlcm5hbERhdGEnKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBtZW1iZXJPZiBNb25zdGVyXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgaW50ZXJuYWxTdGF0ZVN5bWJvbCA9IFN5bWJvbCgnc3RhdGUnKTtcblxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuZXhwb3J0IHt0eXBlT2Z9XG5cbi8qKlxuICogVGhlIGJ1aWx0LWluIHR5cGVvZiBtZXRob2QgaXMga25vd24gdG8gaGF2ZSBzb21lIGhpc3RvcmljYWwgd2Vha25lc3Nlcy4gVGhpcyBmdW5jdGlvbiB0cmllcyB0byBwcm92aWRlIGEgYmV0dGVyIGFuZCBtb3JlIGFjY3VyYXRlIHJlc3VsdC5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvdHlwZW9mLm1qc1xuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBwcmltaXRpdmVcbiAqL1xuZnVuY3Rpb24gdHlwZU9mKHZhbHVlKSB7XG4gICAgbGV0IHR5cGUgPSAoe30pLnRvU3RyaW5nLmNhbGwodmFsdWUpLm1hdGNoKC9cXHMoW2EtekEtWl0rKS8pWzFdO1xuICAgIGlmICgnT2JqZWN0JyA9PT0gdHlwZSkge1xuXG4gICAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSAoL14oY2xhc3N8ZnVuY3Rpb24pXFxzKyhcXHcrKS8pLmV4ZWModmFsdWUuY29uc3RydWN0b3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHR5cGUgPSAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDIpID8gcmVzdWx0c1syXSA6ICcnO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlLnRvTG93ZXJDYXNlKCk7XG59XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aXNBcnJheSwgaXNPYmplY3R9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7dHlwZU9mfSBmcm9tIFwiLi4vdHlwZXMvdHlwZW9mLm1qc1wiO1xuXG5leHBvcnQge2V4dGVuZH1cblxuLyoqXG4gKiBFeHRlbmQgY29waWVzIGFsbCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yXG4gKiBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdC4gSXQgcmV0dXJucyB0aGUgbW9kaWZpZWQgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge29iamVjdH1cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBhcmd1bWVudFxuICogQHRocm93cyB7RXJyb3J9IHR5cGUgbWlzbWF0Y2hcbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIGxldCBvLCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgYSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgICBpZiAoIShpc09iamVjdChhKSB8fCBpc0FycmF5KGEpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBhcmd1bWVudCAnICsgSlNPTi5zdHJpbmdpZnkoYSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbyA9IGE7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGsgaW4gYSkge1xuXG4gICAgICAgICAgICBsZXQgdiA9IGE/LltrXTtcblxuICAgICAgICAgICAgaWYgKHYgPT09IG8/LltrXSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKGlzT2JqZWN0KHYpJiZ0eXBlT2Yodik9PT0nb2JqZWN0JykgfHwgaXNBcnJheSh2KSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG9ba10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSh2KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb1trXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb1trXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVPZihvW2tdKSAhPT0gdHlwZU9mKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIG1pc21hdGNoOiBcIiArIEpTT04uc3RyaW5naWZ5KG9ba10pICsgXCIoXCIgKyB0eXBlT2Yob1trXSkgKyBcIikgIT0gXCIgKyBKU09OLnN0cmluZ2lmeSh2KSArIFwiKFwiICsgdHlwZU9mKHYpICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb1trXSA9IGV4dGVuZChvW2tdLCB2KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvW2tdID0gdjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG87XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4vYmFzZS5tanMnO1xuaW1wb3J0IHt2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7SUR9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbnRlZ2VyPn1cbiAqL1xubGV0IGludGVybmFsQ291bnRlciA9IG5ldyBNYXA7XG5cbi8qKlxuICogV2l0aCB0aGUgaWQgY2xhc3MsIHNlcXVlbmNlcyBvZiBpZHMgY2FuIGJlIGNyZWF0ZWQuIGZvciB0aGlzIHB1cnBvc2UsIGFuIGludGVybmFsIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggcHJlZml4LlxuICogdGh1cywgdGhlIGZpcnN0IGlkIHdpdGggdGhlIHByZWZpeCBgbXlpZGAgd2lsbCBiZSBgbXlpZDFgIGFuZCB0aGUgc2Vjb25kIGlkIGBteWlkMmAuXG4gKiBUaGUgaWRzIGFyZSB0aGUgc2FtZSBmb3IgZXZlcnkgY2FsbCwgZm9yIGV4YW1wbGUgb24gYSB3ZWIgcGFnZS5cbiAqXG4gKiBTbyB0aGUgaWRzIGNhbiBhbHNvIGJlIHVzZWQgZm9yIG5hdmlnYXRpb24uIHlvdSBqdXN0IGhhdmUgdG8gdGFrZSBjYXJlIHRoYXQgdGhlIG9yZGVyIHN0YXlzIHRoZSBzYW1lLlxuICpcbiAqIEFzIG9mIHZlcnNpb24gMS42LjAgdGhlcmUgaXMgdGhlIG5ldyBSYW5kb21JRC4gdGhpcyBJRCBjbGFzcyBpcyBjb250aW51b3VzIGZyb20gbm93IG9uLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzdW1tYXJ5IEF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGlkc1xuICovXG5jbGFzcyBJRCBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogY3JlYXRlIG5ldyBpZCB3aXRoIHByZWZpeFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByZWZpeCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcHJlZml4ID0gXCJpZFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocHJlZml4KTtcblxuICAgICAgICBpZiAoIWludGVybmFsQ291bnRlci5oYXMocHJlZml4KSkge1xuICAgICAgICAgICAgaW50ZXJuYWxDb3VudGVyLnNldChwcmVmaXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvdW50ID0gaW50ZXJuYWxDb3VudGVyLmdldChwcmVmaXgpO1xuICAgICAgICB0aGlzLmlkID0gcHJlZml4ICsgY291bnQ7XG5cbiAgICAgICAgaW50ZXJuYWxDb3VudGVyLnNldChwcmVmaXgsICsrY291bnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSAnLi4vdHlwZXMvZ2xvYmFsLm1qcyc7XG5pbXBvcnQge2lzQXJyYXksIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZX0gZnJvbSAnLi4vdHlwZXMvaXMubWpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tIFwiLi4vdHlwZXMvdHlwZW9mLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge2Nsb25lfVxuXG4vKipcbiAqIFdpdGggdGhpcyBmdW5jdGlvbiwgb2JqZWN0cyBjYW4gYmUgY2xvbmVkLlxuICogVGhlIGVudGlyZSBvYmplY3QgdHJlZSBpcyBydW4gdGhyb3VnaC5cbiAqXG4gKiBQcm94eSwgRWxlbWVudCwgSFRNTERvY3VtZW50IGFuZCBEb2N1bWVudEZyYWdtZW50IGluc3RhbmNlcyBhcmUgbm90IGNsb25lZC5cbiAqIEdsb2JhbCBvYmplY3RzIHN1Y2ggYXMgd2luZG93cyBhcmUgYWxzbyBub3QgY2xvbmVkLFxuICpcbiAqIElmIGFuIG9iamVjdCBoYXMgYSBtZXRob2QgYGdldENsb25lKClgLCB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xvbmUuXG4gKlxuICogQHBhcmFtIHsqfSBvYmogb2JqZWN0IHRvIGJlIGNsb25lZFxuICogQHJldHVybnMgeyp9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVXRpbFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bmFibGUgdG8gY2xvbmUgb2JqISBpdHMgdHlwZSBpc24ndCBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNsb25lKG9iaikge1xuXG4gICAgLy8gdHlwZW9mIG51bGwgcmVzdWx0cyBpbiAnb2JqZWN0Jy4gIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDEzLzEwL3R5cGVvZi1udWxsLmh0bWxcbiAgICBpZiAobnVsbCA9PT0gb2JqKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSB0d28gc2ltcGxlIHR5cGVzLCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgdHdvIHNpbXBsZSB0eXBlcywgbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBBcnJheVxuICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgbGV0IGNvcHkgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9iai5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29weVtpXSA9IGNsb25lKG9ialtpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qob2JqKSkge1xuXG5cbiAgICAgICAgLy8gSGFuZGxlIERhdGVcbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGxldCBjb3B5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGNvcHkuc2V0VGltZShvYmouZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIHJldHVybiBjb3B5O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIERvIG5vdCBjbG9uZSBET00gbm9kZXMgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogaW5zdGFuY2VvZiBFbGVtZW50KSByZXR1cm4gb2JqO1xuICAgICAgICBpZiAodHlwZW9mIEhUTUxEb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqIGluc3RhbmNlb2YgSFRNTERvY3VtZW50KSByZXR1cm4gb2JqO1xuICAgICAgICBpZiAodHlwZW9mIERvY3VtZW50RnJhZ21lbnQgIT09ICd1bmRlZmluZWQnICYmIG9iaiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHJldHVybiBvYmo7XG5cbiAgICAgICAgLyoqIERvIG5vdCBjbG9uZSBnbG9iYWwgb2JqZWN0cyAqL1xuICAgICAgICBpZiAob2JqID09PSBnZXRHbG9iYWwoKSkgcmV0dXJuIG9iajtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxDb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IGdsb2JhbENvbnRleHQpIHJldHVybiBvYmo7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IHdpbmRvdykgcmV0dXJuIG9iajtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBkb2N1bWVudCkgcmV0dXJuIG9iajtcbiAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gbmF2aWdhdG9yKSByZXR1cm4gb2JqO1xuICAgICAgICBpZiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gSlNPTikgcmV0dXJuIG9iajtcblxuICAgICAgICAvLyBIYW5kbGUgUHJveHktT2JqZWN0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB0cnkvY2F0Y2ggYmVjYXVzZSBwb3NzaWJsZTogVHlwZUVycm9yOiBGdW5jdGlvbiBoYXMgbm9uLW9iamVjdCBwcm90b3R5cGUgJ3VuZGVmaW5lZCcgaW4gaW5zdGFuY2VvZiBjaGVja1xuICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFByb3h5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb25lT2JqZWN0KG9iailcblxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBjbG9uZSBvYmohIGl0cyB0eXBlIGlzbid0IHN1cHBvcnRlZC5cIik7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbG9uZU9iamVjdChvYmopIHtcbiAgICBcbiAgICB2YWxpZGF0ZU9iamVjdChvYmopO1xuICAgIFxuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gb2JqPy5bJ2NvbnN0cnVjdG9yJ107XG5cbiAgICAvKiogT2JqZWN0IGhhcyBjbG9uZSBtZXRob2QgKi9cbiAgICBpZih0eXBlT2YoY29uc3RydWN0b3IpPT09J2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBwcm90b3R5cGUgPSBjb25zdHJ1Y3Rvcj8ucHJvdG90eXBlO1xuICAgICAgICBpZih0eXBlb2YgcHJvdG90eXBlPT09J29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmKHByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnZ2V0Q2xvbmUnKSYmIHR5cGVPZihvYmouZ2V0Q2xvbmUpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRDbG9uZSgpOyAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY29weSA9IHt9O1xuICAgIGlmICh0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBvYmouY29uc3RydWN0b3IuY2FsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb3B5ID0gbmV3IG9iai5jb25zdHJ1Y3RvcigpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcblxuICAgICAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb3B5W2tleV0gPSBjbG9uZShvYmpba2V5XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcHk7XG59XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi9iYXNlLm1qcyc7XG5cbmV4cG9ydCB7U3RhY2t9XG5cbi8qKlxuICogWW91IGNhbiBjYWxsIHRoZSBtZXRob2QgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgbmV3IE1vbnN0ZXIuVHlwZXMuUXVldWUoKWAuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS40LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5jbGFzcyBTdGFjayBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGxvb2tzIGF0IHRoZSBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsqfVxuICAgICAqL1xuICAgIHBlZWsoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGE/Llt0aGlzLmRhdGEubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMge1F1ZXVlfVxuICAgICAqL1xuICAgIHB1c2godmFsdWUpIHtcbiAgICAgICAgdGhpcy5kYXRhLnB1c2godmFsdWUpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhbGwgZW50cmllc1xuICAgICAqXG4gICAgICogQHJldHVybnMge1F1ZXVlfVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlcyB0aGUgb2JqZWN0IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjayBhbmQgcmV0dXJuc1xuICAgICAqIHRoYXQgb2JqZWN0IGFzIHRoZSB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uLiBpcyB0aGUgc3RhY2sgZW1wdHlcbiAgICAgKiB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgcG9wKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5wb3AoKTtcbiAgICB9XG5cblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge2lzQXJyYXksIGlzSW50ZWdlciwgaXNPYmplY3QsIGlzUHJpbWl0aXZlfSBmcm9tICcuLi90eXBlcy9pcy5tanMnO1xuaW1wb3J0IHtTdGFja30gZnJvbSBcIi4uL3R5cGVzL3N0YWNrLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUludGVnZXIsIHZhbGlkYXRlU3RyaW5nfSBmcm9tICcuLi90eXBlcy92YWxpZGF0ZS5tanMnO1xuXG5leHBvcnQge1BhdGhmaW5kZXIsIERFTElNSVRFUiwgV0lMRENBUkR9XG5cbi8qKlxuICogcGF0aCBzZXBhcmF0b3JcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgREVMSU1JVEVSID0gJy4nO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBXSUxEQ0FSRCA9ICcqJztcblxuLyoqXG4gKiBQYXRoZmluZGVyIGlzIGEgY2xhc3MgdG8gZmluZCBhIHBhdGggdG8gYW4gb2JqZWN0LlxuICpcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhlIHBhdGhmaW5kZXIsIHZhbHVlcyBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBmcm9tIGFuIG9iamVjdCBjb25zdHJ1Y3QuXG4gKlxuICogYGBgXG4gKiBuZXcgUGF0aGZpbmRlcih7XG4gKiBhOiB7XG4gKiAgICAgYjoge1xuICogICAgICAgICBmOiBbXG4gKiAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgZzogZmFsc2UsXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIF0sXG4gKiAgICAgfVxuICogfVxuICogfSkuZ2V0VmlhKFwiYS5iLmYuMC5nXCIpOyAvLyBcdTIxQTYgZmFsc2VcbiAqIGBgYFxuICpcbiAqIGlmIGEgdmFsdWUgaXMgbm90IHByZXNlbnQgb3IgaGFzIHRoZSB3cm9uZyB0eXBlLCBhIGNvcnJlc3BvbmRpbmcgZXhjZXB0aW9uIGlzIHRocm93bi5cbiAqXG4gKiBgYGBcbiAqIG5ldyBQYXRoZmluZGVyKHt9KS5nZXRWaWEoXCJhLmIuZi4wLmdcIik7IC8vIFx1MjFBNiBFcnJvclxuICogYGBgXG4gKlxuICogVGhlIGBQYXRoZmluZGVyLmV4aXN0cygpYCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhY2Nlc3MgdG8gdGhlIHBhdGggaXMgcG9zc2libGUuXG4gKlxuICogYGBgXG4gKiBuZXcgUGF0aGZpbmRlcih7fSkuZXhpc3RzKFwiYS5iLmYuMC5nXCIpOyAvLyBcdTIxQTYgZmFsc2VcbiAqIGBgYFxuICpcbiAqIHBhdGhmaW5kZXIgY2FuIGFsc28gYmUgdXNlZCB0byBidWlsZCBvYmplY3Qgc3RydWN0dXJlcy4gdG8gZG8gdGhpcywgdGhlIGBQYXRoZmluZGVyLnNldFZpYSgpYCBtZXRob2QgbXVzdCBiZSB1c2VkLlxuICpcbiAqIGBgYFxuICogb2JqID0ge307XG4gKiBuZXcgUGF0aGZpbmRlcihvYmopLnNldFZpYSgnYS5iLjAuYycsIHRydWUpOyAvLyBcdTIxQTYge2E6e2I6W3tjOnRydWV9XX19XG4gKiBgYGBcbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvZGF0YS9wYXRoZmluZGVyLTEubWpzXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvZGF0YS9wYXRoZmluZGVyLTIubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqL1xuY2xhc3MgUGF0aGZpbmRlciBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthcnJheXxvYmplY3R8TWFwfFNldH0gdmFsdWVcbiAgICAgKiBAc2luY2UgMS40LjBcbiAgICAgKiBAdGhyb3dzICB7RXJyb3J9IHRoZSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgYSBzaW1wbGUgdHlwZVxuICAgICAqKi9cbiAgICBjb25zdHJ1Y3RvcihvYmplY3QpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAoaXNQcmltaXRpdmUob2JqZWN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgcGFyYW1ldGVyIG11c3Qgbm90IGJlIGEgc2ltcGxlIHR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuICAgICAgICB0aGlzLndpbGRDYXJkID0gV0lMRENBUkQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2V0IHdpbGRjYXJkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gd2lsZGNhcmRcbiAgICAgKiBAcmV0dXJuIHtQYXRoZmluZGVyfVxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIHNldFdpbGRDYXJkKHdpbGRjYXJkKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHdpbGRjYXJkKTtcbiAgICAgICAgdGhpcy53aWxkQ2FyZCA9IHdpbGRjYXJkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHNpbmNlIDEuNC4wXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGFjdGlvbiBmb3IgdGhpcyBkYXRhIHR5cGVcbiAgICAgKi9cbiAgICBnZXRWaWEocGF0aCkge1xuICAgICAgICByZXR1cm4gZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgdGhpcy5vYmplY3QsIHZhbGlkYXRlU3RyaW5nKHBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtQYXRoZmluZGVyfVxuICAgICAqIEBzaW5jZSAxLjQuMFxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBhY3Rpb24gZm9yIHRoaXMgZGF0YSB0eXBlXG4gICAgICovXG4gICAgc2V0VmlhKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgpO1xuICAgICAgICBzZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCB0aGlzLm9iamVjdCwgcGF0aCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgVmlhIFBhdGhcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHJldHVybnMge1BhdGhmaW5kZXJ9XG4gICAgICogQHNpbmNlIDEuNi4wXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGFjdGlvbiBmb3IgdGhpcyBkYXRhIHR5cGVcbiAgICAgKi9cbiAgICBkZWxldGVWaWEocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoKTtcbiAgICAgICAgZGVsZXRlVmFsdWVWaWFQYXRoLmNhbGwodGhpcywgdGhpcy5vYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHJldHVybiB7Ym9vbH1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGludGVnZXJcbiAgICAgKiBAc2luY2UgMS40LjBcbiAgICAgKi9cbiAgICBleGlzdHMocGF0aCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIHRoaXMub2JqZWN0LCBwYXRoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cblxuXG4vKipcbiAqXG4gKiBAcGFyYW0geyp9IHN1YmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hlY2tcbiAqIEByZXR1cm4ge01hcH1cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXRlcmF0ZShzdWJqZWN0LCBwYXRoLCBjaGVjaykge1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDtcblxuICAgIGlmIChpc09iamVjdChzdWJqZWN0KSB8fCBpc0FycmF5KHN1YmplY3QpKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmplY3QpKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgdmFsdWUsIHBhdGgsIGNoZWNrKSlcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXRoLnNwbGl0KERFTElNSVRFUikuc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0LnNldChrZXksIGdldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIHN1YmplY3QsIHBhdGgsIGNoZWNrKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcblxuXG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7Kn0gc3ViamVjdFxuICogQHBhcmFtIFtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSBbYm9vbGVhbn0gY2hlY2sgXG4gKiBAcmV0dXJucyB7Kn1cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVWaWFQYXRoKHN1YmplY3QsIHBhdGgsIGNoZWNrKSB7XG5cbiAgICBpZiAocGF0aCA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gc3ViamVjdDtcbiAgICB9XG5cbiAgICBsZXQgcGFydHMgPSBwYXRoLnNwbGl0KERFTElNSVRFUilcbiAgICBsZXQgY3VycmVudCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoY3VycmVudCA9PT0gdGhpcy53aWxkQ2FyZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZS5jYWxsKHRoaXMsIHN1YmplY3QsIHBhcnRzLmpvaW4oREVMSU1JVEVSKSwgY2hlY2spO1xuICAgIH1cblxuICAgIGlmIChpc09iamVjdChzdWJqZWN0KSB8fCBpc0FycmF5KHN1YmplY3QpKSB7XG5cbiAgICAgICAgbGV0IGFuY2hvcjtcbiAgICAgICAgaWYgKHN1YmplY3QgaW5zdGFuY2VvZiBNYXAgfHwgc3ViamVjdCBpbnN0YW5jZW9mIFdlYWtNYXApIHtcbiAgICAgICAgICAgIGFuY2hvciA9IHN1YmplY3QuZ2V0KGN1cnJlbnQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoc3ViamVjdCBpbnN0YW5jZW9mIFNldCB8fCBzdWJqZWN0IGluc3RhbmNlb2YgV2Vha1NldCkge1xuICAgICAgICAgICAgY3VycmVudCA9IHBhcnNlSW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgdmFsaWRhdGVJbnRlZ2VyKGN1cnJlbnQpXG4gICAgICAgICAgICBhbmNob3IgPSBbLi4uc3ViamVjdF0/LltjdXJyZW50XTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBXZWFrUmVmID09PSAnZnVuY3Rpb24nICYmIHN1YmplY3QgaW5zdGFuY2VvZiBXZWFrUmVmKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcigndW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZScpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShzdWJqZWN0KSkge1xuICAgICAgICAgICAgY3VycmVudCA9IHBhcnNlSW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgdmFsaWRhdGVJbnRlZ2VyKGN1cnJlbnQpXG4gICAgICAgICAgICBhbmNob3IgPSBzdWJqZWN0Py5bY3VycmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IgPSBzdWJqZWN0Py5bY3VycmVudF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNPYmplY3QoYW5jaG9yKSB8fCBpc0FycmF5KGFuY2hvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCBhbmNob3IsIHBhcnRzLmpvaW4oREVMSU1JVEVSKSwgY2hlY2spXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJ0aGUgam91cm5leSBpcyBub3QgYXQgaXRzIGVuZCAoXCIgKyBwYXJ0cy5qb2luKERFTElNSVRFUikgKyBcIilcIik7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChjaGVjayA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKHN1YmplY3QpLCBjdXJyZW50KTtcblxuICAgICAgICAgICAgaWYgKCFzdWJqZWN0Lmhhc093blByb3BlcnR5KGN1cnJlbnQpICYmIGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCd1bmtub3duIHZhbHVlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbmNob3I7XG5cbiAgICB9XG5cbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCB0eXBlIFwiICsgdHlwZW9mIHN1YmplY3QpXG5cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIG9iamVjdFxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHR5cGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7RXJyb3J9IHRoZSBqb3VybmV5IGlzIG5vdCBhdCBpdHMgZW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0VmFsdWVWaWFQYXRoKG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcblxuICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgpO1xuXG4gICAgbGV0IHBhcnRzID0gcGF0aC5zcGxpdChERUxJTUlURVIpXG4gICAgbGV0IGxhc3QgPSBwYXJ0cy5wb3AoKTtcbiAgICBsZXQgc3VicGF0aCA9IHBhcnRzLmpvaW4oREVMSU1JVEVSKTtcblxuICAgIGxldCBzdGFjayA9IG5ldyBTdGFjaygpXG4gICAgbGV0IGN1cnJlbnQgPSBzdWJwYXRoO1xuICAgIHdoaWxlICh0cnVlKSB7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGdldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIG9iamVjdCwgY3VycmVudCwgdHJ1ZSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWNrLnB1c2goY3VycmVudCk7XG4gICAgICAgIHBhcnRzLnBvcCgpO1xuICAgICAgICBjdXJyZW50ID0gcGFydHMuam9pbihERUxJTUlURVIpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBcIlwiKSBicmVhaztcbiAgICB9XG5cbiAgICB3aGlsZSAoIXN0YWNrLmlzRW1wdHkoKSkge1xuICAgICAgICBjdXJyZW50ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGxldCBvYmogPSB7fTtcblxuICAgICAgICBpZiAoIXN0YWNrLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgbGV0IG4gPSBzdGFjay5wZWVrKCkuc3BsaXQoREVMSU1JVEVSKS5wb3AoKTtcbiAgICAgICAgICAgIGlmIChpc0ludGVnZXIocGFyc2VJbnQobikpKSB7XG4gICAgICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHNldFZhbHVlVmlhUGF0aC5jYWxsKHRoaXMsIG9iamVjdCwgY3VycmVudCwgb2JqKTtcbiAgICB9XG5cbiAgICBsZXQgYW5jaG9yID0gZ2V0VmFsdWVWaWFQYXRoLmNhbGwodGhpcywgb2JqZWN0LCBzdWJwYXRoKTtcblxuICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSAmJiAhaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHR5cGU6IFwiICsgdHlwZW9mIG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGFuY2hvciBpbnN0YW5jZW9mIE1hcCB8fCBhbmNob3IgaW5zdGFuY2VvZiBXZWFrTWFwKSB7XG4gICAgICAgIGFuY2hvci5zZXQobGFzdCwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoYW5jaG9yIGluc3RhbmNlb2YgU2V0IHx8IGFuY2hvciBpbnN0YW5jZW9mIFdlYWtTZXQpIHtcbiAgICAgICAgYW5jaG9yLmFwcGVuZCh2YWx1ZSlcblxuICAgIH0gZWxzZSBpZiAodHlwZW9mIFdlYWtSZWYgPT09ICdmdW5jdGlvbicgJiYgYW5jaG9yIGluc3RhbmNlb2YgV2Vha1JlZikge1xuICAgICAgICB0aHJvdyBFcnJvcigndW5zdXBwb3J0ZWQgYWN0aW9uIGZvciB0aGlzIGRhdGEgdHlwZScpO1xuXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGFuY2hvcikpIHtcbiAgICAgICAgbGFzdCA9IHBhcnNlSW50KGxhc3QpO1xuICAgICAgICB2YWxpZGF0ZUludGVnZXIobGFzdClcbiAgICAgICAgYXNzaWduUHJvcGVydHkoYW5jaG9yLCBsYXN0LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduUHJvcGVydHkoYW5jaG9yLCBsYXN0LCB2YWx1ZSk7XG4gICAgfVxuXG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5mdW5jdGlvbiBhc3NpZ25Qcm9wZXJ0eShvYmplY3QsIGtleSwgdmFsdWUpIHtcblxuICAgIGlmICghb2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuXG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBvYmplY3RcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGpvdXJuZXkgaXMgbm90IGF0IGl0cyBlbmRcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBhY3Rpb24gZm9yIHRoaXMgZGF0YSB0eXBlXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjYuMFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVsZXRlVmFsdWVWaWFQYXRoKG9iamVjdCwgcGF0aCkge1xuXG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KERFTElNSVRFUilcbiAgICBsZXQgbGFzdCA9IHBhcnRzLnBvcCgpO1xuICAgIGNvbnN0IHN1YnBhdGggPSBwYXJ0cy5qb2luKERFTElNSVRFUik7XG5cbiAgICBjb25zdCBhbmNob3IgPSBnZXRWYWx1ZVZpYVBhdGguY2FsbCh0aGlzLCBvYmplY3QsIHN1YnBhdGgpO1xuXG4gICAgaWYgKGFuY2hvciBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICBhbmNob3IuZGVsZXRlKGxhc3QpO1xuICAgIH0gZWxzZSBpZiAoYW5jaG9yIGluc3RhbmNlb2YgU2V0IHx8IGFuY2hvciBpbnN0YW5jZW9mIFdlYWtNYXAgfHwgYW5jaG9yIGluc3RhbmNlb2YgV2Vha1NldCB8fCAodHlwZW9mIFdlYWtSZWYgPT09ICdmdW5jdGlvbicgJiYgYW5jaG9yIGluc3RhbmNlb2YgV2Vha1JlZikpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ3Vuc3VwcG9ydGVkIGFjdGlvbiBmb3IgdGhpcyBkYXRhIHR5cGUnKTtcblxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShhbmNob3IpKSB7XG4gICAgICAgIGxhc3QgPSBwYXJzZUludChsYXN0KTtcbiAgICAgICAgdmFsaWRhdGVJbnRlZ2VyKGxhc3QpXG4gICAgICAgIGRlbGV0ZSBhbmNob3JbbGFzdF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGFuY2hvcltsYXN0XTtcbiAgICB9XG5cblxufVxuIiwgIlxuXG4vKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge2dldEdsb2JhbCwgZ2V0R2xvYmFsT2JqZWN0fSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtJRH0gZnJvbSAnLi4vdHlwZXMvaWQubWpzJztcbmltcG9ydCB7aXNBcnJheSwgaXNPYmplY3QsIGlzU3RyaW5nfSBmcm9tICcuLi90eXBlcy9pcy5tanMnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZUZ1bmN0aW9uLFxuICAgIHZhbGlkYXRlSW50ZWdlcixcbiAgICB2YWxpZGF0ZU9iamVjdCxcbiAgICB2YWxpZGF0ZVByaW1pdGl2ZSxcbiAgICB2YWxpZGF0ZVN0cmluZ1xufSBmcm9tICcuLi90eXBlcy92YWxpZGF0ZS5tanMnO1xuaW1wb3J0IHtjbG9uZX0gZnJvbSBcIi4uL3V0aWwvY2xvbmUubWpzXCI7XG5pbXBvcnQge1BhdGhmaW5kZXJ9IGZyb20gXCIuL3BhdGhmaW5kZXIubWpzXCI7XG5cbmV4cG9ydCB7VHJhbnNmb3JtZXJ9XG5cbi8qKlxuICogVGhlIHRyYW5zZm9ybWVyIGNsYXNzIGlzIGEgc3dpc3MgYXJteSBrbmlmZSBmb3IgbWFuaXB1bGF0aW5nIHZhbHVlcy4gZXNwZWNpYWxseSBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBwaXBlLCBwcm9jZXNzaW5nIGNoYWlucyBjYW4gYmUgYnVpbHQgdXAuXG4gKlxuICogQSBzaW1wbGUgZXhhbXBsZSBpcyB0aGUgY29udmVyc2lvbiBvZiBhbGwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UuIGZvciB0aGlzIHB1cnBvc2UgdGhlIGNvbW1hbmQgYHRvbG93ZXJgIG11c3QgYmUgdXNlZC5cbiAqXG4gKiBgYGBcbiAqIGxldCB0ID0gbmV3IFRyYW5zZm9ybWVyKCd0b2xvd2VyJykucnVuKCdBQkMnKTsgLy8gXHUyMUE2IGFiY1xuICogYGBgXG4gKlxuICogKiphbGwgY29tbWFuZHMqKlxuICpcbiAqIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYWxsIGNvbW1hbmRzLCBwYXJhbWV0ZXJzIGFuZCBleGlzdGluZyBhbGlhc2VzIGFyZSBkZXNjcmliZWQuXG4gKlxuICogfCBjb21tYW5kICAgICAgfCBwYXJhbWV0ZXIgICAgICAgICAgICAgICAgICB8IGFsaWFzICAgICAgICAgICAgICAgICAgIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8Oi0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgdG8tYmFzZTY0ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYXNlNjQsIGJ0b2IgICAgICAgICAgICB8IENvbnZlcnRzIHRoZSB2YWx1ZSB0byBiYXNlNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBmcm9tLWJhc2U2NCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGF0b2IgICAgICAgICAgICAgICAgICAgIHwgQ29udmVydHMgdGhlIHZhbHVlIGZyb20gYmFzZTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGNhbGwgICAgICAgICB8IGZ1bmN0aW9uOnBhcmFtMTpwYXJhbTI6Li4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBjYW4gYmUgZGVmaW5lZCBpbiB0aHJlZSBwbGFjZXM6IGVpdGhlciBnbG9iYWxseSwgaW4gdGhlIGNvbnRleHQgYGFkZENhbGxiYWNrYCBvciBpbiB0aGUgcGFzc2VkIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgZGVmYXVsdCAgICAgIHwgdmFsdWU6dHlwZSAgICAgICAgICAgICAgICAgfCA/PyAgICAgICAgICAgICAgICAgICAgICB8IElmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHZhbHVlLiBUaGUgdGhpcmQgb3B0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgZGVzaXJlZCB0eXBlLiBJZiBubyB0eXBlIGlzIHNwZWNpZmllZCwgc3RyaW5nIGlzIHVzZWQuIFZhbGlkIHR5cGVzIGFyZSBib29sLCBzdHJpbmcsIGludCwgZmxvYXQsIHVuZGVmaW5lZCBhbmQgb2JqZWN0LiBBbiBvYmplY3QgZGVmYXVsdCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIGJhc2U2NCBlbmNvZGVkIGpzb24gc3RyaW5nLiAoc2luY2UgMS4xMi4wKSAgICAgICAgICAgICAgICAgfFxuICogfCBkZWJ1ZyAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIHBhc3NlZCB2YWx1ZSBpcyBvdXRwdXQgKGNvbnNvbGUpIGFuZCByZXR1cm5lZCAgfFxuICogfCBlbXB0eSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmV0dXJuIGVtcHR5IFN0cmluZyBcIlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgZmlyc3Qta2V5ICAgIHwgZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IENhbiBiZSBhcHBsaWVkIHRvIG9iamVjdHMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBrZXkuIEFsbCBrZXlzIG9mIHRoZSBvYmplY3QgYXJlIGZldGNoZWQgYW5kIHNvcnRlZC4gICAgKHNpbmNlIDEuMjMuMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBmcm9tanNvbiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHlwZSBjb252ZXJzaW9uIGZyb20gYSBKU09OIHN0cmluZyAoc2luY2UgMS4xMi4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGlmICAgICAgICAgICB8IHN0YXRlbWVudDE6c3RhdGVtZW50MiAgICAgIHwgPyAgICAgICAgICAgICAgICAgICAgICAgfCBJcyB0aGUgdGVybmFyeSBvcGVyYXRvciwgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgdmFsaWQgc3RhdGVtZW50LCB0aGUgc2Vjb25kIGlzIHRoZSBmYWxzZSBwYXJ0LiBUbyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHF1ZXVlLCB5b3UgY2FuIHNldCB0aGUgdmFsdWUga2V5d29yZC4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSB3YW50IHRvIGhhdmUgdGhlIHN0YXRpYyBzdHJpbmcgXCJ2YWx1ZVwiLCB5b3UgaGF2ZSB0byBwdXQgb25lIGJhY2tzbGFzaCBcXFxcIGluIGZyb250IG9mIGl0IGFuZCB3cml0ZSB2YWx1ZS4gdGhlIGZvbGxvdyB2YWx1ZXMgYXJlIHRydWU6ICdvbicsIHRydWUsICd0cnVlJy4gSWYgeW91IHdhbnQgdG8gaGF2ZSBhIHNwYWNlLCB5b3UgYWxzbyBoYXZlIHRvIHdyaXRlIFxcXFwgaW4gZnJvbnQgb2YgdGhlIHNwYWNlLiAgfFxuICogfCBpbmRleCAgICAgICAgfCBrZXk6ZGVmYXVsdCAgICAgICAgICAgICAgICB8IHByb3BlcnR5LCBrZXkgICAgICAgICAgIHwgRmV0Y2hlcyBhIHZhbHVlIGZyb20gYW4gb2JqZWN0LCBhbiBhcnJheSwgYSBtYXAgb3IgYSBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGxhc3Qta2V5ICAgICB8IGRlZmF1bHQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDYW4gYmUgYXBwbGllZCB0byBvYmplY3RzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBrZXkuIEFsbCBrZXlzIG9mIHRoZSBvYmplY3QgYXJlIGZldGNoZWQgYW5kIHNvcnRlZC4gKHNpbmNlIDEuMjMuMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgbGVuZ3RoICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb3VudCAgICAgICAgICAgICAgICAgICB8IExlbmd0aCBvZiB0aGUgc3RyaW5nIG9yIGVudHJpZXMgb2YgYW4gYXJyYXkgb3Igb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBub3AgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgRG8gbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IG50aC1rZXkgICAgICB8IGluZGV4OmRlZmF1bHQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDYW4gYmUgYXBwbGllZCB0byBvYmplY3RzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbnRoIGtleS4gQWxsIGtleXMgb2YgdGhlIG9iamVjdCBhcmUgZmV0Y2hlZCBhbmQgc29ydGVkLiAoc2luY2UgMS4yMy4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgbnRoLWxhc3Qta2V5IHwgaW5kZXg6ZGVmYXVsdCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IENhbiBiZSBhcHBsaWVkIHRvIG9iamVjdHMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBudGgga2V5IGZyb20gYmVoaW5kLiBBbGwga2V5cyBvZiB0aGUgb2JqZWN0IGFyZSBmZXRjaGVkIGFuZCBzb3J0ZWQuIChzaW5jZSAxLjIzLjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBwYXRoICAgICAgICAgfCBwYXRoICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGFjY2VzcyB0byBhbiBvYmplY3QgaXMgZG9uZSB2aWEgYSBQYXRoZmluZGVyIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHBhdGgtZXhpc3RzICB8IHBhdGggICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIHBhdGggaXMgYXZhaWxhYmxlIGluIHRoZSB2YWx1ZSAoc2luY2UgMS4yNC4wKSAgICB8XG4gKiB8IHBsYWludGV4dCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhaW4gICAgICAgICAgICAgICAgICAgfCBBbGwgSFRNTCB0YWdzIGFyZSByZW1vdmVkICgqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgcHJlZml4ICAgICAgIHwgdGV4dCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkZHMgYSBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCByYXd1cmxlbmNvZGUgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgVVJMIGNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHN0YXRpYyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbm9uZSAgICAgICAgICAgICAgICAgICAgfCBUaGUgQXJndW1lbnRzIHZhbHVlIGlzIHVzZWQgYW5kIHBhc3NlZCB0byB0aGUgdmFsdWUuIFNwZWNpYWwgY2hhcmFjdGVycyBcXCA8c3BhY2U+IGFuZCA6IGNhbiBiZSBxdW90ZXQgYnkgYSBwcmVjZWRpbmcgXFwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBzdWJzdHJpbmcgICAgfCBzdGFydDpsZW5ndGggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmV0dXJucyBhIHN1YnN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHN1ZmZpeCAgICAgICB8IHRleHQgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZGRzIGEgc3VmZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgdG9pbnRlZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IFR5cGUgY29udmVyc2lvbiB0byBhbiBpbnRlZ2VyIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB0b2pzb24gICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHlwZSBjb252ZXJzaW9uIHRvIGEgSlNPTiBzdHJpbmcgKHNpbmNlIDEuOC4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHRvbG93ZXIgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydG9sb3dlciwgdG9sb3dlcmNhc2UgfCBUaGUgaW5wdXQgdmFsdWUgaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBsZXR0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgdG9zdHJpbmcgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IFR5cGUgY29udmVyc2lvbiB0byBhIHN0cmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB0b3VwcGVyICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cnRvdXBwZXIsIHRvdXBwZXJjYXNlIHwgVGhlIGlucHV0IHZhbHVlIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgbGV0dGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHRyaW0gICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZW1vdmUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgdWNmaXJzdCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IEZpcnN0IGNoYXJhY3RlciBsYXJnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB1Y3dvcmRzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgQW55IHdvcmQgYmVnaW5uaW5nIGxhcmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHVuZGVmaW5lZCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXR1cm4gdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgdW5pcWlkICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZXMgYSBzdHJpbmcgd2l0aCBhIHVuaXF1ZSB2YWx1ZSAoKiopXG4gKlxuICogICgqKSBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5IHRoZSBleHRlbnNpb24gW2pzZG9tXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9qc2RvbSkgbXVzdCBiZSBsb2FkZWQgaW4gdGhlIG5vZGVqcyBjb250ZXh0LlxuICpcbiAqIGBgYFxuICogIC8vIHBvbHlmaWxsXG4gKiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwib2JqZWN0XCIpIHtcbiAqICAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTSgnJywge1xuICogICAgICAgICB1cmw6ICdodHRwOi8vZXhhbXBsZS5jb20vJyxcbiAqICAgICAgICAgcHJldGVuZFRvQmVWaXN1YWw6IHRydWVcbiAqICAgICB9KTtcbiAqIFxuICogICAgIFtcbiAqICAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICAnZG9jdW1lbnQnLFxuICogICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgICdFbGVtZW50JyxcbiAqICAgICAgICAgJ0hUTUxFbGVtZW50JyxcbiAqICAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICAnRE9NUGFyc2VyJyxcbiAqICAgICAgICAgJ1hNTFNlcmlhbGl6ZXInLFxuICogICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgICdJbnB1dEV2ZW50JyxcbiAqICAgICAgICAgJ0N1c3RvbUV2ZW50J1xuICogICAgIF0uZm9yRWFjaChrZXkgPT4gKGdsb2JhbFtrZXldID0gd2luZG93W2tleV0pKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICgqKikgZm9yIHRoaXMgY29tbWFuZCB0aGUgY3J5cHQgbGlicmFyeSBpcyBuZWNlc3NhcnkgaW4gdGhlIG5vZGVqcyBjb250ZXh0LlxuICpcbiAqIGBgYFxuICogaW1wb3J0ICogYXMgQ3J5cHRvIGZyb20gXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCI7XG4gKiBnbG9iYWxbJ2NyeXB0byddID0gbmV3IENyeXB0by5DcnlwdG8oKTtcbiAqIGBgYFxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9kYXRhL3RyYW5zZm9ybWVyLm1qc1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKi9cbmNsYXNzIFRyYW5zZm9ybWVyIGV4dGVuZHMgQmFzZSB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVmaW5pdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRlZmluaXRpb24pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hcmdzID0gZGlzYXNzZW1ibGUoZGVmaW5pdGlvbik7XG4gICAgICAgIHRoaXMuY29tbWFuZCA9IHRoaXMuYXJncy5zaGlmdCgpXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICAgKiBAcmV0dXJucyB7VHJhbnNmb3JtZXJ9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gICAgICovXG4gICAgc2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcobmFtZSlcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjaylcblxuICAgICAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZU9iamVjdChjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldChuYW1lLCB7XG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdW5rbm93biBjb21tYW5kXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gICAgICogQHRocm93cyB7RXJyb3J9IHR5cGUgbm90IHN1cHBvcnRlZFxuICAgICAqL1xuICAgIHJ1bih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIFt2YWx1ZV0pXG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZFxuICogQHJldHVybnMge2FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGlzYXNzZW1ibGUoY29tbWFuZCkge1xuXG4gICAgdmFsaWRhdGVTdHJpbmcoY29tbWFuZCk7XG5cbiAgICBsZXQgcGxhY2Vob2xkZXIgPSBuZXcgTWFwO1xuICAgIGNvbnN0IHJlZ2V4ID0gLygoPzxwYXR0ZXJuPlxcXFwoPzxjaGFyPi4pKXsxfSkvbWlnO1xuXG4gICAgLy8gVGhlIHNlcGFyYXRvciBmb3IgYXJncyBtdXN0IGJlIGVzY2FwZWRcbiAgICAvLyB1bmRlZmluZWQgc3RyaW5nIHdoaWNoIHNob3VsZCBub3Qgb2NjdXIgbm9ybWFsbHkgYW5kIGlzIGFsc28gbm90IGEgcmVnZXhcbiAgICBsZXQgcmVzdWx0ID0gY29tbWFuZC5tYXRjaEFsbChyZWdleClcblxuICAgIGZvciAobGV0IG0gb2YgcmVzdWx0KSB7XG4gICAgICAgIGxldCBnID0gbT8uWydncm91cHMnXTtcbiAgICAgICAgaWYgKCFpc09iamVjdChnKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcCA9IGc/LlsncGF0dGVybiddO1xuICAgICAgICBsZXQgYyA9IGc/LlsnY2hhciddO1xuXG4gICAgICAgIGlmIChwICYmIGMpIHtcbiAgICAgICAgICAgIGxldCByID0gJ19fJyArIG5ldyBJRCgpLnRvU3RyaW5nKCkgKyAnX18nO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuc2V0KHIsIGMpO1xuICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQucmVwbGFjZShwLCByKTtcbiAgICAgICAgfVxuXG4gICAgfVxuICAgIGxldCBwYXJ0cyA9IGNvbW1hbmQuc3BsaXQoJzonKTtcblxuICAgIHBhcnRzID0gcGFydHMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBsZXQgdiA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgZm9yIChsZXQgayBvZiBwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgdiA9IHYucmVwbGFjZShrWzBdLCBrWzFdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcblxuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFydHNcbn1cblxuLyoqXG4gKiB0cmllcyB0byBtYWtlIGEgc3RyaW5nIG91dCBvZiB2YWx1ZSBhbmQgaWYgdGhpcyBzdWNjZWVkcyB0byByZXR1cm4gaXQgYmFja1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb252ZXJ0VG9TdHJpbmcodmFsdWUpIHtcblxuICAgIGlmIChpc09iamVjdCh2YWx1ZSkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMgeyp9XG4gKiBAcHJpdmF0ZVxuICogQHRocm93cyB7RXJyb3J9IHVua25vd24gY29tbWFuZFxuICogQHRocm93cyB7VHlwZUVycm9yfSB1bnN1cHBvcnRlZCB0eXBlXG4gKiBAdGhyb3dzIHtFcnJvcn0gdHlwZSBub3Qgc3VwcG9ydGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gbWlzc2luZyBrZXkgcGFyYW1ldGVyXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybSh2YWx1ZSkge1xuXG4gICAgY29uc3QgY29uc29sZSA9IGdldEdsb2JhbE9iamVjdCgnY29uc29sZScpO1xuXG4gICAgbGV0IGFyZ3MgPSBjbG9uZSh0aGlzLmFyZ3MpO1xuICAgIGxldCBrZXksIGRlZmF1bHRWYWx1ZTtcblxuICAgIHN3aXRjaCAodGhpcy5jb21tYW5kKSB7XG5cbiAgICAgICAgY2FzZSAnc3RhdGljJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFyZ3Muam9pbignOicpO1xuXG4gICAgICAgIGNhc2UgJ3RvbG93ZXInOlxuICAgICAgICBjYXNlICdzdHJ0b2xvd2VyJzpcbiAgICAgICAgY2FzZSAndG9sb3dlcmNhc2UnOlxuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBjYXNlICd0b3VwcGVyJzpcbiAgICAgICAgY2FzZSAnc3RydG91cHBlcic6XG4gICAgICAgIGNhc2UgJ3RvdXBwZXJjYXNlJzpcbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgY2FzZSAndG9zdHJpbmcnOlxuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcblxuICAgICAgICBjYXNlICd0b2ludGVnZXInOlxuICAgICAgICAgICAgbGV0IG4gPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgICB2YWxpZGF0ZUludGVnZXIobik7XG4gICAgICAgICAgICByZXR1cm4gblxuXG4gICAgICAgIGNhc2UgJ3RvanNvbic6XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG4gICAgICAgIGNhc2UgJ2Zyb21qc29uJzpcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcblxuICAgICAgICBjYXNlICd0cmltJzpcbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICBjYXNlICdyYXd1cmxlbmNvZGUnOlxuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8hL2csICclMjEnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICclMjcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCgvZywgJyUyOCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcKS9nLCAnJTI5JylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwqL2csICclMkEnKTtcblxuXG4gICAgICAgIGNhc2UgICdjYWxsJzpcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBjYWxsYmFjay1kZWZpbml0aW9uXG4gICAgICAgICAgICAgKiBmdW5jdGlvbiBjYWxsYmFjayh2YWx1ZSwgLi4uYXJncykge1xuICAgICAgICAgICAgICogICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgKiB9XG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgbGV0IGNhbGxiYWNrO1xuICAgICAgICAgICAgbGV0IGNhbGxiYWNrTmFtZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCBjb250ZXh0ID0gZ2V0R2xvYmFsKCk7XG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoY2FsbGJhY2tOYW1lKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gdmFsdWVbY2FsbGJhY2tOYW1lXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYWxsYmFja3MuaGFzKGNhbGxiYWNrTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IHRoaXMuY2FsbGJhY2tzLmdldChjYWxsYmFja05hbWUpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gcz8uWydjYWxsYmFjayddO1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBzPy5bJ2NvbnRleHQnXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiYgd2luZG93Lmhhc093blByb3BlcnR5KGNhbGxiYWNrTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHdpbmRvd1tjYWxsYmFja05hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjayk7XG5cbiAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suY2FsbChjb250ZXh0LCAuLi5hcmdzKTtcblxuICAgICAgICBjYXNlICAncGxhaW4nOlxuICAgICAgICBjYXNlICAncGxhaW50ZXh0JzpcbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHZhbHVlLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICByZXR1cm4gZG9jLmJvZHkudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICBjYXNlICAnaWYnOlxuICAgICAgICBjYXNlICAnPyc6XG5cbiAgICAgICAgICAgIHZhbGlkYXRlUHJpbWl0aXZlKHZhbHVlKTtcblxuICAgICAgICAgICAgbGV0IHRydWVTdGF0ZW1lbnQgPSAoYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBsZXQgZmFsc2VTdGF0ZW1lbnQgPSAoYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICAgIGlmICh0cnVlU3RhdGVtZW50ID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgdHJ1ZVN0YXRlbWVudCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRydWVTdGF0ZW1lbnQgPT09ICdcXFxcdmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgdHJ1ZVN0YXRlbWVudCA9ICd2YWx1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmFsc2VTdGF0ZW1lbnQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICBmYWxzZVN0YXRlbWVudCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZhbHNlU3RhdGVtZW50ID09PSAnXFxcXHZhbHVlJykge1xuICAgICAgICAgICAgICAgIGZhbHNlU3RhdGVtZW50ID0gJ3ZhbHVlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNvbmRpdGlvbiA9ICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09ICdvZmYnICYmIHZhbHVlICE9PSAnZmFsc2UnICYmIHZhbHVlICE9PSBmYWxzZSkgfHwgdmFsdWUgPT09ICdvbicgfHwgdmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uID8gdHJ1ZVN0YXRlbWVudCA6IGZhbHNlU3RhdGVtZW50O1xuXG5cbiAgICAgICAgY2FzZSAndWNmaXJzdCc6XG4gICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cbiAgICAgICAgICAgIGxldCBmaXJzdGNoYXIgPSB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdGNoYXIgKyB2YWx1ZS5zdWJzdHIoMSk7XG4gICAgICAgIGNhc2UgJ3Vjd29yZHMnOlxuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodmFsdWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXihbYS16XFx1MDBFMC1cXHUwMEZDXSl8XFxzKyhbYS16XFx1MDBFMC1cXHUwMEZDXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdi50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSAgJ2NvdW50JzpcbiAgICAgICAgY2FzZSAgJ2xlbmd0aCc6XG5cbiAgICAgICAgICAgIGlmICgoaXNTdHJpbmcodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSB8fCBpc0FycmF5KHZhbHVlKSkgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkoJ2xlbmd0aCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHR5cGUgXCIgKyB0eXBlb2YgdmFsdWUpO1xuXG4gICAgICAgIGNhc2UgJ3RvLWJhc2U2NCc6XG4gICAgICAgIGNhc2UgJ2J0b2EnOlxuICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgICAgcmV0dXJuIGJ0b2EoY29udmVydFRvU3RyaW5nKHZhbHVlKSk7XG5cbiAgICAgICAgY2FzZSAnYXRvYic6XG4gICAgICAgIGNhc2UgJ2Zyb20tYmFzZTY0JzpcbiAgICAgICAgICAgIHJldHVybiBhdG9iKGNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpO1xuXG4gICAgICAgIGNhc2UgJ2VtcHR5JzpcbiAgICAgICAgICAgIHJldHVybiAnJztcblxuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjYXNlICdkZWJ1Zyc6XG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChjb25zb2xlKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgJ3ByZWZpeCc6XG4gICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgcHJlZml4ID0gYXJncz8uWzBdO1xuICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgJ3N1ZmZpeCc6XG4gICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgc3VmZml4ID0gYXJncz8uWzBdO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgc3VmZml4O1xuXG4gICAgICAgIGNhc2UgJ3VuaXFpZCc6XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBJRCgpKS50b1N0cmluZygpO1xuXG4gICAgICAgIGNhc2UgJ2ZpcnN0LWtleSc6XG4gICAgICAgIGNhc2UgJ2xhc3Qta2V5JzpcbiAgICAgICAgY2FzZSAnbnRoLWxhc3Qta2V5JzpcbiAgICAgICAgY2FzZSAnbnRoLWtleSc6XG5cbiAgICAgICAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBub3Qgc3VwcG9ydGVkXCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbW1hbmQgPT09ICdmaXJzdC1rZXknKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kID09PSAnbGFzdC1rZXknKSB7XG4gICAgICAgICAgICAgICAga2V5ID0ga2V5cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIGtleSA9IHZhbGlkYXRlSW50ZWdlcihwYXJzZUludChhcmdzLnNoaWZ0KCkpKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbW1hbmQgPT09ICdudGgtbGFzdC1rZXknKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXMubGVuZ3RoIC0ga2V5IC0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IChhcmdzLnNoaWZ0KCkgfHwgJycpO1xuXG4gICAgICAgICAgICBsZXQgdXNlS2V5ID0ga2V5cz8uW2tleV07XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZT8uW3VzZUtleV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU/Llt1c2VLZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG5cbiAgICAgICAgY2FzZSAna2V5JzpcbiAgICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICBjYXNlICdpbmRleCc6XG5cbiAgICAgICAgICAgIGtleSA9IGFyZ3Muc2hpZnQoKSB8fCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1pc3Npbmcga2V5IHBhcmFtZXRlclwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSAoYXJncy5zaGlmdCgpIHx8IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldChrZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUpIHx8IGlzQXJyYXkodmFsdWUpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWU/LltrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZT8uW2tleV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZSBub3Qgc3VwcG9ydGVkXCIpXG5cbiAgICAgICAgY2FzZSAncGF0aC1leGlzdHMnOlxuXG4gICAgICAgICAgICBrZXkgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIGtleSBwYXJhbWV0ZXJcIilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoZmluZGVyKHZhbHVlKS5leGlzdHMoa2V5KTtcblxuICAgICAgICBjYXNlICdwYXRoJzpcblxuICAgICAgICAgICAga2V5ID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBrZXkgcGFyYW1ldGVyXCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwZiA9IG5ldyBQYXRoZmluZGVyKHZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKCFwZi5leGlzdHMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwZi5nZXRWaWEoa2V5KTtcblxuXG4gICAgICAgIGNhc2UgJ3N1YnN0cmluZyc6XG5cbiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHZhbHVlKTtcblxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcGFyc2VJbnQoYXJnc1swXSkgfHwgMDtcbiAgICAgICAgICAgIGxldCBlbmQgPSAocGFyc2VJbnQoYXJnc1sxXSkgfHwgMCkgKyBzdGFydDtcblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyhzdGFydCwgZW5kKTtcblxuICAgICAgICBjYXNlICdub3AnOlxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgIGNhc2UgICc/Pyc6XG4gICAgICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VHlwZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFR5cGUgPSAnc3RyaW5nJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ludCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgY2FzZSAnYm9vbCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGRlZmF1bHRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVmYXVsdFZhbHVlICE9PSAnJyAmJiBkZWZhdWx0VmFsdWUgIT09ICdvZmYnICYmIGRlZmF1bHRWYWx1ZSAhPT0gJ2ZhbHNlJyAmJiBkZWZhdWx0VmFsdWUgIT09ICdmYWxzZScpIHx8IGRlZmF1bHRWYWx1ZSA9PT0gJ29uJyB8fCBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyB8fCBkZWZhdWx0VmFsdWUgPT09ICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhdG9iKGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIG5vdCBzdXBwb3J0ZWRcIilcblxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGNvbW1hbmQgXCIgKyB0aGlzLmNvbW1hbmQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcbmltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gJy4uL3R5cGVzL3ZhbGlkYXRlLm1qcyc7XG5pbXBvcnQge1RyYW5zZm9ybWVyfSBmcm9tICcuL3RyYW5zZm9ybWVyLm1qcyc7XG5cbmV4cG9ydCB7UGlwZX1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgREVMSU1JVEVSID0gJ3wnO1xuXG4vKipcbiAqIFRoZSBwaXBlIGNsYXNzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNvbWJpbmUgc2V2ZXJhbCBwcm9jZXNzaW5nIHN0ZXBzLlxuICpcbiAqIEEgcGlwZSBjb25zaXN0cyBvZiBjb21tYW5kcyB3aG9zZSBpbnB1dCBhbmQgb3V0cHV0IGFyZSBjb25uZWN0ZWQgd2l0aCB0aGUgcGlwZSBzeW1ib2wgYHxgLlxuICpcbiAqIFdpdGggdGhlIFBpcGUsIHByb2Nlc3Npbmcgc3RlcHMgY2FuIGJlIGNvbWJpbmVkLiBIZXJlLCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGlzIGFjY2Vzc2VkIHZpYSB0aGUgcGF0aGZpbmRlciAocGF0aCBjb21tYW5kKS5cbiAqIHRoZSB3b3JkIGlzIHRoZW4gY29udmVydGVkIHRvIHVwcGVyY2FzZSBsZXR0ZXJzIGFuZCBhIHByZWZpeCBIZWxsbyBpcyBhZGRlZC4gdGhlIHR3byBiYWNrc2xhc2ggc2FmZSB0aGUgc3BhY2UgY2hhci5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlICAuLi8uLi9leGFtcGxlL2RhdGEvcGlwZS5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRGF0YVxuICovXG5jbGFzcyBQaXBlIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGlwZSBhIHBpcGUgY29uc2lzdHMgb2YgY29tbWFuZHMgd2hvc2UgaW5wdXQgYW5kIG91dHB1dCBhcmUgY29ubmVjdGVkIHdpdGggdGhlIHBpcGUgc3ltYm9sIGB8YC5cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9XG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGlwZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhwaXBlKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMucGlwZSA9IHBpcGUuc3BsaXQoREVMSU1JVEVSKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNmb3JtZXIodik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICAgKiBAcmV0dXJucyB7VHJhbnNmb3JtZXJ9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gICAgICovXG4gICAgc2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcblxuICAgICAgICBmb3IgKGNvbnN0IFssIHRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucGlwZSkpIHtcbiAgICAgICAgICAgIHQuc2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcnVuIGEgcGlwZVxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqL1xuICAgIHJ1bih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5waXBlLnJlZHVjZSgoYWNjdW11bGF0b3IsIHRyYW5zZm9ybWVyLCBjdXJyZW50SW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIucnVuKGFjY3VtdWxhdG9yKTtcbiAgICAgICAgfSwgdmFsdWUpO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cblxuZXhwb3J0IHtcbiAgICBERUZBVUxUX1RIRU1FLFxuICAgIEFUVFJJQlVURV9QUkVGSVgsXG4gICAgQVRUUklCVVRFX09QVElPTlMsXG4gICAgQVRUUklCVVRFX09QVElPTlNfU0VMRUNUT1IsXG4gICAgQVRUUklCVVRFX1RIRU1FX1BSRUZJWCxcbiAgICBBVFRSSUJVVEVfVEhFTUVfTkFNRSxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTLFxuICAgIEFUVFJJQlVURV9VUERBVEVSX1NFTEVDVF9USElTLFxuICAgIEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UsXG4gICAgQVRUUklCVVRFX1VQREFURVJfSU5TRVJULFxuICAgIEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0UsXG4gICAgQVRUUklCVVRFX1VQREFURVJfUkVNT1ZFLFxuICAgIEFUVFJJQlVURV9VUERBVEVSX0JJTkQsXG4gICAgQVRUUklCVVRFX1RFTVBMQVRFX1BSRUZJWCxcbiAgICBBVFRSSUJVVEVfUk9MRSxcbiAgICBBVFRSSUJVVEVfRElTQUJMRUQsXG4gICAgQVRUUklCVVRFX1ZBTFVFLFxuICAgIEFUVFJJQlVURV9PQkpFQ1RMSU5LLFxuICAgIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG4gICAgVEFHX1NDUklQVCxcbiAgICBUQUdfU1RZTEUsXG4gICAgVEFHX0xJTkssXG4gICAgQVRUUklCVVRFX0lELFxuICAgIEFUVFJJQlVURV9DTEFTUyxcbiAgICBBVFRSSUJVVEVfVElUTEUsXG4gICAgQVRUUklCVVRFX1NSQyxcbiAgICBBVFRSSUJVVEVfSFJFRixcbiAgICBBVFRSSUJVVEVfVFlQRSxcbiAgICBBVFRSSUJVVEVfTk9OQ0UsXG4gICAgQVRUUklCVVRFX1RSQU5TTEFURSxcbiAgICBBVFRSSUJVVEVfVEFCSU5ERVgsXG4gICAgQVRUUklCVVRFX1NQRUxMQ0hFQ0ssXG4gICAgQVRUUklCVVRFX1NMT1QsXG4gICAgQVRUUklCVVRFX1BBUlQsXG4gICAgQVRUUklCVVRFX0xBTkcsXG4gICAgQVRUUklCVVRFX0lURU1UWVBFLFxuICAgIEFUVFJJQlVURV9JVEVNU0NPUEUsXG4gICAgQVRUUklCVVRFX0lURU1SRUYsXG4gICAgQVRUUklCVVRFX0lURU1JRCxcbiAgICBBVFRSSUJVVEVfSVRFTVBST1AsXG4gICAgQVRUUklCVVRFX0lTLFxuICAgIEFUVFJJQlVURV9JTlBVVE1PREUsXG4gICAgQVRUUklCVVRFX0FDQ0VTU0tFWSxcbiAgICBBVFRSSUJVVEVfQVVUT0NBUElUQUxJWkUsXG4gICAgQVRUUklCVVRFX0FVVE9GT0NVUyxcbiAgICBBVFRSSUJVVEVfQ09OVEVOVEVESVRBQkxFLFxuICAgIEFUVFJJQlVURV9ESVIsXG4gICAgQVRUUklCVVRFX0RSQUdHQUJMRSxcbiAgICBBVFRSSUJVVEVfRU5URVJLRVlISU5ULFxuICAgIEFUVFJJQlVURV9FWFBPUlRQQVJUUyxcbiAgICBBVFRSSUJVVEVfSElEREVOLFxuICAgIG9iamVjdFVwZGF0ZXJMaW5rU3ltYm9sLFxuXG59XG5cbi8qKlxuICogZGVmYXVsdCB0aGVtZVxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBERUZBVUxUX1RIRU1FID0gJ21vbnN0ZXInO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IEFUVFJJQlVURV9QUkVGSVggPSAnZGF0YS1tb25zdGVyLSc7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHBhc3Mgb3B0aW9ucyB0byBhIGNvbnRyb2xcbiAqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfT1BUSU9OUyA9IEFUVFJJQlVURV9QUkVGSVggKyAnb3B0aW9ucyc7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHBhc3Mgb3B0aW9ucyB0byBhIGNvbnRyb2xcbiAqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMzAuMFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQVRUUklCVVRFX09QVElPTlNfU0VMRUNUT1IgPSBBVFRSSUJVVEVfUFJFRklYICsgJ29wdGlvbnMtc2VsZWN0b3InO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9USEVNRV9QUkVGSVggPSBBVFRSSUJVVEVfUFJFRklYICsgJ3RoZW1lLSc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBBVFRSSUJVVEVfVEhFTUVfTkFNRSA9IEFUVFJJQlVURV9USEVNRV9QUkVGSVggKyAnbmFtZSc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFUyA9IEFUVFJJQlVURV9QUkVGSVggKyAnYXR0cmlidXRlcyc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNy4xXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9VUERBVEVSX1NFTEVDVF9USElTID0gQVRUUklCVVRFX1BSRUZJWCArICdzZWxlY3QtdGhpcyc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSA9IEFUVFJJQlVURV9QUkVGSVggKyAncmVwbGFjZSc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1VQREFURVJfSU5TRVJUID0gQVRUUklCVVRFX1BSRUZJWCArICdpbnNlcnQnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0UgPSBBVFRSSUJVVEVfUFJFRklYICsgJ2luc2VydC1yZWZlcmVuY2UnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9VUERBVEVSX1JFTU9WRSA9IEFUVFJJQlVURV9QUkVGSVggKyAncmVtb3ZlJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVVBEQVRFUl9CSU5EID0gQVRUUklCVVRFX1BSRUZJWCArICdiaW5kJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI3LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1RFTVBMQVRFX1BSRUZJWCA9IEFUVFJJQlVURV9QUkVGSVggKyAndGVtcGxhdGUtcHJlZml4JztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjE0LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1JPTEUgPSBBVFRSSUJVVEVfUFJFRklYICsgJ3JvbGUnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjQuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfRElTQUJMRUQgPSAnZGlzYWJsZWQnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjQuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVkFMVUUgPSAndmFsdWUnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9PQkpFQ1RMSU5LID0gQVRUUklCVVRFX1BSRUZJWCArICdvYmplY3RsaW5rJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI0LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0VSUk9STUVTU0FHRSA9IEFUVFJJQlVURV9QUkVGSVggKyAnZXJyb3InO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjQuMFxuICovXG5jb25zdCBvYmplY3RVcGRhdGVyTGlua1N5bWJvbCA9IFN5bWJvbCgnbW9uc3RlclVwZGF0ZXInKTtcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgVEFHX1NDUklQVCA9ICdzY3JpcHQnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBUQUdfU1RZTEUgPSAnc3R5bGUnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBUQUdfTElOSyA9ICdsaW5rJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuXG5jb25zdCBBVFRSSUJVVEVfSUQgPSAnaWQnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5cbmNvbnN0IEFUVFJJQlVURV9DTEFTUyA9ICdjbGFzcyc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9USVRMRSA9ICd0aXRsZSc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9TUkMgPSAnc3JjJztcbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9IUkVGID0gJ2hyZWYnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfVFlQRSA9ICd0eXBlJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX05PTkNFID0gJ25vbmNlJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1RSQU5TTEFURSA9ICd0cmFuc2xhdGUnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9UQUJJTkRFWCA9ICd0YWJpbmRleCc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1NQRUxMQ0hFQ0sgPSAnc3BlbGxjaGVjayc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1NMT1QgPSAnc2xvdCc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX1BBUlQgPSAncGFydCc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0xBTkcgPSAnbGFuZyc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1UWVBFID0gJ2l0ZW10eXBlJztcblxuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSVRFTVNDT1BFID0gJ2l0ZW1zY29wZSc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1SRUYgPSAnaXRlbXJlZic7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lURU1JRCA9ICdpdGVtaWQnO1xuXG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9JVEVNUFJPUCA9ICdpdGVtcHJvcCc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0lTID0gJ2lzJztcblxuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfSU5QVVRNT0RFID0gJ2lucHV0bW9kZSc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0FDQ0VTU0tFWSA9ICdhY2Nlc3NrZXknO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfQVVUT0NBUElUQUxJWkUgPSAnYXV0b2NhcGl0YWxpemUnO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfQVVUT0ZPQ1VTID0gJ2F1dG9mb2N1cyc7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9DT05URU5URURJVEFCTEUgPSAnY29udGVudGVkaXRhYmxlJztcblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0RJUiA9ICdkaXInO1xuXG4vKipcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHR5cGUge3N0cmluZ31cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICovXG5jb25zdCBBVFRSSUJVVEVfRFJBR0dBQkxFID0gJ2RyYWdnYWJsZSc7XG5cblxuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0VOVEVSS0VZSElOVCA9ICdlbnRlcmtleWhpbnQnO1xuLyoqXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqL1xuY29uc3QgQVRUUklCVVRFX0VYUE9SVFBBUlRTID0gJ2V4cG9ydHBhcnRzJztcbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKi9cbmNvbnN0IEFUVFJJQlVURV9ISURERU4gPSAnaGlkZGVuJztcbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aXNJdGVyYWJsZSwgaXNTdHJpbmd9IGZyb20gJy4uL3R5cGVzL2lzLm1qcyc7XG5pbXBvcnQge3ZhbGlkYXRlRnVuY3Rpb24sIHZhbGlkYXRlU3RyaW5nfSBmcm9tICcuLi90eXBlcy92YWxpZGF0ZS5tanMnO1xuaW1wb3J0IHtCYXNlfSBmcm9tICcuL2Jhc2UubWpzJztcblxuZXhwb3J0IHtUb2tlbkxpc3R9XG5cbi8qKlxuICogQSBgVG9rZW5MaXN0YCBhbGxvd3MgeW91IHRvIG1hbmFnZSB0b2tlbnMgKGluZGl2aWR1YWwgY2hhcmFjdGVyIHN0cmluZ3Mgc3VjaCBhcyBjc3MgY2xhc3NlcyBpbiBhbiBhdHRyaWJ1dGUgc3RyaW5nKS5cbiAqXG4gKiBUaGUgYFRva2VuTGlzdGAgb2ZmZXJzIHZhcmlvdXMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdmFsdWVzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBhZGQsIHJlbW92ZSBvciByZXBsYWNlIGEgY2xhc3MgaW4gYSBDU1MgbGlzdC5cbiAqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFtpdGVyYXRpb24gcHJvdG9jb2xdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0l0ZXJhdGlvbl9wcm90b2NvbHMpLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy90b2tlbmxpc3QtMS5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuY2xhc3MgVG9rZW5MaXN0IGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfGl0ZXJhdGFibGV9IGluaXRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihpbml0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudG9rZW5zID0gbmV3IFNldCgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5pdCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5hZGQoaW5pdCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdG9yIHByb3RvY29sXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3ltYm9sLml0ZXJhdG9yfVxuICAgICAqL1xuICAgIGdldEl0ZXJhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0b3JcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt7bmV4dDogKChmdW5jdGlvbigpOiAoe3ZhbHVlOiAqLCBkb25lOiBib29sZWFufSkpfCopfX1cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgLy8gVXNlIGEgbmV3IGluZGV4IGZvciBlYWNoIGl0ZXJhdG9yLiBUaGlzIG1ha2VzIG11bHRpcGxlXG4gICAgICAgIC8vIGl0ZXJhdGlvbnMgb3ZlciB0aGUgaXRlcmFibGUgc2FmZSBmb3Igbm9uLXRyaXZpYWwgY2FzZXMsXG4gICAgICAgIC8vIHN1Y2ggYXMgdXNlIG9mIGJyZWFrIG9yIG5lc3RlZCBsb29waW5nIG92ZXIgdGhlIHNhbWUgaXRlcmFibGUuXG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIGxldCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IGVudHJpZXM/LltpbmRleCsrXSwgZG9uZTogZmFsc2V9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtkb25lOiB0cnVlfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpdCBjb250YWlucyB0b2tlbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgICpcbiAgICAgKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvdG9rZW5saXN0LTIubWpzXG4gICAgICogQHBhcmFtIHthcnJheXxzdHJpbmd8aXRlcmF0YWJsZX0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjb250YWlucyh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKVxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgdmFsdWUuc3BsaXQoXCIgXCIpLmZvckVhY2godG9rZW4gPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRva2Vucy5oYXModG9rZW4udHJpbSgpKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gY291bnRlciA+IDAgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IHRva2VuIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRva2Vucy5oYXModG9rZW4udHJpbSgpKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyID4gMCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdG9rZW5zXG4gICAgICpcbiAgICAgKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvdG9rZW5saXN0LTMubWpzXG4gICAgICogQHBhcmFtIHthcnJheXxzdHJpbmd8aXRlcmF0YWJsZX0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7VG9rZW5MaXN0fVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUuc3BsaXQoXCIgXCIpLmZvckVhY2godG9rZW4gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zLmFkZCh0b2tlbi50cmltKCkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgdG9rZW4gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbnMuYWRkKHRva2VuLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgdmFsdWVcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYWxsIHRva2Vuc1xuICAgICAqXG4gICAgICogQHJldHVybnMge1Rva2VuTGlzdH1cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy50b2tlbnMuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0b2tlblxuICAgICAqXG4gICAgICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL3R5cGVzL3Rva2VubGlzdC00Lm1qc1xuICAgICAqIEBwYXJhbSB7YXJyYXl8c3RyaW5nfGl0ZXJhdGFibGV9IHZhbHVlXG4gICAgICogQHJldHVybnMge1Rva2VuTGlzdH1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHZhbHVlXG4gICAgICovXG4gICAgcmVtb3ZlKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlLnNwbGl0KFwiIFwiKS5mb3JFYWNoKHRva2VuID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5kZWxldGUodG9rZW4udHJpbSgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRva2VuIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zLmRlbGV0ZSh0b2tlbi50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHZhbHVlXCIsIFwidHlwZXMvdG9rZW5saXN0Lm1qc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJlcGxhY2VzIGEgdG9rZW4gd2l0aCBhIG5ldyB0b2tlbi5cbiAgICAgKlxuICAgICAqIGlmIHRoZSBwYXNzZWQgdG9rZW4gZXhpc3RzLCBpdCBpcyByZXBsYWNlZCB3aXRoIG5ld1Rva2VuIGFuZCBUb2tlbkxpc3QgaXMgcmV0dXJuZWQuXG4gICAgICogaWYgdGhlIHRva2VuIGRvZXMgbm90IGV4aXN0LCBuZXdUb2tlbiBpcyBub3Qgc2V0IGFuZCBUb2tlbkxpc3QgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3VG9rZW5cbiAgICAgKiBAcmV0dXJucyB7VG9rZW5MaXN0fVxuICAgICAqL1xuICAgIHJlcGxhY2UodG9rZW4sIG5ld1Rva2VuKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKHRva2VuKTtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcobmV3VG9rZW4pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnModG9rZW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhID0gQXJyYXkuZnJvbSh0aGlzLnRva2VucylcbiAgICAgICAgbGV0IGkgPSBhLmluZGV4T2YodG9rZW4pO1xuICAgICAgICBpZiAoaSA9PT0gLTEpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGEuc3BsaWNlKGksIDEsIG5ld1Rva2VuKTtcbiAgICAgICAgdGhpcy50b2tlbnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuYWRkKGEpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRva2VuIGZyb20gc3RyaW5nLiBJZiB0b2tlbiBkb2Vzbid0IGV4aXN0IGl0J3MgYWRkZWQuXG4gICAgICpcbiAgICAgKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvdG9rZW5saXN0LTUubWpzXG4gICAgICogQHBhcmFtIHthcnJheXxzdHJpbmd8aXRlcmF0YWJsZX0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHVuc3VwcG9ydGVkIHZhbHVlXG4gICAgICovXG4gICAgdG9nZ2xlKHZhbHVlKSB7XG5cbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUuc3BsaXQoXCIgXCIpLmZvckVhY2godG9rZW4gPT4ge1xuICAgICAgICAgICAgICAgIHRvZ2dsZVZhbHVlLmNhbGwodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgdG9rZW4gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0b2dnbGVWYWx1ZS5jYWxsKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCB2YWx1ZVwiLCBcInR5cGVzL3Rva2VubGlzdC5tanNcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgYW4gYXJyYXkgd2l0aCBhbGwgdG9rZW5zXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7YXJyYXl9XG4gICAgICovXG4gICAgZW50cmllcygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy50b2tlbnMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHdpdGggZWFjaCB2YWx1ZSBvZiB0aGUgc2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEByZXR1cm5zIHtUb2tlbkxpc3R9XG4gICAgICovXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrKTtcbiAgICAgICAgdGhpcy50b2tlbnMuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgdGhlIGluZGl2aWR1YWwgdG9rZW5zIHNlcGFyYXRlZCBieSBhIGJsYW5rIGNoYXJhY3RlclxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpLmpvaW4oJyAnKTtcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHRva2VuXG4gKiBAcmV0dXJucyB7dG9nZ2xlVmFsdWV9XG4gKiBAdGhyb3dzIHtFcnJvcn0gbXVzdCBiZSBjYWxsZWQgd2l0aCBUb2tlbkxpc3QuY2FsbFxuICovXG5mdW5jdGlvbiB0b2dnbGVWYWx1ZSh0b2tlbikge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUb2tlbkxpc3QpKSB0aHJvdyBFcnJvcihcIm11c3QgYmUgY2FsbGVkIHdpdGggVG9rZW5MaXN0LmNhbGxcIilcbiAgICB2YWxpZGF0ZVN0cmluZyh0b2tlbik7XG4gICAgdG9rZW4gPSB0b2tlbi50cmltKCk7XG4gICAgaWYgKHRoaXMuY29udGFpbnModG9rZW4pKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKHRva2VuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuYWRkKHRva2VuKTtcbiAgICByZXR1cm4gdGhpcztcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi9iYXNlLm1qcyc7XG5cbmV4cG9ydCB7UXVldWV9XG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgdGhlIGluc3RhbmNlIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLlF1ZXVlKClgLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9xdWV1ZS5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzdW1tYXJ5IEEgUXVldWUgKEZpZm8pXG4gKi9cbmNsYXNzIFF1ZXVlIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZWxlbWVudCBhdCB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIHdpdGhvdXQgcmVtb3ZpbmcgaXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsqfVxuICAgICAqL1xuICAgIHBlZWsoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMge1F1ZXVlfVxuICAgICAqL1xuICAgIGFkZCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaCh2YWx1ZSlcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIGFsbCBlbnRyaWVzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGVsZW1lbnQgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZVxuICAgICAqIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgcG9sbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2hpZnQoKTtcbiAgICB9XG5cblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtRdWV1ZX0gZnJvbSBcIi4vcXVldWUubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlT2JqZWN0fSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtVbmlxdWVRdWV1ZX1cblxuLyoqXG4gKiBBIFVuaXF1ZVF1ZXVlIGlzIGEgcXVldWUgdGhhdCBjb250YWlucyBpdGVtcyBvbmx5IG9uY2UuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS40LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHN1bW1hcnkgQSBxdWV1ZSBmb3IgdW5pcXVlIHZhbHVlc1xuICovXG4gY2xhc3MgVW5pcXVlUXVldWUgZXh0ZW5kcyBRdWV1ZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnVuaXF1ZSA9IG5ldyBXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAgICAgKi9cbiAgICBhZGQodmFsdWUpIHtcblxuICAgICAgICB2YWxpZGF0ZU9iamVjdCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnVuaXF1ZS5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnVuaXF1ZS5hZGQodmFsdWUpO1xuICAgICAgICAgICAgc3VwZXIuYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlbW92ZSBhbGwgZW50cmllc1xuICAgICAqXG4gICAgICogQHJldHVybnMge1F1ZXVlfVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICBzdXBlci5jbGVhcigpO1xuICAgICAgICB0aGlzLnVuaXF1ZSA9IG5ldyBXZWFrU2V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGVsZW1lbnQgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZVxuICAgICAqIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge29iamVjdH1cbiAgICAgKi9cbiAgICBwb2xsKCkge1xuXG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmRhdGEuc2hpZnQoKTtcbiAgICAgICAgdGhpcy51bmlxdWUuZGVsZXRlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuXG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4vYmFzZS5tanMnO1xuaW1wb3J0IHtpc09iamVjdH0gZnJvbSAnLi9pcy5tanMnO1xuaW1wb3J0IHtUb2tlbkxpc3R9IGZyb20gJy4vdG9rZW5saXN0Lm1qcyc7XG5pbXBvcnQge1VuaXF1ZVF1ZXVlfSBmcm9tICcuL3VuaXF1ZXF1ZXVlLm1qcyc7XG5cbmV4cG9ydCB7T2JzZXJ2ZXJ9XG5cbi8qKlxuICogQW4gb2JzZXJ2ZXIgbWFuYWdlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uXG4gKlxuICogVGhlIHVwZGF0ZSBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIHN1YmplY3Qgb2JqZWN0IGFzIHRoaXMgcG9pbnRlci4gRm9yIHRoaXMgcmVhc29uIHRoZSBjYWxsYmFjayBzaG91bGQgbm90XG4gKiBiZSBhbiBhcnJvdyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBnZXRzIHRoaXMgcG9pbnRlciBvZiBpdHMgb3duIGNvbnRleHQuXG4gKlxuICogYGBganNcbiAqIG5ldyBPYnNlcnZlcigoKT0+e1xuICogICAgIC8vIHRoaXMgaXMgbm90IHN1YmplY3RcbiAqIH0pXG4gKlxuICogbmV3IE9ic2VydmVyKGZ1bmN0aW9uKCkge1xuICogICAgIC8vIHRoaXMgaXMgc3ViamVjdFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIGNhbiBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLiBUbyBkbyB0aGlzLCBzaW1wbHkgc3BlY2lmeSB0aGVtLlxuICpcbiAqIGBgYGpzXG4gKiBPYnNlcnZlcihmdW5jdGlvbihhLCBiLCBjKSB7XG4gKiAgICAgY29uc29sZS5sb2coYSwgYiwgYyk7IC8vIFx1MjFBNiBcImFcIiwgMiwgdHJ1ZSBcbiAqIH0sIFwiYVwiLCAyLCB0cnVlKVxuICogYGBgXG4gKlxuICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG11c3QgaGF2ZSBhcyBtYW55IHBhcmFtZXRlcnMgYXMgYXJndW1lbnRzIGFyZSBnaXZlbi5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvb2JzZXJ2ZXIubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmNsYXNzIE9ic2VydmVyIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHsqfSBhcmdzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2FsbGJhY2ssIC4uLmFyZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvYnNlcnZlciBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIilcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICB0aGlzLnRhZ3MgPSBuZXcgVG9rZW5MaXN0O1xuICAgICAgICB0aGlzLnF1ZXVlID0gbmV3IFVuaXF1ZVF1ZXVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAgICogQHJldHVybnMge09ic2VydmVyfVxuICAgICAqL1xuICAgIGFkZFRhZyh0YWcpIHtcbiAgICAgICAgdGhpcy50YWdzLmFkZCh0YWcpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICAgKiBAcmV0dXJucyB7T2JzZXJ2ZXJ9XG4gICAgICovXG4gICAgcmVtb3ZlVGFnKHRhZykge1xuICAgICAgICB0aGlzLnRhZ3MucmVtb3ZlKHRhZyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldFRhZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZ3MuZW50cmllcygpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaGFzVGFnKHRhZykge1xuICAgICAgICByZXR1cm4gdGhpcy50YWdzLmNvbnRhaW5zKHRhZylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBzdWJqZWN0XG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgdXBkYXRlKHN1YmplY3QpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWlzT2JqZWN0KHN1YmplY3QpKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KFwic3ViamVjdCBtdXN0IGJlIGFuIG9iamVjdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGYucXVldWUuYWRkKHN1YmplY3QpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBhbmQgdGhlIHNldHRpbWVvdXQgZW5zdXJlIHRoYXQgYW4gb2JqZWN0IGlzIG5vdCBcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtZWQgb2YgdGhlIHNhbWUgY2hhbmdlIG1vcmUgdGhhbiBvbmNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5xdWV1ZS5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzID0gc2VsZi5xdWV1ZS5wb2xsKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBzZWxmLmNhbGxiYWNrLmFwcGx5KHMsIHNlbGYuYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocmVzdWx0KSAmJiByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMClcblxuICAgICAgICB9KTtcblxuICAgIH07XG5cbn1cbiIsICJcblxuLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi9iYXNlLm1qcyc7XG5pbXBvcnQge09ic2VydmVyfSBmcm9tIFwiLi9vYnNlcnZlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZX0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7T2JzZXJ2ZXJMaXN0fVxuXG4vKipcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhlIE9ic2VydmVyTGlzdCBjbGFzcywgb2JzZXJ2ZXIgY2FuIGJlIG1hbmFnZWQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5jbGFzcyBPYnNlcnZlckxpc3QgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgICAqIEByZXR1cm4ge09ic2VydmVyTGlzdH1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBPYnNlcnZlclxuICAgICAqL1xuICAgIGF0dGFjaChvYnNlcnZlcikge1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKG9ic2VydmVyLCBPYnNlcnZlcilcblxuICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJuIHtPYnNlcnZlckxpc3R9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgT2JzZXJ2ZXJcbiAgICAgKi9cbiAgICBkZXRhY2gob2JzZXJ2ZXIpIHtcbiAgICAgICAgdmFsaWRhdGVJbnN0YW5jZShvYnNlcnZlciwgT2JzZXJ2ZXIpXG5cbiAgICAgICAgdmFyIGkgPSAwLCBsID0gdGhpcy5vYnNlcnZlcnMubGVuZ3RoO1xuICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXJzW2ldID09PSBvYnNlcnZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBPYnNlcnZlclxuICAgICAqL1xuICAgIGNvbnRhaW5zKG9ic2VydmVyKSB7XG4gICAgICAgIHZhbGlkYXRlSW5zdGFuY2Uob2JzZXJ2ZXIsIE9ic2VydmVyKVxuICAgICAgICB2YXIgaSA9IDAsIGwgPSB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlcnNbaV0gPT09IG9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdWJqZWN0XG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBub3RpZnkoc3ViamVjdCkge1xuXG4gICAgICAgIGxldCBwb21pc2VzID0gW11cblxuICAgICAgICBsZXQgaSA9IDAsIGwgPSB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBwb21pc2VzLnB1c2godGhpcy5vYnNlcnZlcnNbaV0udXBkYXRlKHN1YmplY3QpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwb21pc2VzKTtcbiAgICB9O1xuXG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4vYmFzZS5tanMnO1xuaW1wb3J0IHtpc0FycmF5LCBpc09iamVjdCwgaXNQcmltaXRpdmV9IGZyb20gXCIuL2lzLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4vb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge09ic2VydmVyTGlzdH0gZnJvbSBcIi4vb2JzZXJ2ZXJsaXN0Lm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuXG5leHBvcnQge1Byb3h5T2JzZXJ2ZXJ9XG5cbi8qKlxuICogQW4gb2JzZXJ2ZXIgbWFuYWdlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uXG4gKlxuICogV2l0aCB0aGUgUHJveHlPYnNlcnZlciB5b3UgY2FuIGF0dGFjaCBvYnNlcnZlciBmb3Igb2JzZXJ2YXRpb24uIFxuICogV2l0aCBlYWNoIGNoYW5nZSBhdCB0aGUgb2JqZWN0IHRvIGJlIG9ic2VydmVkIGFuIHVwZGF0ZSB0YWtlcyBwbGFjZS5cbiAqXG4gKiBUaGlzIGFsc28gYXBwbGllcyB0byBuZXN0ZWQgb2JqZWN0cy5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvcHJveHlvYnNlcnZlci5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuIGNsYXNzIFByb3h5T2JzZXJ2ZXIgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob2JqZWN0KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5yZWFsU3ViamVjdCA9IHZhbGlkYXRlT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHRoaXMuc3ViamVjdCA9IG5ldyBQcm94eShvYmplY3QsIGdldEhhbmRsZXIuY2FsbCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5vYmplY3RNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB0aGlzLm9iamVjdE1hcC5zZXQodGhpcy5yZWFsU3ViamVjdCwgdGhpcy5zdWJqZWN0KTtcblxuICAgICAgICB0aGlzLnByb3h5TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgdGhpcy5wcm94eU1hcC5zZXQodGhpcy5zdWJqZWN0LCB0aGlzLnJlYWxTdWJqZWN0KTtcblxuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG5ldyBPYnNlcnZlckxpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSByZWFsIG9iamVjdFxuICAgICAqXG4gICAgICogY2hhbmdlcyB0byB0aGlzIG9iamVjdCBhcmUgbm90IG5vdGljZWQgYnkgdGhlIG9ic2VydmVycywgc28geW91IGNhbiBtYWtlIGEgbGFyZ2UgbnVtYmVyIG9mIGNoYW5nZXMgYW5kIGluZm9ybSB0aGUgb2JzZXJ2ZXJzIGxhdGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBnZXRTdWJqZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJqZWN0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHNpbmNlIDEuMjQuMFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLlR5cGVzLlByb3h5T2JzZXJ2ZXJ9XG4gICAgICovXG4gICAgc2V0U3ViamVjdChvYmopIHtcblxuICAgICAgICBsZXQgaSwgayA9IE9iamVjdC5rZXlzKHRoaXMuc3ViamVjdCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdWJqZWN0W2tbaV1dO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJqZWN0ID0gZXh0ZW5kKHRoaXMuc3ViamVjdCwgb2JqKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSBwcm94aWVkIG9iamVjdFxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBnZXRSZWFsU3ViamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhbFN1YmplY3RcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhdHRhY2ggYSBuZXcgb2JzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVybnMge1Byb3h5T2JzZXJ2ZXJ9XG4gICAgICovXG4gICAgYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMuYXR0YWNoKG9ic2VydmVyKVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZXRhY2ggYSBvYnNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7UHJveHlPYnNlcnZlcn1cbiAgICAgKi9cbiAgICBkZXRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuICAgICAgICB0aGlzLm9ic2VydmVycy5kZXRhY2gob2JzZXJ2ZXIpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG5vdGlmeSBhbGwgb2JzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIG5vdGlmeU9ic2VydmVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLm5vdGlmeSh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNvbnRhaW5zT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmNvbnRhaW5zKG9ic2VydmVyKVxuICAgIH1cblxufVxuXG4vKipcbiAqXG4gKiBAcmV0dXJucyB7e2RlZmluZVByb3BlcnR5OiAoZnVuY3Rpb24oKj0sICo9LCAqPSk6ICopLCBzZXRQcm90b3R5cGVPZjogKGZ1bmN0aW9uKCosICo9KTogYm9vbGVhbiksIHNldDogKGZ1bmN0aW9uKCosICosICosICopOiBib29sZWFuKSwgZ2V0OiAoKGZ1bmN0aW9uKCo9LCAqPSwgKj0pOiAodW5kZWZpbmVkKSl8KiksIGRlbGV0ZVByb3BlcnR5OiAoKGZ1bmN0aW9uKCosICopOiAoYm9vbGVhbikpfCopfX1cbiAqIEBwcml2YXRlXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS8tL3NuaXBwZXRzLzQ5fVxuICovXG5mdW5jdGlvbiBnZXRIYW5kbGVyKCkge1xuXG4gICAgY29uc3QgcHJveHkgPSB0aGlzO1xuXG4gICAgLy8gaHR0cHM6Ly8yNjIuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy85LjAvI3NlYy1wcm94eS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICBjb25zdCBoYW5kbGVyID0ge1xuXG4gICAgICAgIC8vIGh0dHBzOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvOS4wLyNzZWMtcHJveHktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzLWdldC1wLXJlY2VpdmVyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKHRhcmdldCwga2V5LCByZWNlaXZlcikge1xuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZXQgdmFsdWUgYXMgcHJveHkgaWYgb2JqZWN0IG9yIGFycmF5XG4gICAgICAgICAgICBpZiAoKGlzQXJyYXkodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJveHkub2JqZWN0TWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5Lm9iamVjdE1hcC5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJveHkucHJveHlNYXAuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHAgPSBuZXcgUHJveHkodmFsdWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICBwcm94eS5vYmplY3RNYXAuc2V0KHZhbHVlLCBwKTtcbiAgICAgICAgICAgICAgICAgICAgcHJveHkucHJveHlNYXAuc2V0KHAsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIGh0dHBzOi8vMjYyLmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvOS4wLyNzZWMtcHJveHktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzLXNldC1wLXYtcmVjZWl2ZXIgXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpIHtcblxuICAgICAgICAgICAgaWYgKHByb3h5LnByb3h5TWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3h5LnByb3h5TWFwLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm94eS5wcm94eU1hcC5oYXModGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHByb3h5LnByb3h5TWFwLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG4gICAgICAgICAgICBpZiAocHJveHkucHJveHlNYXAuaGFzKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHByb3h5LnByb3h5TWFwLmdldChjdXJyZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICBsZXQgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcblxuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc2NyaXB0b3JbJ3ZhbHVlJ10gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgICAgIHByb3h5Lm9ic2VydmVycy5ub3RpZnkocHJveHkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLy8gaHR0cHM6Ly8yNjIuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy85LjAvI3NlYy1wcm94eS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHMtZGVsZXRlLXBcbiAgICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W2tleV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm94eS5vYnNlcnZlcnMubm90aWZ5KHByb3h5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBodHRwczovLzI2Mi5lY21hLWludGVybmF0aW9uYWwub3JnLzkuMC8jc2VjLXByb3h5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90cy1kZWZpbmVvd25wcm9wZXJ0eS1wLWRlc2NcbiAgICAgICAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgICAgIHByb3h5Lm9ic2VydmVycy5ub3RpZnkocHJveHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBodHRwczovLzI2Mi5lY21hLWludGVybmF0aW9uYWwub3JnLzkuMC8jc2VjLXByb3h5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90cy1zZXRwcm90b3R5cGVvZi12XG4gICAgICAgIHNldFByb3RvdHlwZU9mOiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBSZWZsZWN0LnNldFByb3RvdHlwZU9mKG9iamVjdDEsIGtleSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICAgICAgcHJveHkub2JzZXJ2ZXJzLm5vdGlmeShwcm94eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH07XG5cblxuICAgIHJldHVybiBoYW5kbGVyO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHtpc1N0cmluZ30gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlQXJyYXksIHZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtNZWRpYVR5cGUsIHBhcnNlTWVkaWFUeXBlfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbCA9IFN5bWJvbCgnaW50ZXJuYWwnKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZVxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuXG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgYW4gb2JqZWN0IHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLk1lZGlhVHlwZSgpYC5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjguMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmNsYXNzIE1lZGlhVHlwZSBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJ0eXBlXG4gICAgICogQHBhcmFtIHtNb25zdGVyLlR5cGVzLlBhcmFtZXRlcltdfSBwYXJhbWV0ZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBzdWJ0eXBlLCBwYXJhbWV0ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW2ludGVybmFsXSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHZhbGlkYXRlU3RyaW5nKHR5cGUpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBzdWJ0eXBlOiB2YWxpZGF0ZVN0cmluZyhzdWJ0eXBlKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgcGFyYW1ldGVyOiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzW2ludGVybmFsXVsncGFyYW1ldGVyJ10gPSB2YWxpZGF0ZUFycmF5KHBhcmFtZXRlcik7XG4gICAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbF0udHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IHN1YnR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsXS5zdWJ0eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuVHlwZXMuUGFyYW1ldGVyW119XG4gICAgICovXG4gICAgZ2V0IHBhcmFtZXRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxdLnBhcmFtZXRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqXG4gICAgICogQHJldHVybiB7TWFwfVxuICAgICAqL1xuICAgIGdldCBwYXJhbWV0ZXIoKSB7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcFxuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxdWydwYXJhbWV0ZXInXS5mb3JFYWNoKHAgPT4ge1xuXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwLnZhbHVlO1xuXG4gICAgICAgICAgICAvLyBpbnRlcm5hbGx5IHNwZWNpYWwgdmFsdWVzIGFyZSBwYXJ0bHkgc3RvcmVkIHdpdGggcXVvdGVzLCB0aGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlbS5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5zZXQocC5rZXksIHZhbHVlKTtcbiAgICAgICAgfSlcblxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG5cbiAgICAgICAgbGV0IHBhcmFtZXRlciA9IFtdO1xuICAgICAgICBmb3IgKGxldCBhIG9mIHRoaXNbaW50ZXJuYWxdLnBhcmFtZXRlcikge1xuICAgICAgICAgICAgcGFyYW1ldGVyLnB1c2goYS5rZXkgKyAnPScgKyBhLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsXS50eXBlICsgJy8nICsgdGhpc1tpbnRlcm5hbF0uc3VidHlwZSArIChwYXJhbWV0ZXIubGVuZ3RoID4gMCA/ICc7JyArIHBhcmFtZXRlci5qb2luKCc7JykgOiAnJyk7XG4gICAgfVxuXG59XG5cbi8qKlxuICogWW91IGNhbiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLlR5cGVzLnBhcnNlTWVkaWFUeXBlKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge01vbnN0ZXJ9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlLy9tb25zdGVyLm1qcyc7XG4gKiBjb25zb2xlLmxvZyhNb25zdGVyLlR5cGVzLnBhcnNlTWVkaWFUeXBlKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyBpbnRlZ3JhdGUgdGhpcyBmdW5jdGlvbiBpbmRpdmlkdWFsbHkuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7cGFyc2VNZWRpYVR5cGV9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlL3R5cGVzL2RhdGF1cmwubWpzJztcbiAqIGNvbnNvbGUubG9nKHBhcnNlTWVkaWFUeXBlKCkpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIFNwZWNpZmljYXRpb246XG4gKlxuICogYGBgXG4gKiBkYXRhdXJsICAgIDo9IFwiZGF0YTpcIiBbIG1lZGlhdHlwZSBdIFsgXCI7YmFzZTY0XCIgXSBcIixcIiBkYXRhXG4gKiBtZWRpYXR5cGUgIDo9IFsgdHlwZSBcIi9cIiBzdWJ0eXBlIF0gKiggXCI7XCIgcGFyYW1ldGVyIClcbiAqIGRhdGEgICAgICAgOj0gKnVybGNoYXJcbiAqIHBhcmFtZXRlciAgOj0gYXR0cmlidXRlIFwiPVwiIHZhbHVlXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVkaWF0eXBlXG4gKiBAcmV0dXJuIHtNb25zdGVyLlR5cGVzLk1lZGlhVHlwZX1cbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyMDQ1I3NlY3Rpb24tNS4xXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHRoZSBtaW1ldHlwZSBjYW4gbm90IGJlIHBhcnNlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSBibGFuayB2YWx1ZSBpcyBub3QgYWxsb3dlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSBtYWxmb3JtZWQgZGF0YSB1cmxcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWVkaWFUeXBlKG1lZGlhdHlwZSkge1xuXG4gICAgY29uc3QgcmVnZXggPSAvKD88dHlwZT5bQS1aYS16XSt8XFwqKVxcLyg/PHN1YnR5cGU+KFthLXpBLVowLTkuXFwrX1xcLV0rKXxcXCp8KSg/PHBhcmFtZXRlcj5cXHMqO1xccyooW2EtekEtWjAtOV0rKVxccyooPVxccyooXCI/W0EtWmEtejAtOV9cXC1dK1wiPykpPykqL2c7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVnZXguZXhlYyh2YWxpZGF0ZVN0cmluZyhtZWRpYXR5cGUpKTtcblxuICAgIGNvbnN0IGdyb3VwcyA9IHJlc3VsdD8uWydncm91cHMnXTtcbiAgICBpZiAoZ3JvdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhlIG1pbWV0eXBlIGNhbiBub3QgYmUgcGFyc2VkJylcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gZ3JvdXBzPy5bJ3R5cGUnXTtcbiAgICBjb25zdCBzdWJ0eXBlID0gZ3JvdXBzPy5bJ3N1YnR5cGUnXTtcbiAgICBjb25zdCBwYXJhbWV0ZXIgPSBncm91cHM/LlsncGFyYW1ldGVyJ107XG5cbiAgICBpZiAoc3VidHlwZSA9PT0gXCJcIiB8fCB0eXBlID09PSBcIlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2JsYW5rIHZhbHVlIGlzIG5vdCBhbGxvd2VkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNZWRpYVR5cGUodHlwZSwgc3VidHlwZSwgcGFyc2VQYXJhbWV0ZXIocGFyYW1ldGVyKSk7XG5cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjE4LjBcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbWV0ZXJcbiAqIEByZXR1cm4ge01vbnN0ZXIuVHlwZXMuUGFyYW1ldGVyW118dW5kZWZpbmVkfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VQYXJhbWV0ZXIocGFyYW1ldGVyKSB7XG5cbiAgICBpZiAoIWlzU3RyaW5nKHBhcmFtZXRlcikpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gW107XG5cbiAgICBwYXJhbWV0ZXIuc3BsaXQoJzsnKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuXG4gICAgICAgIGVudHJ5ID0gZW50cnkudHJpbSgpO1xuICAgICAgICBpZiAoZW50cnkgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGt2ID0gZW50cnkuc3BsaXQoJz0nKVxuXG4gICAgICAgIGxldCBrZXkgPSB2YWxpZGF0ZVN0cmluZyhrdj8uWzBdKS50cmltKCk7XG4gICAgICAgIGxldCB2YWx1ZSA9IHZhbGlkYXRlU3RyaW5nKGt2Py5bMV0pLnRyaW0oKTtcblxuICAgICAgICAvLyBpZiB2YWx1ZXMgYXJlIHF1b3RlZCwgdGhleSByZW1haW4gc28gaW50ZXJuYWxseVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KVxuXG5cbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHtpc1N0cmluZ30gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQge01lZGlhVHlwZSwgcGFyc2VNZWRpYVR5cGV9IGZyb20gXCIuL21lZGlhdHlwZS5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVCb29sZWFuLCB2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7RGF0YVVybCwgcGFyc2VEYXRhVVJMfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbCA9IFN5bWJvbCgnaW50ZXJuYWwnKTtcblxuLyoqXG4gKiBZb3UgY2FuIGNyZWF0ZSBhbiBvYmplY3QgdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgbmV3IE1vbnN0ZXIuVHlwZXMuRGF0YVVybCgpYC5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjguMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvRGF0YV9VUklzXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjM5N1xuICovXG5jbGFzcyBEYXRhVXJsIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50XG4gICAgICogQHBhcmFtIHtTdHJpbmd8TW9uc3Rlci5UeXBlcy5NZWRpYVR5cGV9IG1lZGlhdHlwZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYmFzZTY0PXRydWVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb250ZW50LCBtZWRpYXR5cGUsIGJhc2U2NCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmIChpc1N0cmluZyhtZWRpYXR5cGUpKSB7XG4gICAgICAgICAgICBtZWRpYXR5cGUgPSBwYXJzZU1lZGlhVHlwZShtZWRpYXR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1tpbnRlcm5hbF0gPSB7XG4gICAgICAgICAgICBjb250ZW50OiB2YWxpZGF0ZVN0cmluZyhjb250ZW50KSxcbiAgICAgICAgICAgIG1lZGlhdHlwZTogdmFsaWRhdGVJbnN0YW5jZShtZWRpYXR5cGUsIE1lZGlhVHlwZSksXG4gICAgICAgICAgICBiYXNlNjQ6IHZhbGlkYXRlQm9vbGVhbihiYXNlNjQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBiYXNlNjQpXG4gICAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsXS5iYXNlNjQgPyBhdG9iKHRoaXNbaW50ZXJuYWxdLmNvbnRlbnQpIDogdGhpc1tpbnRlcm5hbF0uY29udGVudDtcbiAgICB9XG5cbiAgICBnZXQgbWVkaWF0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbF0ubWVkaWF0eXBlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzIzOTdcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcblxuICAgICAgICBsZXQgY29udGVudCA9IHRoaXNbaW50ZXJuYWxdLmNvbnRlbnQ7XG5cbiAgICAgICAgaWYgKHRoaXNbaW50ZXJuYWxdLmJhc2U2NCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udGVudCA9ICc7YmFzZTY0LCcgKyBjb250ZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudCA9ICcsJyArIGVuY29kZVVSSUNvbXBvbmVudChjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnZGF0YTonICsgdGhpc1tpbnRlcm5hbF0ubWVkaWF0eXBlLnRvU3RyaW5nKCkgKyBjb250ZW50O1xuICAgIH1cblxufVxuXG4vKipcbiAqIFlvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5UeXBlcy5wYXJzZURhdGFVUkwoKWAuXG4gKlxuICogU3BlY2lmaWNhdGlvbjpcbiAqXG4gKiBgYGBcbiAqIGRhdGF1cmwgICAgOj0gXCJkYXRhOlwiIFsgbWVkaWF0eXBlIF0gWyBcIjtiYXNlNjRcIiBdIFwiLFwiIGRhdGFcbiAqIG1lZGlhdHlwZSAgOj0gWyB0eXBlIFwiL1wiIHN1YnR5cGUgXSAqKCBcIjtcIiBwYXJhbWV0ZXIgKVxuICogZGF0YSAgICAgICA6PSAqdXJsY2hhclxuICogcGFyYW1ldGVyICA6PSBhdHRyaWJ1dGUgXCI9XCIgdmFsdWVcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhdXJsXG4gKiBAcmV0dXJuIHtNb25zdGVyLlR5cGVzLkRhdGFVcmx9XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvRGF0YV9VUklzXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjM5N1xuICogQHRocm93cyB7VHlwZUVycm9yfSBpbmNvcnJlY3Qgb3IgbWlzc2luZyBkYXRhIHByb3RvY29sXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IG1hbGZvcm1lZCBkYXRhIHVybFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VEYXRhVVJMKGRhdGF1cmwpIHtcblxuICAgIHZhbGlkYXRlU3RyaW5nKGRhdGF1cmwpO1xuXG4gICAgZGF0YXVybCA9IGRhdGF1cmwudHJpbSgpO1xuXG4gICAgaWYgKGRhdGF1cmwuc3Vic3RyaW5nKDAsIDUpICE9PSAnZGF0YTonKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2luY29ycmVjdCBvciBtaXNzaW5nIGRhdGEgcHJvdG9jb2wnKVxuICAgIH1cblxuICAgIGRhdGF1cmwgPSBkYXRhdXJsLnN1YnN0cmluZyg1KTtcblxuICAgIGxldCBwID0gZGF0YXVybC5pbmRleE9mKCcsJyk7XG4gICAgaWYgKHAgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hbGZvcm1lZCBkYXRhIHVybCcpXG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnQgPSBkYXRhdXJsLnN1YnN0cmluZyhwICsgMSk7XG4gICAgbGV0IG1lZGlhdHlwZUFuZEJhc2U2NCA9IGRhdGF1cmwuc3Vic3RyaW5nKDAsIHApLnRyaW0oKTtcbiAgICBsZXQgbWVkaWF0eXBlID0gJ3RleHQvcGxhaW47Y2hhcnNldD1VUy1BU0NJSSc7XG4gICAgbGV0IGJhc2U2NEZsYWcgPSBmYWxzZTtcblxuICAgIGlmIChtZWRpYXR5cGVBbmRCYXNlNjQgIT09IFwiXCIpIHtcbiAgICAgICAgbWVkaWF0eXBlID0gbWVkaWF0eXBlQW5kQmFzZTY0O1xuICAgICAgICBpZiAobWVkaWF0eXBlQW5kQmFzZTY0LmVuZHNXaXRoKCdiYXNlNjQnKSkge1xuICAgICAgICAgICAgbGV0IGkgPSBtZWRpYXR5cGVBbmRCYXNlNjQubGFzdEluZGV4T2YoJzsnKTtcbiAgICAgICAgICAgIG1lZGlhdHlwZSA9IG1lZGlhdHlwZUFuZEJhc2U2NC5zdWJzdHJpbmcoMCwgaSk7XG4gICAgICAgICAgICBiYXNlNjRGbGFnID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBkZWNvZGVVUklDb21wb25lbnQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZWRpYXR5cGUgPSBwYXJzZU1lZGlhVHlwZShtZWRpYXR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSBkZWNvZGVVUklDb21wb25lbnQoY29udGVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRhVXJsKGNvbnRlbnQsIG1lZGlhdHlwZSwgYmFzZTY0RmxhZyk7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2lzQXJyYXksIGlzT2JqZWN0fSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVvZi5tanNcIjtcblxuZXhwb3J0IHtkaWZmfVxuXG4vKipcbiAqIFdpdGggdGhlIGRpZmYgZnVuY3Rpb24geW91IGNhbiBwZXJmb3JtIHRoZSBjaGFuZ2Ugb2Ygb25lIG9iamVjdCB0byBhbm90aGVyLiBUaGUgcmVzdWx0IHNob3dzIHRoZSBjaGFuZ2VzIG9mIHRoZSBzZWNvbmQgb2JqZWN0IHRvIHRoZSBmaXJzdCBvYmplY3QuXG4gKlxuICogVGhlIG9wZXJhdG9yIGBhZGRgIG1lYW5zIHRoYXQgc29tZXRoaW5nIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBzZWNvbmQgb2JqZWN0LiBgZGVsZXRlYCBtZWFucyB0aGF0IHNvbWV0aGluZyBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIHNlY29uZCBvYmplY3QgY29tcGFyZWQgdG8gdGhlIGZpcnN0IG9iamVjdC5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvZGF0YS9kaWZmLm1qc1xuICogQHBhcmFtIHsqfSBmaXJzdFxuICogQHBhcmFtIHsqfSBzZWNvbmRcbiAqIEByZXR1cm4ge2FycmF5fVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKi9cbmZ1bmN0aW9uIGRpZmYoZmlyc3QsIHNlY29uZCkge1xuICAgIHJldHVybiBkb0RpZmYoZmlyc3QsIHNlY29uZClcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcGFyYW0gdHlwZVxuICogQHJldHVybiB7U2V0PHN0cmluZz58U2V0PG51bWJlcj59XG4gKi9cbmZ1bmN0aW9uIGdldEtleXMoYSwgYiwgdHlwZSkge1xuICAgIGlmIChpc0FycmF5KHR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBhLmxlbmd0aCA+IGIubGVuZ3RoID8gbmV3IEFycmF5KGEubGVuZ3RoKSA6IG5ldyBBcnJheShiLmxlbmd0aCk7XG4gICAgICAgIGtleXMuZmlsbCgwKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoa2V5cy5tYXAoKF8sIGkpID0+IGkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFNldChPYmplY3Qua2V5cyhhKS5jb25jYXQoT2JqZWN0LmtleXMoYikpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIGRpZmZcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5mdW5jdGlvbiBkb0RpZmYoYSwgYiwgcGF0aCwgZGlmZikge1xuXG4gICAgbGV0IHR5cGVBID0gdHlwZU9mKGEpXG4gICAgbGV0IHR5cGVCID0gdHlwZU9mKGIpXG5cbiAgICBjb25zdCBjdXJyUGF0aCA9IHBhdGggfHwgW107XG4gICAgY29uc3QgY3VyckRpZmYgPSBkaWZmIHx8IFtdO1xuXG4gICAgaWYgKHR5cGVBID09PSB0eXBlQiAmJiAodHlwZUEgPT09ICdvYmplY3QnIHx8IHR5cGVBID09PSdhcnJheScpKSB7IFxuXG4gICAgICAgIGdldEtleXMoYSwgYiwgdHlwZUEpLmZvckVhY2goKHYpID0+IHtcblxuICAgICAgICAgICAgaWYgKCEoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIHYpKSkge1xuICAgICAgICAgICAgICAgIGN1cnJEaWZmLnB1c2goYnVpbGRSZXN1bHQoYVt2XSwgYlt2XSwgJ2FkZCcsIGN1cnJQYXRoLmNvbmNhdCh2KSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCB2KSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyRGlmZi5wdXNoKGJ1aWxkUmVzdWx0KGFbdl0sIGJbdl0sICdkZWxldGUnLCBjdXJyUGF0aC5jb25jYXQodikpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9EaWZmKGFbdl0sIGJbdl0sIGN1cnJQYXRoLmNvbmNhdCh2KSwgY3VyckRpZmYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgY29uc3QgbyA9IGdldE9wZXJhdG9yKGEsIGIsIHR5cGVBLCB0eXBlQik7XG4gICAgICAgIGlmIChvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJEaWZmLnB1c2goYnVpbGRSZXN1bHQoYSwgYiwgbywgcGF0aCkpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gY3VyckRpZmY7XG5cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvclxuICogQHBhcmFtIHthcnJheX0gcGF0aFxuICogQHJldHVybiB7e3BhdGg6IGFycmF5LCBvcGVyYXRvcjogc3RyaW5nfX1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUmVzdWx0KGEsIGIsIG9wZXJhdG9yLCBwYXRoKSB7XG5cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIG9wZXJhdG9yLFxuICAgICAgICBwYXRoLFxuICAgIH07XG5cbiAgICBpZiAob3BlcmF0b3IgIT09ICdhZGQnKSB7XG4gICAgICAgIHJlc3VsdC5maXJzdCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBhLFxuICAgICAgICAgICAgdHlwZTogdHlwZW9mIGFcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaXNPYmplY3QoYSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSk/LmNvbnN0cnVjdG9yPy5uYW1lO1xuICAgICAgICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5maXJzdC5pbnN0YW5jZSA9IG5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09ICdhZGQnIHx8IG9wZXJhdG9yID09PSAndXBkYXRlJykge1xuICAgICAgICByZXN1bHQuc2Vjb25kID0ge1xuICAgICAgICAgICAgdmFsdWU6IGIsXG4gICAgICAgICAgICB0eXBlOiB0eXBlb2YgYlxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpc09iamVjdChiKSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihiKT8uY29uc3RydWN0b3I/Lm5hbWU7XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNlY29uZC5pbnN0YW5jZSA9IG5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05vdEVxdWFsKGEsIGIpIHtcblxuICAgIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBhLmdldFRpbWUoKSAhPT0gYi5nZXRUaW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGEgIT09IGI7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRvcihhLCBiKSB7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBsZXQgb3BlcmF0b3I7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGxldCB0eXBlQSA9IHR5cGVvZiBhO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgdHlwZUIgPSB0eXBlb2YgYjtcblxuICAgIGlmICh0eXBlQSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZUIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9wZXJhdG9yID0gJ2FkZCc7XG4gICAgfSBlbHNlIGlmICh0eXBlQSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZUIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9wZXJhdG9yID0gJ2RlbGV0ZSc7XG4gICAgfSBlbHNlIGlmIChpc05vdEVxdWFsKGEsIGIpKSB7XG4gICAgICAgIG9wZXJhdG9yID0gJ3VwZGF0ZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wZXJhdG9yO1xuXG59XG4iLCAiXG5cbi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuXG5pbXBvcnQge0lEfSBmcm9tIFwiLi4vdHlwZXMvaWQubWpzXCI7XG5pbXBvcnQge2lzT2JqZWN0fSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7dHJpbVNwYWNlc31cblxuLyoqXG4gKiBUaGlzIHNwZWNpYWwgdHJpbSBmdW5jdGlvbiBhbGxvd3MgdG8gdHJpbSBzcGFjZXMgdGhhdCBoYXZlIGJlZW4gcHJvdGVjdGVkIGJ5IGEgc3BlY2lhbCBlc2NhcGUgY2hhcmFjdGVyLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge3RyaW1TcGFjZXN9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlL3V0aWwvdHJpbXNwYWNlcy5tanMnO1xuICogdHJpbVNwYWNlcygnIGhlbGxvIFxcXFwgJylcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKiBcbiAqIEhpbnQ6IE9uZSBzdHJva2UgaXMgZXNjYXBlZCBieSB0aGUgamF2YXNjcmlwdCBpbnRlcnByZXRlciwgdGhlIHNlY29uZCBzdHJva2UgZXNjYXBlcyB0aGUgc3Ryb2tlLlxuICogXG4gKiBgYGB0ZXh0XG4gKiBhXFwgYiAgXHUyMUE2IGEgYlxuICogYVxcXFwgYiBcdTIxQTYgYVxcIGJcbiAqIGBgYFxuICogXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI0LjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlV0aWxcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKi9cbiBmdW5jdGlvbiB0cmltU3BhY2VzKHZhbHVlKSB7XG5cbiAgICB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG5cbiAgICBsZXQgcGxhY2Vob2xkZXIgPSBuZXcgTWFwO1xuICAgIGNvbnN0IHJlZ2V4ID0gLygoPzxwYXR0ZXJuPlxcXFwoPzxjaGFyPi4pKXsxfSkvbWlnO1xuXG4gICAgLy8gVGhlIHNlcGFyYXRvciBmb3IgYXJncyBtdXN0IGJlIGVzY2FwZWRcbiAgICAvLyB1bmRlZmluZWQgc3RyaW5nIHdoaWNoIHNob3VsZCBub3Qgb2NjdXIgbm9ybWFsbHkgYW5kIGlzIGFsc28gbm90IGEgcmVnZXhcbiAgICBsZXQgcmVzdWx0ID0gdmFsdWUubWF0Y2hBbGwocmVnZXgpXG5cbiAgICBmb3IgKGxldCBtIG9mIHJlc3VsdCkge1xuICAgICAgICBsZXQgZyA9IG0/LlsnZ3JvdXBzJ107XG4gICAgICAgIGlmICghaXNPYmplY3QoZykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHAgPSBnPy5bJ3BhdHRlcm4nXTtcbiAgICAgICAgbGV0IGMgPSBnPy5bJ2NoYXInXTtcblxuICAgICAgICBpZiAocCAmJiBjKSB7XG4gICAgICAgICAgICBsZXQgciA9ICdfXycgKyBuZXcgSUQoKS50b1N0cmluZygpICsgJ19fJztcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLnNldChyLCBjKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShwLCByKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgcGxhY2Vob2xkZXIuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoaywgJ1xcXFwnICsgdilcbiAgICB9KVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuXG59XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge2dldERvY3VtZW50LCBnZXRXaW5kb3csIGdldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nfVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIGRvY3VtZW50IG9iamVjdFxuICpcbiAqIEluIG5vZGVqcyB0aGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHBlcmZvcm1lZCB3aXRoIFtqc2RvbV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvanNkb20pLlxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtKU0RPTX0gZnJvbSBcImpzZG9tXCJcbiAqIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcIm9iamVjdFwiKSB7XG4gKiAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTSgnJywge1xuICogICAgICAgIHVybDogJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLFxuICogICAgICAgIHByZXRlbmRUb0JlVmlzdWFsOiB0cnVlXG4gKiAgICB9KTtcbiAqXG4gKiAgICBbXG4gKiAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICdkb2N1bWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50JyxcbiAqICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgJ0VsZW1lbnQnLFxuICogICAgICAgICdIVE1MRWxlbWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICdET01QYXJzZXInLFxuICogICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAqICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgJ0lucHV0RXZlbnQnLFxuICogICAgICAgICdDdXN0b21FdmVudCdcbiAqICAgIF0uZm9yRWFjaChrZXkgPT4gKGdldEdsb2JhbCgpW2tleV0gPSB3aW5kb3dba2V5XSkpO1xuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge29iamVjdH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICovXG5mdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICBsZXQgZG9jdW1lbnQgPSBnZXRHbG9iYWwoKT8uWydkb2N1bWVudCddO1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBzdXBwb3J0ZWQgZW52aXJvbm1lbnRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jdW1lbnQ7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUgd2luZG93IG9iamVjdFxuICpcbiAqIEluIG5vZGVqcyB0aGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHBlcmZvcm1lZCB3aXRoIFtqc2RvbV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvanNkb20pLlxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtKU0RPTX0gZnJvbSBcImpzZG9tXCJcbiAqIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcIm9iamVjdFwiKSB7XG4gKiAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTSgnJywge1xuICogICAgICAgIHVybDogJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLFxuICogICAgICAgIHByZXRlbmRUb0JlVmlzdWFsOiB0cnVlXG4gKiAgICB9KTtcbiAqXG4gKiAgICBnZXRHbG9iYWwoKVsnd2luZG93J109d2luZG93O1xuICogXG4gKiAgICBbXG4gKiAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICdkb2N1bWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50JyxcbiAqICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgJ0VsZW1lbnQnLFxuICogICAgICAgICdIVE1MRWxlbWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICdET01QYXJzZXInLFxuICogICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAqICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgJ0lucHV0RXZlbnQnLFxuICogICAgICAgICdDdXN0b21FdmVudCdcbiAqICAgIF0uZm9yRWFjaChrZXkgPT4gKGdldEdsb2JhbCgpW2tleV0gPSB3aW5kb3dba2V5XSkpO1xuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge29iamVjdH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtFcnJvcn0gbm90IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgbGV0IHdpbmRvdyA9IGdldEdsb2JhbCgpPy5bJ3dpbmRvdyddO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3VwcG9ydGVkIGVudmlyb25tZW50XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpbmRvdztcbn1cblxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIGRvY3VtZW50IG9iamVjdFxuICpcbiAqIEluIG5vZGVqcyB0aGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHBlcmZvcm1lZCB3aXRoIFtqc2RvbV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvanNkb20pLlxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtKU0RPTX0gZnJvbSBcImpzZG9tXCJcbiAqIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcIm9iamVjdFwiKSB7XG4gKiAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTSgnJywge1xuICogICAgICAgIHVybDogJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLFxuICogICAgICAgIHByZXRlbmRUb0JlVmlzdWFsOiB0cnVlXG4gKiAgICB9KTtcbiAqXG4gKiAgICBbXG4gKiAgICAgICAgJ3NlbGYnLFxuICogICAgICAgICdkb2N1bWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50JyxcbiAqICAgICAgICAnTm9kZScsXG4gKiAgICAgICAgJ0VsZW1lbnQnLFxuICogICAgICAgICdIVE1MRWxlbWVudCcsXG4gKiAgICAgICAgJ0RvY3VtZW50RnJhZ21lbnQnLFxuICogICAgICAgICdET01QYXJzZXInLFxuICogICAgICAgICdYTUxTZXJpYWxpemVyJyxcbiAqICAgICAgICAnTm9kZUZpbHRlcicsXG4gKiAgICAgICAgJ0lucHV0RXZlbnQnLFxuICogICAgICAgICdDdXN0b21FdmVudCdcbiAqICAgIF0uZm9yRWFjaChrZXkgPT4gKGdldEdsb2JhbCgpW2tleV0gPSB3aW5kb3dba2V5XSkpO1xuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnR9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHRocm93cyB7RXJyb3J9IG5vdCBzdXBwb3J0ZWQgZW52aXJvbm1lbnRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nKGh0bWwpIHtcbiAgICB2YWxpZGF0ZVN0cmluZyhodG1sKTtcblxuICAgIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50O1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtpc0FycmF5LCBpc09iamVjdH0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtnZXREb2N1bWVudH0gZnJvbSBcIi4vdXRpbC5tanNcIjtcblxuZXhwb3J0IHtmaXJlRXZlbnQsIGZpcmVDdXN0b21FdmVudCwgZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnR9XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9uIHNlbmRzIGFuIGV2ZW50XG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxIVE1MQ29sbGVjdGlvbnxOb2RlTGlzdH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEwLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IG9yIEhUTUxDb2xsZWN0aW9uXG4gKiBAc3VtbWFyeSBDb25zdHJ1Y3QgYW5kIHNlbmQgYW5kIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudChlbGVtZW50LCB0eXBlKSB7XG5cbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG5cbiAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBldmVudCA9IG5ldyBFdmVudCh2YWxpZGF0ZVN0cmluZyh0eXBlKSwge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ29sbGVjdGlvbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QpIHtcbiAgICAgICAgZm9yIChsZXQgZSBvZiBlbGVtZW50KSB7XG4gICAgICAgICAgICBmaXJlRXZlbnQoZSwgdHlwZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQgb3IgSFRNTENvbGxlY3Rpb24nKVxuICAgIH1cblxufVxuXG4vKipcbiAqIFlvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgbmV3IE1vbnN0ZXIuRE9NLmZpcmVDdXN0b21FdmVudCgpYC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7dm9pZH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQgb3IgSFRNTENvbGxlY3Rpb25cbiAqIEBzdW1tYXJ5IENvbnN0cnVjdCBhbmQgc2VuZCBhbmQgZXZlbnRcbiAqL1xuZnVuY3Rpb24gZmlyZUN1c3RvbUV2ZW50KGVsZW1lbnQsIHR5cGUsIGRldGFpbCkge1xuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXG4gICAgICAgIGlmICghaXNPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgZGV0YWlsID0ge2RldGFpbH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQodmFsaWRhdGVTdHJpbmcodHlwZSksIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ29sbGVjdGlvbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QpIHtcbiAgICAgICAgZm9yIChsZXQgZSBvZiBlbGVtZW50KSB7XG4gICAgICAgICAgICBmaXJlQ3VzdG9tRXZlbnQoZSwgdHlwZSwgZGV0YWlsKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBvciBIVE1MQ29sbGVjdGlvbicpXG4gICAgfVxuXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBwYXRoIGBFdmVudC5jb21wb3NlZFBhdGgoKWAgZnJvbSBhbiBldmVudCBhbmQgdHJpZXMgdG8gZmluZCB0aGUgbmV4dCBlbGVtZW50XG4gKiB1cCB0aGUgdHJlZSBgZWxlbWVudC5jbG9zZXN0KClgIHdpdGggdGhlIGF0dHJpYnV0ZSBhbmQgdmFsdWUuIElmIG5vIHZhbHVlLCBvciBhIHZhbHVlIHRoYXQgaXMgdW5kZWZpbmVkIG9yIG51bGwsXG4gKiBpcyBzcGVjaWZpZWQsIG9ubHkgdGhlIGF0dHJpYnV0ZSBpcyBzZWFyY2hlZC5cbiAqIFxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xNC4wXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bGx8dW5kZWZpbmVkfSBhdHRyaWJ1dGVWYWx1ZVxuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGV2ZW50XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudFxuICogQHN1bW1hcnkgSGVscCBmdW5jdGlvbiB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50KGV2ZW50LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSkge1xuICAgIHZhbGlkYXRlSW5zdGFuY2UoZXZlbnQsIEV2ZW50KTtcblxuICAgIGlmICh0eXBlb2YgZXZlbnQuY29tcG9zZWRQYXRoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgZXZlbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCk7XG5cbiAgICAvLyBjbG9zZXN0IGNhbm5vdCBiZSB1c2VkIGhlcmUsIGJlY2F1c2UgY2xvc2VzdCBpcyBub3QgY29ycmVjdCBmb3Igc2xvdHRlZCBlbGVtZW50c1xuICAgIGlmIChpc0FycmF5KHBhdGgpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbyA9IHBhdGhbaV07XG5cbiAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICBvLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKVxuICAgICAgICAgICAgICAgICYmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IG8uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpID09PSBhdHRyaWJ1dGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi4vdHlwZXMvYmFzZS5tanMnO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gJy4uL3R5cGVzL2dsb2JhbC5tanMnO1xuaW1wb3J0IHt2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfVEhFTUVfTkFNRSwgREVGQVVMVF9USEVNRX0gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQge1RoZW1lLCBnZXREb2N1bWVudFRoZW1lfVxuXG4vKipcbiAqIFRoZSBUaGVtZSBjbGFzcyBwcm92aWRlcyB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHRoZW1lLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9kb20vdGhlbWUubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjcuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHN1bW1hcnkgQSB0aGVtZSBjbGFzc1xuICovXG5jbGFzcyBUaGVtZSBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyhuYW1lKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBUaGUgdGhlbWluZyB1c2VkIGluIHRoZSBkb2N1bWVudCBjYW4gYmUgZGVmaW5lZCB2aWEgdGhlIGh0bWwtdGFnLlxuICogVGhlIHRoZW1pbmcgaXMgc3BlY2lmaWVkIHZpYSB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItdGhlbWUtbmFtZWAuXG4gKlxuICogQXMgbmFtZSBmb3IgYSB0aGVtZSBhbGwgY2hhcmFjdGVycyBhcmUgdmFsaWQsIHdoaWNoIGFyZSBhbHNvIGFsbG93ZWQgZm9yIGEgSFRNTEVsZW1lbnQtSUQuXG4gKlxuICogYGBgXG4gKiA8aHRtbCBkYXRhLW1vbnN0ZXItdGhlbWUtbmFtZT1cIm15LXRoZW1lXCI+XG4gKiBgYGBcbiAqXG4gKiB0aGUgZGVmYXVsdCB0aGVtZSBuYW1lIGlzIGBtb25zdGVyYC5cbiAqXG4gKiBAcmV0dXJuIHtUaGVtZX1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS43LjBcbiAqL1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnRUaGVtZSgpIHtcbiAgICBsZXQgZG9jdW1lbnQgPSBnZXRHbG9iYWxPYmplY3QoJ2RvY3VtZW50Jyk7XG4gICAgbGV0IG5hbWUgPSBERUZBVUxUX1RIRU1FO1xuXG4gICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJyk7XG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBsZXQgdGhlbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVEhFTUVfTkFNRSk7XG4gICAgICAgIGlmICh0aGVtZSkge1xuICAgICAgICAgICAgbmFtZSA9IHRoZW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUaGVtZShuYW1lKTtcblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge2dldEdsb2JhbEZ1bmN0aW9uLCBnZXRHbG9iYWxPYmplY3R9IGZyb20gJy4uL3R5cGVzL2dsb2JhbC5tanMnO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfVEVNUExBVEVfUFJFRklYfSBmcm9tIFwiLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2dldERvY3VtZW50VGhlbWV9IGZyb20gXCIuL3RoZW1lLm1qc1wiO1xuXG5leHBvcnQge1RlbXBsYXRlfVxuXG4vKipcbiAqIFRoZSB0ZW1wbGF0ZSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBjcmVhdGluZyB0ZW1wbGF0ZXMuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBzdW1tYXJ5IEEgdGVtcGxhdGUgY2xhc3NcbiAqL1xuY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBCYXNlIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGVcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodGVtcGxhdGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgY29uc3QgSFRNTFRlbXBsYXRlRWxlbWVudCA9IGdldEdsb2JhbEZ1bmN0aW9uKCdIVE1MVGVtcGxhdGVFbGVtZW50Jyk7XG4gICAgICAgIHZhbGlkYXRlSW5zdGFuY2UodGVtcGxhdGUsIEhUTUxUZW1wbGF0ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTFRlbXBsYXRlRWxlbWVudH1cbiAgICAgKi9cbiAgICBnZXRUZW1wbGF0ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICAgICAqL1xuICAgIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgIH1cblxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGxvYWRzIGEgdGVtcGxhdGUgd2l0aCB0aGUgZ2l2ZW4gSUQgYW5kIHJldHVybnMgaXQuXG4gKlxuICogVG8gZG8gdGhpcywgaXQgZmlyc3QgcmVhZHMgdGhlIHRoZW1lIG9mIHRoZSBkb2N1bWVudCBhbmQgbG9va3MgZm9yIHRoZSBgZGF0YS1tb25zdGVyLXRoZW1lLW5hbWVgIGF0dHJpYnV0ZSBpbiB0aGUgSFRNTCB0YWcuXG4gKlxuICogYGBgXG4gKiA8aHRtbCBkYXRhLW1vbnN0ZXItdGhlbWUtbmFtZT1cIm15LXRoZW1lXCI+XG4gKiBgYGBcbiAqXG4gKiBJZiBubyB0aGVtZSB3YXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB0aGVtZSBpcyBgbW9uc3RlcmAuXG4gKlxuICogTm93IGl0IGlzIGxvb2tlZCBpZiB0aGVyZSBpcyBhIHRlbXBsYXRlIHdpdGggdGhlIGdpdmVuIElEIGFuZCB0aGVtZSBgaWQtdGhlbWVgIGFuZCBpZiB5ZXMgaXQgaXMgcmV0dXJuZWQuXG4gKiBJZiB0aGVyZSBpcyBubyB0ZW1wbGF0ZSBhIHNlYXJjaCBmb3IgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBnaXZlbiBJRCBgaWRgIGlzIGRvbmUuIElmIHRoaXMgaXMgYWxzbyBub3QgZm91bmQsIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIG1ldGhvZCB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLkRPTS5maW5kRG9jdW1lbnRUZW1wbGF0ZSgpYC5cbiAqXG4gKiBgYGBcbiAqIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPlxuICogaW1wb3J0IHtmaW5kVGVtcGxhdGV9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlL2RvbS90ZW1wbGF0ZS5tanMnO1xuICogZmluZERvY3VtZW50VGVtcGxhdGUoKVxuICogPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7IGZpbmREb2N1bWVudFRlbXBsYXRlIH0gZnJvbSBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHNjaHVrYWkvbW9uc3RlckBsYXRlc3Qvc291cmNlL2RvbS90ZW1wbGF0ZS5tanNcIjtcbiAqXG4gKiBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAqIHRlbXBsYXRlLmlkID0gXCJteVRlbXBsYXRlXCI7XG4gKiB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBcIjxwPm15IGRlZmF1bHQgdGVtcGxhdGU8L3A+XCI7XG4gKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBsYXRlKTtcbiAqXG4gKiBjb25zdCB0aGVtZWRUZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAqIHRoZW1lZFRlbXBsYXRlLmlkID0gXCJteVRlbXBsYXRlLW15VGhlbWVcIjtcbiAqIHRoZW1lZFRlbXBsYXRlLmlubmVySFRNTCA9IFwiPHA+bXkgdGhlbWVkIHRlbXBsYXRlPC9wPlwiO1xuICogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGVtZWRUZW1wbGF0ZSk7XG4gKlxuICogLy8gbG9hZHMgdGhlIHRlbXBsZSBhbmQgc2luY2Ugbm8gdGhlbWUgaXMgc2V0IHRoZSBkZWZhdWx0IHRlbXBsYXRlXG4gKiBjb25zdCB0ZW1wbGF0ZTEgPSBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm15VGVtcGxhdGVcIik7XG4gKiBjb25zb2xlLmxvZyh0ZW1wbGF0ZTEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAqIC8vIFx1MjFBNiAnPHA+bXkgZGVmYXVsdCB0ZW1wbGF0ZTwvcD4nXG4gKlxuICogLy8gbm93IHdlIHNldCBvdXIgb3duIHRoZW1lXG4gKiBkb2N1bWVudFxuICogLnF1ZXJ5U2VsZWN0b3IoXCJodG1sXCIpXG4gKiAuc2V0QXR0cmlidXRlKFwiZGF0YS1tb25zdGVyLXRoZW1lLW5hbWVcIiwgXCJteVRoZW1lXCIpO1xuICpcbiAqIC8vIG5vdyB3ZSBkb24ndCBnZXQgdGhlIGRlZmF1bHQgdGVtcGxhdGUsXG4gKiAvLyBidXQgdGhlIHRlbXBsYXRlIHdpdGggdGhlIHRoZW1lIGluIHRoZSBpZFxuICogY29uc3QgdGVtcGxhdGUyID0gZmluZERvY3VtZW50VGVtcGxhdGUoXCJteVRlbXBsYXRlXCIpO1xuICogY29uc29sZS5sb2codGVtcGxhdGUyLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gKiAvLyBcdTIxQTYgJzxwPm15IHRoZW1lZCB0ZW1wbGF0ZTwvcD4nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge05vZGV9IGN1cnJlbnROb2RlXG4gKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5UZW1wbGF0ZX1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGVtcGxhdGUgaWQgbm90IGZvdW5kLlxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREb2N1bWVudFRlbXBsYXRlKGlkLCBjdXJyZW50Tm9kZSkge1xuICAgIHZhbGlkYXRlU3RyaW5nKGlkKTtcblxuICAgIGNvbnN0IGRvY3VtZW50ID0gZ2V0R2xvYmFsT2JqZWN0KCdkb2N1bWVudCcpO1xuICAgIGNvbnN0IEhUTUxUZW1wbGF0ZUVsZW1lbnQgPSBnZXRHbG9iYWxGdW5jdGlvbignSFRNTFRlbXBsYXRlRWxlbWVudCcpO1xuICAgIGNvbnN0IERvY3VtZW50RnJhZ21lbnQgPSBnZXRHbG9iYWxGdW5jdGlvbignRG9jdW1lbnRGcmFnbWVudCcpO1xuICAgIGNvbnN0IERvY3VtZW50ID0gZ2V0R2xvYmFsRnVuY3Rpb24oJ0RvY3VtZW50Jyk7XG5cblxuICAgIGxldCBwcmVmaXhJRDtcblxuICAgIGlmICghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSkge1xuXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfVEVNUExBVEVfUFJFRklYKSkge1xuICAgICAgICAgICAgICAgIHByZWZpeElEID0gY3VycmVudE5vZGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9URU1QTEFURV9QUkVGSVgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0Um9vdE5vZGUoKTtcblxuICAgICAgICAgICAgaWYgKCEoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdGVtcGxhdGU7XG4gICAgbGV0IHRoZW1lID0gZ2V0RG9jdW1lbnRUaGVtZSgpXG5cbiAgICBpZiAocHJlZml4SUQpIHtcbiAgICAgICAgbGV0IHRoZW1lZFByZWZpeElEID0gcHJlZml4SUQgKyAnLScgKyBpZCArICctJyArIHRoZW1lLmdldE5hbWUoKTtcblxuICAgICAgICAvLyBjdXJyZW50ICsgdGhlbWVkUHJlZml4SURcbiAgICAgICAgdGVtcGxhdGUgPSBjdXJyZW50Tm9kZS5nZXRFbGVtZW50QnlJZCh0aGVtZWRQcmVmaXhJRCk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGVtcGxhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZG9jdW1lbnQgKyB0aGVtZWRQcmVmaXhJRFxuICAgICAgICB0ZW1wbGF0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoZW1lZFByZWZpeElEKTtcbiAgICAgICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdGhlbWVkSUQgPSBpZCArICctJyArIHRoZW1lLmdldE5hbWUoKTtcblxuICAgIC8vIGN1cnJlbnQgKyB0aGVtZWRJRFxuICAgIHRlbXBsYXRlID0gY3VycmVudE5vZGUuZ2V0RWxlbWVudEJ5SWQodGhlbWVkSUQpO1xuICAgIGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gZG9jdW1lbnQgKyB0aGVtZWRJRFxuICAgIHRlbXBsYXRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhlbWVkSUQpO1xuICAgIGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gY3VycmVudCArIElEXG4gICAgdGVtcGxhdGUgPSBjdXJyZW50Tm9kZS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICAvLyBkb2N1bWVudCArIElEXG4gICAgdGVtcGxhdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0ZW1wbGF0ZSBcIiArIGlkICsgXCIgbm90IGZvdW5kLlwiKVxufVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtkaWZmfSBmcm9tIFwiLi4vZGF0YS9kaWZmLm1qc1wiO1xuaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tIFwiLi4vZGF0YS9wYXRoZmluZGVyLm1qc1wiO1xuaW1wb3J0IHtQaXBlfSBmcm9tIFwiLi4vZGF0YS9waXBlLm1qc1wiO1xuaW1wb3J0IHtcbiAgICBBVFRSSUJVVEVfRVJST1JNRVNTQUdFLFxuICAgIEFUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVMsXG4gICAgQVRUUklCVVRFX1VQREFURVJfQklORCxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlQsXG4gICAgQVRUUklCVVRFX1VQREFURVJfSU5TRVJUX1JFRkVSRU5DRSxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9SRU1PVkUsXG4gICAgQVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSxcbiAgICBBVFRSSUJVVEVfVVBEQVRFUl9TRUxFQ1RfVEhJU1xufSBmcm9tIFwiLi4vZG9tL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7aXNBcnJheSwgaXNJbnN0YW5jZSwgaXNJdGVyYWJsZX0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uL3R5cGVzL29ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHtQcm94eU9ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVBcnJheSwgdmFsaWRhdGVJbnN0YW5jZX0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtjbG9uZX0gZnJvbSBcIi4uL3V0aWwvY2xvbmUubWpzXCI7XG5pbXBvcnQge3RyaW1TcGFjZXN9IGZyb20gXCIuLi91dGlsL3RyaW1zcGFjZXMubWpzXCI7XG5pbXBvcnQge2ZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50fSBmcm9tIFwiLi9ldmVudHMubWpzXCI7XG5pbXBvcnQge2ZpbmREb2N1bWVudFRlbXBsYXRlfSBmcm9tIFwiLi90ZW1wbGF0ZS5tanNcIjtcbmltcG9ydCB7Z2V0RG9jdW1lbnR9IGZyb20gXCIuL3V0aWwubWpzXCI7XG5cbmV4cG9ydCB7VXBkYXRlcn1cblxuLyoqXG4gKiBUaGUgdXBkYXRlciBjbGFzcyBjb25uZWN0cyBhbiBvYmplY3Qgd2l0aCB0aGUgZG9tLiBJbiB0aGlzIHdheSwgc3RydWN0dXJlcyBhbmQgY29udGVudHMgaW4gdGhlIERPTSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBhZGFwdGVkIHZpYSBhdHRyaWJ1dGVzLlxuICpcbiAqIEZvciBleGFtcGxlLCB0byBpbmNsdWRlIGEgc3RyaW5nIGZyb20gYW4gb2JqZWN0LCB0aGUgYXR0cmlidXRlIGBkYXRhLW1vbnN0ZXItcmVwbGFjZWAgY2FuIGJlIHVzZWQuXG4gKiBhIGZ1cnRoZXIgZXhwbGFuYXRpb24gY2FuIGJlIGZvdW5kIHVuZGVyIHtAdHV0b3JpYWwgZG9tLWJhc2VkLXRlbXBsYXRpbmctaW1wbGVtZW50YXRpb259LlxuICpcbiAqIENoYW5nZXMgdG8gYXR0cmlidXRlcyBhcmUgbWFkZSBvbmx5IHdoZW4gdGhlIGRpcmVjdCB2YWx1ZXMgYXJlIGNoYW5nZWQuIElmIHlvdSB3YW50IHRvIGFzc2lnbiBjaGFuZ2VzIHRvIG90aGVyIHZhbHVlc1xuICogYXMgd2VsbCwgeW91IGhhdmUgdG8gaW5zZXJ0IHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1zZWxlY3QtdGhpc2AuIFRoaXMgc2hvdWxkIGJlIGRvbmUgd2l0aCBjYXJlLCBhcyBpdCBjYW4gcmVkdWNlIHBlcmZvcm1hbmNlLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9kb20vdXBkYXRlci5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIHZhbHVlIGlzIG5vdCBpdGVyYWJsZVxuICogQHRocm93cyB7RXJyb3J9IHBpcGVzIGFyZSBub3QgYWxsb3dlZCB3aGVuIGNsb25pbmcgYSBub2RlLlxuICogQHRocm93cyB7RXJyb3J9IG5vIHRlbXBsYXRlIHdhcyBmb3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRocm93cyB7RXJyb3J9IHRoZSBtYXhpbXVtIGRlcHRoIGZvciB0aGUgcmVjdXJzaW9uIGlzIHJlYWNoZWQuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnRcbiAqIEBzdW1tYXJ5IFRoZSB1cGRhdGVyIGNsYXNzIGNvbm5lY3RzIGFuIG9iamVjdCB3aXRoIHRoZSBkb21cbiAqL1xuY2xhc3MgVXBkYXRlciBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogQHNpbmNlIDEuOC4wXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fFByb3h5T2JzZXJ2ZXJ8dW5kZWZpbmVkfSBzdWJqZWN0XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudFxuICAgICAqIEBzZWUge0BsaW5rIE1vbnN0ZXIuRE9NLmZpbmREb2N1bWVudFRlbXBsYXRlfVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHN1YmplY3QpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHN1YmplY3QgPT09IHVuZGVmaW5lZCkgc3ViamVjdCA9IHt9XG4gICAgICAgIGlmICghaXNJbnN0YW5jZShzdWJqZWN0LCBQcm94eU9ic2VydmVyKSkge1xuICAgICAgICAgICAgc3ViamVjdCA9IG5ldyBQcm94eU9ic2VydmVyKHN1YmplY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSB7XG4gICAgICAgICAgICBlbGVtZW50OiB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KSxcbiAgICAgICAgICAgIGxhc3Q6IHt9LFxuICAgICAgICAgICAgY2FsbGJhY2tzOiBuZXcgTWFwKCksXG4gICAgICAgICAgICBldmVudFR5cGVzOiBbJ2tleXVwJywgJ2NsaWNrJywgJ2NoYW5nZScsICdkcm9wJywgJ3RvdWNoZW5kJywgJ2lucHV0J10sXG4gICAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5jYWxsYmFja3Muc2V0KCdjaGVja3N0YXRlJywgZ2V0Q2hlY2tTdGF0ZUNhbGxiYWNrLmNhbGwodGhpcykpO1xuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuYXR0YWNoT2JzZXJ2ZXIobmV3IE9ic2VydmVyKCgpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuZ2V0UmVhbFN1YmplY3QoKTtcblxuICAgICAgICAgICAgY29uc3QgZGlmZlJlc3VsdCA9IGRpZmYodGhpc1tpbnRlcm5hbFN5bWJvbF0ubGFzdCwgcylcbiAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmxhc3QgPSBjbG9uZShzKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbLCBjaGFuZ2VdIG9mIE9iamVjdC5lbnRyaWVzKGRpZmZSZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRWxlbWVudC5jYWxsKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0RWxlbWVudC5jYWxsKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlQ29udGVudC5jYWxsKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlQXR0cmlidXRlcy5jYWxsKHRoaXMsIGNoYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHRzOiAna2V5dXAnLCAnY2xpY2snLCAnY2hhbmdlJywgJ2Ryb3AnLCAndG91Y2hlbmQnXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9FdmVudHN9XG4gICAgICogQHNpbmNlIDEuOS4wXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHlwZXNcbiAgICAgKiBAcmV0dXJuIHtVcGRhdGVyfVxuICAgICAqL1xuICAgIHNldEV2ZW50VHlwZXModHlwZXMpIHtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZXZlbnRUeXBlcyA9IHZhbGlkYXRlQXJyYXkodHlwZXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaXRoIHRoaXMgbWV0aG9kLCB0aGUgZXZlbnRsaXN0ZW5lcnMgYXJlIGhvb2tlZCBpbiBhbmQgdGhlIG1hZ2ljIGJlZ2lucy5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIHVwZGF0ZXIucnVuKCkudGhlbigoKSA9PiB7XG4gICAgICogICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHNpbmNlIDEuOS4wXG4gICAgICogQHJldHVybiB7VXBkYXRlcn1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGJpbmQgYXJndW1lbnQgbXVzdCBzdGFydCBhcyBhIHZhbHVlIHdpdGggYSBwYXRoXG4gICAgICovXG4gICAgZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCkge1xuICAgICAgICB0aGlzLmRpc2FibGVFdmVudFByb2Nlc3NpbmcoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZXZlbnRUeXBlcykge1xuICAgICAgICAgICAgLy8gQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lclxuICAgICAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGdldENvbnRyb2xFdmVudEhhbmRsZXIuY2FsbCh0aGlzKSwge1xuICAgICAgICAgICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHR1cm5zIG9mZiB0aGUgbWFnaWMgb3Igd2hvIGxvdmVzIGl0IG1vcmUgcHJvZmFuZSBpdCByZW1vdmVzIHRoZSBldmVudExpc3RlbmVyLlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuOS4wXG4gICAgICogQHJldHVybiB7VXBkYXRlcn1cbiAgICAgKi9cbiAgICBkaXNhYmxlRXZlbnRQcm9jZXNzaW5nKCkge1xuXG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiB0aGlzW2ludGVybmFsU3ltYm9sXS5ldmVudFR5cGVzKSB7XG4gICAgICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZ2V0Q29udHJvbEV2ZW50SGFuZGxlci5jYWxsKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJ1biBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZm9yIHRoZSB1cGRhdGUgdG8gc3RhcnQgd29ya2luZy5cbiAgICAgKiBUaGUgbWV0aG9kIGVuc3VyZXMgdGhhdCBjaGFuZ2VzIGFyZSBkZXRlY3RlZC5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIHVwZGF0ZXIucnVuKCkudGhlbigoKSA9PiB7XG4gICAgICogICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHN1bW1hcnkgTGV0IHRoZSBtYWdpYyBiZWdpblxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG4gICAgcnVuKCkge1xuICAgICAgICAvLyB0aGUga2V5IF9faW5pdF9faGFzIG5vIGZ1cnRoZXIgbWVhbmluZyBhbmQgaXMgb25seSBcbiAgICAgICAgLy8gdXNlZCB0byBjcmVhdGUgdGhlIGRpZmYgZm9yIGVtcHR5IG9iamVjdHMuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmxhc3QgPSB7J19faW5pdF9fJzogdHJ1ZX07XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0Lm5vdGlmeU9ic2VydmVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlcyBvZiBib3VuZCBlbGVtZW50cyBhbmQgY2hhbmdlcyB0aGVtIGluIHN1YmplY3RcbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjI3LjBcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5VcGRhdGVyfVxuICAgICAqL1xuICAgIHJldHJpZXZlKCkge1xuICAgICAgICByZXRyaWV2ZUZyb21CaW5kaW5ncy5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB5b3UgaGF2ZSBwYXNzZWQgYSBQcm94eU9ic2VydmVyIGluIHRoZSBjb25zdHJ1Y3RvciwgeW91IHdpbGwgZ2V0IHRoZSBvYmplY3QgdGhhdCB0aGUgUHJveHlPYnNlcnZlciBtYW5hZ2VzIGhlcmUuXG4gICAgICogSG93ZXZlciwgaWYgeW91IHBhc3NlZCBhIHNpbXBsZSBvYmplY3QsIGhlcmUgeW91IHdpbGwgZ2V0IGEgcHJveHkgZm9yIHRoYXQgb2JqZWN0LlxuICAgICAqXG4gICAgICogRm9yIGNoYW5nZXMgdGhlIFByb3h5T2JzZXJ2ZXIgbXVzdCBiZSB1c2VkLlxuICAgICAqXG4gICAgICogQHNpbmNlIDEuOC4wXG4gICAgICogQHJldHVybiB7UHJveHl9XG4gICAgICovXG4gICAgZ2V0U3ViamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuZ2V0U3ViamVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGNvbW1hbmRzIHRoYXQgY2FuIGJlIGNhbGxlZCB2aWEgY2FsbDogaW5zdHJ1Y3Rpb24uXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgcGlwZSB3aXRoIGl0cyBvd24gZnVuY3Rpb25hbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAcmV0dXJucyB7VHJhbnNmb3JtZXJ9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gICAgICovXG4gICAgc2V0Q2FsbGJhY2sobmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uY2FsbGJhY2tzLnNldChuYW1lLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQHJldHVybiB7ZnVuY3Rpb25cbiAqIEB0aGlzIFVwZGF0ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0Q2hlY2tTdGF0ZUNhbGxiYWNrKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjdXJyZW50KSB7XG5cbiAgICAgICAgLy8gdGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBvYmplY3QgKHRoZXJlZm9yZSBubyBhcnJheSBmdW5jdGlvbiBoZXJlKVxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChbJ3JhZGlvJywgJ2NoZWNrYm94J10uaW5kZXhPZih0aGlzLnR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy52YWx1ZSArIFwiXCIgPT09IGN1cnJlbnQgKyBcIlwiKSA/ICd0cnVlJyA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBIVE1MT3B0aW9uRWxlbWVudCkge1xuXG4gICAgICAgICAgICBpZiAoaXNBcnJheShjdXJyZW50KSAmJiBjdXJyZW50LmluZGV4T2YodGhpcy52YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0cnVlJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHN5bWJvbCA9IFN5bWJvbCgnRXZlbnRIYW5kbGVyJyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHRoaXMgVXBkYXRlclxuICogQHRocm93cyB7RXJyb3J9IHRoZSBiaW5kIGFyZ3VtZW50IG11c3Qgc3RhcnQgYXMgYSB2YWx1ZSB3aXRoIGEgcGF0aFxuICovXG5mdW5jdGlvbiBnZXRDb250cm9sRXZlbnRIYW5kbGVyKCkge1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoc2VsZltzeW1ib2xdKSB7XG4gICAgICAgIHJldHVybiBzZWxmW3N5bWJvbF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBiaW5kIGFyZ3VtZW50IG11c3Qgc3RhcnQgYXMgYSB2YWx1ZSB3aXRoIGEgcGF0aC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzZWxmW3N5bWJvbF0gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGZpbmRUYXJnZXRFbGVtZW50RnJvbUV2ZW50KGV2ZW50LCBBVFRSSUJVVEVfVVBEQVRFUl9CSU5EKTtcblxuICAgICAgICBpZiAoZWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXRyaWV2ZUFuZFNldFZhbHVlLmNhbGwoc2VsZiwgZWxlbWVudCk7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZltzeW1ib2xdO1xuXG5cbn1cblxuLyoqXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGJpbmQgYXJndW1lbnQgbXVzdCBzdGFydCBhcyBhIHZhbHVlIHdpdGggYSBwYXRoXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHZvaWRcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmV0cmlldmVBbmRTZXRWYWx1ZShlbGVtZW50KSB7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IHBhdGhmaW5kZXIgPSBuZXcgUGF0aGZpbmRlcihzZWxmW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFN1YmplY3QoKSk7XG5cbiAgICBsZXQgcGF0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX0JJTkQpO1xuXG4gICAgaWYgKHBhdGguaW5kZXhPZigncGF0aDonKSAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBiaW5kIGFyZ3VtZW50IG11c3Qgc3RhcnQgYXMgYSB2YWx1ZSB3aXRoIGEgcGF0aCcpO1xuICAgIH1cblxuICAgIHBhdGggPSBwYXRoLnN1YnN0cig1KTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuXG4gICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cblxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICB2YWx1ZSA9IGVsZW1lbnQudmFsdWU7XG5cbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xuXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdzZWxlY3Qtb25lJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWxlY3QtbXVsdGlwbGUnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbWVudC52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGxldCBvcHRpb25zID0gZWxlbWVudD8uc2VsZWN0ZWRPcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIG9wdGlvbnMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgb3B0aW9uOmNoZWNrZWRcIik7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBBcnJheS5mcm9tKG9wdGlvbnMpLm1hcCgoe3ZhbHVlfSkgPT4gdmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHZhbHVlcyBmcm9tIGN1c3RvbWVsZW1lbnRzIFxuICAgIH0gZWxzZSBpZiAoKGVsZW1lbnQ/LmNvbnN0cnVjdG9yPy5wcm90b3R5cGUgJiYgISFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVsZW1lbnQuY29uc3RydWN0b3IucHJvdG90eXBlLCAndmFsdWUnKT8uWydnZXQnXSkgfHwgZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgICB2YWx1ZSA9IGVsZW1lbnQ/LlsndmFsdWUnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBvYmplY3RcIik7XG4gICAgfVxuXG4gICAgY29uc3QgY29weSA9IGNsb25lKHNlbGZbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuZ2V0UmVhbFN1YmplY3QoKSk7XG4gICAgY29uc3QgcGYgPSBuZXcgUGF0aGZpbmRlcihjb3B5KTtcbiAgICBwZi5zZXRWaWEocGF0aCwgdmFsdWUpO1xuXG4gICAgY29uc3QgZGlmZlJlc3VsdCA9IGRpZmYoY29weSwgc2VsZltpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5nZXRSZWFsU3ViamVjdCgpKTtcblxuICAgIGlmIChkaWZmUmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcGF0aGZpbmRlci5zZXRWaWEocGF0aCwgdmFsdWUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI3LjBcbiAqIEByZXR1cm4gdm9pZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmV0cmlldmVGcm9tQmluZGluZ3MoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoc2VsZltpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5tYXRjaGVzKCdbJyArIEFUVFJJQlVURV9VUERBVEVSX0JJTkQgKyAnXScpKSB7XG4gICAgICAgIHJldHJpZXZlQW5kU2V0VmFsdWUuY2FsbChzZWxmLCBlbGVtZW50KVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgWywgZWxlbWVudF0gb2Ygc2VsZltpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIEFUVFJJQlVURV9VUERBVEVSX0JJTkQgKyAnXScpLmVudHJpZXMoKSkge1xuICAgICAgICByZXRyaWV2ZUFuZFNldFZhbHVlLmNhbGwoc2VsZiwgZWxlbWVudClcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqIEBwYXJhbSB7b2JqZWN0fSBjaGFuZ2VcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoY2hhbmdlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBmb3IgKGNvbnN0IFssIGVsZW1lbnRdIG9mIHNlbGZbaW50ZXJuYWxTeW1ib2xdLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlIFsnICsgQVRUUklCVVRFX1VQREFURVJfUkVNT1ZFICsgJ10nKS5lbnRyaWVzKCkpIHtcbiAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqIEBwYXJhbSB7b2JqZWN0fSBjaGFuZ2VcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIHZhbHVlIGlzIG5vdCBpdGVyYWJsZVxuICogQHRocm93cyB7RXJyb3J9IHBpcGVzIGFyZSBub3QgYWxsb3dlZCB3aGVuIGNsb25pbmcgYSBub2RlLlxuICogQHRocm93cyB7RXJyb3J9IG5vIHRlbXBsYXRlIHdhcyBmb3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICogQHRocm93cyB7RXJyb3J9IHRoZSBtYXhpbXVtIGRlcHRoIGZvciB0aGUgcmVjdXJzaW9uIGlzIHJlYWNoZWQuXG4gKiBAdGhpcyBVcGRhdGVyXG4gKi9cbmZ1bmN0aW9uIGluc2VydEVsZW1lbnQoY2hhbmdlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgc3ViamVjdCA9IHNlbGZbaW50ZXJuYWxTeW1ib2xdLnN1YmplY3QuZ2V0UmVhbFN1YmplY3QoKTtcbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG5cbiAgICBsZXQgbWVtID0gbmV3IFdlYWtTZXQ7XG4gICAgbGV0IHdkID0gMDtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHNlbGZbaW50ZXJuYWxTeW1ib2xdLmVsZW1lbnQ7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgd2QrKztcblxuICAgICAgICBsZXQgcCA9IGNsb25lKGNoYW5nZT8uWydwYXRoJ10pO1xuICAgICAgICBpZiAoIWlzQXJyYXkocCkpIHJldHVybiBzZWxmO1xuXG4gICAgICAgIHdoaWxlIChwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwLmpvaW4oJy4nKTtcblxuICAgICAgICAgICAgbGV0IGl0ZXJhdG9yID0gbmV3IFNldDtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gJ1snICsgQVRUUklCVVRFX1VQREFURVJfSU5TRVJUICsgJyo9XCJwYXRoOicgKyBjdXJyZW50ICsgJ1wiXSc7XG5cbiAgICAgICAgICAgIGNvbnN0IGUgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG5cbiAgICAgICAgICAgIGlmIChlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvciA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgIFsuLi5lXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5tYXRjaGVzKHF1ZXJ5KSkge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkZChjb250YWluZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFssIGNvbnRhaW5lckVsZW1lbnRdIG9mIGl0ZXJhdG9yLmVudHJpZXMoKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lbS5oYXMoY29udGFpbmVyRWxlbWVudCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG1lbS5hZGQoY29udGFpbmVyRWxlbWVudClcblxuICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjb250YWluZXJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlQpO1xuICAgICAgICAgICAgICAgIGxldCBkZWYgPSB0cmltU3BhY2VzKGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIGxldCBpID0gZGVmLmluZGV4T2YoJyAnKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdHJpbVNwYWNlcyhkZWYuc3Vic3RyKDAsIGkpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVmUHJlZml4ID0ga2V5ICsgJy0nO1xuICAgICAgICAgICAgICAgIGxldCBjbWQgPSB0cmltU3BhY2VzKGRlZi5zdWJzdHIoaSkpO1xuXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlIGlzIGFjdHVhbGx5IGV4Y2x1ZGVkIGJ5IHRoZSBxdWVyeSBidXQgaXMgbmV2ZXJ0aGVsZXNzIGNoZWNrZWQgYWdhaW4gaGVyZVxuICAgICAgICAgICAgICAgIGlmIChjbWQuaW5kZXhPZignfCcpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwaXBlcyBhcmUgbm90IGFsbG93ZWQgd2hlbiBjbG9uaW5nIGEgbm9kZS5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHBpcGUgPSBuZXcgUGlwZShjbWQpO1xuICAgICAgICAgICAgICAgIHNlbGZbaW50ZXJuYWxTeW1ib2xdLmNhbGxiYWNrcy5mb3JFYWNoKChmLCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGUuc2V0Q2FsbGJhY2sobiwgZik7XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUucnVuKHN1YmplY3QpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBkYXRhUGF0aCA9IGNtZC5zcGxpdCgnOicpLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGluc2VydFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRQb2ludCA9IGNvbnRhaW5lckVsZW1lbnQubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgdmFsdWUgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGF2YWlsYWJsZSA9IG5ldyBTZXQ7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpLCBvYmpdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gcmVmUHJlZml4ICsgaTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRQYXRoID0gZGF0YVBhdGggKyBcIi5cIiArIGk7XG5cbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLmFkZChyZWYpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcignWycgKyBBVFRSSUJVVEVfVVBEQVRFUl9JTlNFUlRfUkVGRVJFTkNFICsgJz1cIicgKyByZWYgKyAnXCJdJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZkVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9pbnQgPSByZWZFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhcHBlbmROZXdEb2N1bWVudEZyYWdtZW50KGNvbnRhaW5lckVsZW1lbnQsIGtleSwgcmVmLCBjdXJyZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVzID0gY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0UgKyAnKj1cIicgKyByZWZQcmVmaXggKyAnXCJdJyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbLCBub2RlXSBvZiBPYmplY3QuZW50cmllcyhub2RlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGUuaGFzKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0UpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIChjb250YWluZXJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFKSArIFwiLCBcIiArIGUubWVzc2FnZSkudHJpbSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvdW5kID09PSBmYWxzZSkgYnJlYWs7XG4gICAgICAgIGlmICh3ZCsrID4gMjAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBtYXhpbXVtIGRlcHRoIGZvciB0aGUgcmVjdXJzaW9uIGlzIHJlYWNoZWQuJyk7XG4gICAgICAgIH1cblxuICAgIH1cblxuXG59XG5cbi8qKlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjguMFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHRocm93cyB7RXJyb3J9IG5vIHRlbXBsYXRlIHdhcyBmb3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICovXG5mdW5jdGlvbiBhcHBlbmROZXdEb2N1bWVudEZyYWdtZW50KGNvbnRhaW5lciwga2V5LCByZWYsIHBhdGgpIHtcblxuICAgIGxldCB0ZW1wbGF0ZSA9IGZpbmREb2N1bWVudFRlbXBsYXRlKGtleSwgY29udGFpbmVyKTtcblxuICAgIGxldCBub2RlcyA9IHRlbXBsYXRlLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBmb3IgKGNvbnN0IFssIG5vZGVdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGVzLmNoaWxkTm9kZXMpKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblxuICAgICAgICAgICAgYXBwbHlSZWN1cnNpdmUobm9kZSwga2V5LCBwYXRoKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX0lOU0VSVF9SRUZFUkVOQ0UsIHJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEwLjBcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhcHBseVJlY3Vyc2l2ZShub2RlLCBrZXksIHBhdGgpIHtcblxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblxuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSkpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UpO1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfUkVQTEFDRSwgdmFsdWUucmVwbGFjZUFsbChcInBhdGg6XCIgKyBrZXksIFwicGF0aDpcIiArIHBhdGgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1VQREFURVJfQVRUUklCVVRFUyk7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfVVBEQVRFUl9BVFRSSUJVVEVTLCB2YWx1ZS5yZXBsYWNlQWxsKFwicGF0aDpcIiArIGtleSwgXCJwYXRoOlwiICsgcGF0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbLCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZS5jaGlsZE5vZGVzKSkge1xuICAgICAgICAgICAgYXBwbHlSZWN1cnNpdmUoY2hpbGQsIGtleSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAcGFyYW0ge29iamVjdH0gY2hhbmdlXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQHRoaXMgVXBkYXRlclxuICovXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50KGNoYW5nZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHN1YmplY3QgPSBzZWxmW2ludGVybmFsU3ltYm9sXS5zdWJqZWN0LmdldFJlYWxTdWJqZWN0KCk7XG5cbiAgICBsZXQgcCA9IGNsb25lKGNoYW5nZT8uWydwYXRoJ10pO1xuICAgIHJ1blVwZGF0ZUNvbnRlbnQuY2FsbCh0aGlzLCB0aGlzW2ludGVybmFsU3ltYm9sXS5lbGVtZW50LCBwLCBzdWJqZWN0KTtcblxuICAgIGNvbnN0IHNsb3RzID0gdGhpc1tpbnRlcm5hbFN5bWJvbF0uZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzbG90Jyk7XG4gICAgaWYgKHNsb3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBbLCBzbG90XSBvZiBPYmplY3QuZW50cmllcyhzbG90cykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgWywgZWxlbWVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2xvdC5hc3NpZ25lZE5vZGVzKCkpKSB7XG4gICAgICAgICAgICAgICAgcnVuVXBkYXRlQ29udGVudC5jYWxsKHRoaXMsIGVsZW1lbnQsIHAsIHN1YmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS44LjBcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lclxuICogQHBhcmFtIHthcnJheX0gcGFydHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdWJqZWN0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5mdW5jdGlvbiBydW5VcGRhdGVDb250ZW50KGNvbnRhaW5lciwgcGFydHMsIHN1YmplY3QpIHtcbiAgICBpZiAoIWlzQXJyYXkocGFydHMpKSByZXR1cm47XG4gICAgaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSByZXR1cm47XG4gICAgcGFydHMgPSBjbG9uZShwYXJ0cyk7XG5cbiAgICBsZXQgbWVtID0gbmV3IFdlYWtTZXQ7XG5cbiAgICB3aGlsZSAocGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcGFydHMuam9pbignLicpO1xuICAgICAgICBwYXJ0cy5wb3AoKTtcblxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzdGF0aWMgZGF0YSBpcyBhbHdheXMgY2hhbmdlZCBhcyB3ZWxsLCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVhY3QgdG8gY2hhbmdlcyBoZXJlLlxuICAgICAgICBjb25zdCBxdWVyeSA9ICdbJyArIEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UgKyAnXj1cInBhdGg6JyArIGN1cnJlbnQgKyAnXCJdLCBbJyArIEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UgKyAnXj1cInN0YXRpYzpcIl0nO1xuICAgICAgICBjb25zdCBlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJycgKyBxdWVyeSk7XG5cbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgU2V0KFtcbiAgICAgICAgICAgIC4uLmVcbiAgICAgICAgXSlcblxuICAgICAgICBpZiAoY29udGFpbmVyLm1hdGNoZXMocXVlcnkpKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5hZGQoY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50XSBvZiBpdGVyYXRvci5lbnRyaWVzKCkpIHtcblxuICAgICAgICAgICAgaWYgKG1lbS5oYXMoZWxlbWVudCkpIHJldHVybjtcbiAgICAgICAgICAgIG1lbS5hZGQoZWxlbWVudClcblxuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX1JFUExBQ0UpXG4gICAgICAgICAgICBsZXQgY21kID0gdHJpbVNwYWNlcyhhdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgbGV0IHBpcGUgPSBuZXcgUGlwZShjbWQpO1xuICAgICAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uY2FsbGJhY2tzLmZvckVhY2goKGYsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlLnNldENhbGxiYWNrKG4sIGYpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IHZhbHVlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcGlwZS5ydW4oc3ViamVjdClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfRVJST1JNRVNTQUdFLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UpICsgXCIsIFwiICsgZS5tZXNzYWdlKS50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuXG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOC4wXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IGNoYW5nZVxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhjaGFuZ2UpIHtcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpc1tpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5nZXRSZWFsU3ViamVjdCgpO1xuICAgIGxldCBwID0gY2xvbmUoY2hhbmdlPy5bJ3BhdGgnXSk7XG4gICAgcnVuVXBkYXRlQXR0cmlidXRlcy5jYWxsKHRoaXMsIHRoaXNbaW50ZXJuYWxTeW1ib2xdLmVsZW1lbnQsIHAsIHN1YmplY3QpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJcbiAqIEBwYXJhbSB7YXJyYXl9IHBhcnRzXG4gKiBAcGFyYW0ge29iamVjdH0gc3ViamVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqIEB0aGlzIFVwZGF0ZXJcbiAqL1xuZnVuY3Rpb24gcnVuVXBkYXRlQXR0cmlidXRlcyhjb250YWluZXIsIHBhcnRzLCBzdWJqZWN0KSB7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmICghaXNBcnJheShwYXJ0cykpIHJldHVybjtcbiAgICBwYXJ0cyA9IGNsb25lKHBhcnRzKTtcblxuICAgIGxldCBtZW0gPSBuZXcgV2Vha1NldDtcblxuICAgIHdoaWxlIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgIHBhcnRzLnBvcCgpO1xuXG4gICAgICAgIGxldCBpdGVyYXRvciA9IG5ldyBTZXQ7XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSAnWycgKyBBVFRSSUJVVEVfVVBEQVRFUl9TRUxFQ1RfVEhJUyArICddLCBbJyArIEFUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVMgKyAnKj1cInBhdGg6JyArIGN1cnJlbnQgKyAnXCJdLCBbJyArIEFUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVMgKyAnXj1cInN0YXRpYzpcIl0nO1xuXG4gICAgICAgIGNvbnN0IGUgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG5cbiAgICAgICAgaWYgKGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaXRlcmF0b3IgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgIFsuLi5lXVxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lci5tYXRjaGVzKHF1ZXJ5KSkge1xuICAgICAgICAgICAgaXRlcmF0b3IuYWRkKGNvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50XSBvZiBpdGVyYXRvci5lbnRyaWVzKCkpIHtcblxuICAgICAgICAgICAgaWYgKG1lbS5oYXMoZWxlbWVudCkpIHJldHVybjtcbiAgICAgICAgICAgIG1lbS5hZGQoZWxlbWVudClcblxuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9VUERBVEVSX0FUVFJJQlVURVMpXG5cbiAgICAgICAgICAgIGZvciAobGV0IFssIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcy5zcGxpdCgnLCcpKSkge1xuICAgICAgICAgICAgICAgIGRlZiA9IHRyaW1TcGFjZXMoZGVmKTtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IGRlZi5pbmRleE9mKCcgJyk7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSB0cmltU3BhY2VzKGRlZi5zdWJzdHIoMCwgaSkpO1xuICAgICAgICAgICAgICAgIGxldCBjbWQgPSB0cmltU3BhY2VzKGRlZi5zdWJzdHIoaSkpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHBpcGUgPSBuZXcgUGlwZShjbWQpO1xuXG4gICAgICAgICAgICAgICAgc2VsZltpbnRlcm5hbFN5bWJvbF0uY2FsbGJhY2tzLmZvckVhY2goKGYsIG4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGlwZS5zZXRDYWxsYmFjayhuLCBmLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGlwZS5ydW4oc3ViamVjdClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsIGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKVxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGhhbmRsZUlucHV0Q29udHJvbEF0dHJpYnV0ZVVwZGF0ZS5jYWxsKHRoaXMsIGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8Kn0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnx1bmRlZmluZWR9IHZhbHVlXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQHRoaXMgVXBkYXRlclxuICovXG5cbmZ1bmN0aW9uIGhhbmRsZUlucHV0Q29udHJvbEF0dHJpYnV0ZVVwZGF0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xuXG5cbiAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NlbGVjdC1tdWx0aXBsZSc6XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgb3B0XSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50Lm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKG9wdC52YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0LnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlbGVjdC1vbmUnOlxuICAgICAgICAgICAgICAgIC8vIE9ubHkgb25lIHZhbHVlIG1heSBiZSBzZWxlY3RlZFxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIG9wdF0gb2YgT2JqZWN0LmVudHJpZXMoZWxlbWVudC5vcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0LnZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZWxlY3RlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cblxuICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcblxuICAgICAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnY2hlY2tlZCcpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcblxuICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnY2hlY2tlZCcpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9ICh2YWx1ZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcblxuXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIGlmIChuYW1lID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBlbGVtZW50LnZhbHVlID0gKHZhbHVlID09PSB1bmRlZmluZWQgPyBcIlwiIDogdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2dldEdsb2JhbEZ1bmN0aW9ufSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtUb2tlbkxpc3R9IGZyb20gXCIuLi90eXBlcy90b2tlbmxpc3QubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlU3RyaW5nLCB2YWxpZGF0ZVN5bWJvbH0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfT0JKRUNUTElOS30gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQge1xuICAgIGZpbmRDbG9zZXN0T2JqZWN0TGluayxcbiAgICBhZGRUb09iamVjdExpbmssXG4gICAgcmVtb3ZlT2JqZWN0TGluayxcbiAgICBoYXNPYmplY3RMaW5rLFxuICAgIGdldExpbmtlZE9iamVjdHMsXG4gICAgdG9nZ2xlQXR0cmlidXRlVG9rZW4sXG4gICAgYWRkQXR0cmlidXRlVG9rZW4sXG4gICAgcmVtb3ZlQXR0cmlidXRlVG9rZW4sXG4gICAgY29udGFpbnNBdHRyaWJ1dGVUb2tlbixcbiAgICByZXBsYWNlQXR0cmlidXRlVG9rZW4sXG4gICAgY2xlYXJBdHRyaWJ1dGVUb2tlbnMsXG4gICAgZmluZENsb3Nlc3RCeUF0dHJpYnV0ZSxcbiAgICBmaW5kQ2xvc2VzdEJ5Q2xhc3Ncbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNsb3Nlc3Qgb2JqZWN0IGxpbmsgb2YgYSBub2RlXG4gKlxuICogaWYgYSBub2RlIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgb2JqZWN0IGxpbmssIGEgcmVjdXJzaXZlIHNlYXJjaCB1cHdhcmRzIGlzIHBlcmZvcm1lZCB1bnRpbCB0aGUgY29ycmVzcG9uZGluZ1xuICogb2JqZWN0IGxpbmsgaXMgZm91bmQsIG9yIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudHx1bmRlZmluZWR9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEwLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmRDbG9zZXN0T2JqZWN0TGluayhlbGVtZW50KSB7XG4gICAgcmV0dXJuIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZWxlbWVudCwgQVRUUklCVVRFX09CSkVDVExJTkspO1xufVxuXG4vKipcbiAqIEFkZHMgYSBjbGFzcyBhdHRyaWJ1dGUgdG8gYW4gZWxlbWVudC5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTeW1ib2x9IHN5bWJvbFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gYWRkVG9PYmplY3RMaW5rKGVsZW1lbnQsIHN5bWJvbCwgb2JqZWN0KSB7XG5cbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcbiAgICB2YWxpZGF0ZVN5bWJvbChzeW1ib2wpXG5cbiAgICBpZiAoZWxlbWVudD8uW3N5bWJvbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbGVtZW50W3N5bWJvbF0gPSBuZXcgU2V0O1xuICAgIH1cblxuICAgIGFkZEF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIEFUVFJJQlVURV9PQkpFQ1RMSU5LLCBzeW1ib2wudG9TdHJpbmcoKSk7XG4gICAgZWxlbWVudFtzeW1ib2xdLmFkZChvYmplY3QpO1xuICAgIHJldHVybiBlbGVtZW50O1xuXG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBvYmplY3QgZnJvbSBhbiBlbGVtZW50XG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3ltYm9sfSBzeW1ib2xcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZU9iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKSB7XG5cbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcbiAgICB2YWxpZGF0ZVN5bWJvbChzeW1ib2wpXG5cbiAgICBpZiAoZWxlbWVudD8uW3N5bWJvbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgIH1cblxuICAgIHJlbW92ZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIEFUVFJJQlVURV9PQkpFQ1RMSU5LLCBzeW1ib2wudG9TdHJpbmcoKSk7XG4gICAgZGVsZXRlIGVsZW1lbnRbc3ltYm9sXTtcbiAgICByZXR1cm4gZWxlbWVudDtcblxufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaGFzIGFuIG9iamVjdCBsaW5rXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3ltYm9sfSBzeW1ib2xcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc09iamVjdExpbmsoZWxlbWVudCwgc3ltYm9sKSB7XG5cbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcbiAgICB2YWxpZGF0ZVN5bWJvbChzeW1ib2wpXG5cbiAgICBpZiAoZWxlbWVudD8uW3N5bWJvbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbnNBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBBVFRSSUJVVEVfT0JKRUNUTElOSywgc3ltYm9sLnRvU3RyaW5nKCkpO1xuXG59XG5cbi8qKlxuICogVGhlIE9iamVjdExpbmsgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIG9iamVjdHMgdG8gSFRNTEVsZW1lbnRzLiBUaGUgZWxlbWVudHMgYXJlIGtlcHQgaW4gYSBzZXQgdW5kZXIgYSB1bmlxdWVcbiAqIHN5bWJvbCBhbmQgY2FuIGJlIHJlYWQgdmlhIGFuIGl0ZXJhdG9yIHtAc2VlIHtAbGluayBnZXRMaW5rZWRPYmplY3RzfX0uXG4gKlxuICogSW4gYWRkaXRpb24sIGVsZW1lbnRzIHdpdGggYW4gb2JqZWN0TGluayByZWNlaXZlIHRoZSBhdHRyaWJ1dGUgYGRhdGEtbW9uc3Rlci1vYmplY3RsaW5rYC5cbiAqXG4gKiBXaXRoIHRoZSBtZXRob2QgIHtAc2VlIHtAbGluayBhZGRUb09iamVjdExpbmt9fSB0aGUgb2JqZWN0cyBjYW4gYmUgYWRkZWQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3ltYm9sfSBzeW1ib2xcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICogQHRocm93cyB7RXJyb3J9IHRoZXJlIGlzIG5vIG9iamVjdCBsaW5rIGZvciBzeW1ib2xcbiAqL1xuZnVuY3Rpb24gZ2V0TGlua2VkT2JqZWN0cyhlbGVtZW50LCBzeW1ib2wpIHtcblxuICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuICAgIHZhbGlkYXRlU3ltYm9sKHN5bWJvbClcblxuICAgIGlmIChlbGVtZW50Py5bc3ltYm9sXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlcmUgaXMgbm8gb2JqZWN0IGxpbmsgZm9yICcgKyBzeW1ib2wudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnQ/LltzeW1ib2xdW1N5bWJvbC5pdGVyYXRvcl0oKTtcblxufVxuXG5cbi8qKlxuICogV2l0aCB0aGlzIG1ldGhvZCB0b2tlbnMgaW4gYW4gYXR0cmlidXRlIGNhbiBiZSBzd2l0Y2hlZCBvbiBvciBvZmYuIEZvciBleGFtcGxlLCBjbGFzc2VzIGNhbiBiZSBzd2l0Y2hlZCBvbiBhbmQgb2ZmIGluIHRoZSBlbGVtZW50cyBjbGFzcyBhdHRyaWJ1dGUuXG4gKlxuICogVG9rZW5zIGFyZSBhbHdheXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdG9rZW4pIHtcbiAgICB2YWxpZGF0ZUluc3RhbmNlKGVsZW1lbnQsIEhUTUxFbGVtZW50KTtcbiAgICB2YWxpZGF0ZVN0cmluZyh0b2tlbilcbiAgICB2YWxpZGF0ZVN0cmluZyhrZXkpXG5cbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB0b2tlbik7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgbmV3IFRva2VuTGlzdChlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpKS50b2dnbGUodG9rZW4pLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhZGQgYSB0b2tlbiB0byBhbiBhdHRyaWJ1dGUuIFRva2VucyBhcmUgYWx3YXlzIHNlcGFyYXRlZCBieSBhIHNwYWNlLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiBhZGRBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHRva2VuKSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTdHJpbmcodG9rZW4pXG4gICAgdmFsaWRhdGVTdHJpbmcoa2V5KVxuXG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShrZXkpKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdG9rZW4pO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIG5ldyBUb2tlbkxpc3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KSkuYWRkKHRva2VuKS50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBlbGVtZW50XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZW1vdmUgdG9rZW5zIGZyb20gYW4gYXR0cmlidXRlLlxuICpcbiAqIFRva2VucyBhcmUgYWx3YXlzIHNlcGFyYXRlZCBieSBhIHNwYWNlLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuOS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHRva2VuKSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTdHJpbmcodG9rZW4pXG4gICAgdmFsaWRhdGVTdHJpbmcoa2V5KVxuXG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShrZXkpKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgbmV3IFRva2VuTGlzdChlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpKS5yZW1vdmUodG9rZW4pLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBhdHRyaWJ1dGUgaGFzIGEgdG9rZW4uXG4gKlxuICogVG9rZW5zIGFyZSBhbHdheXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS45LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIHRva2VuKSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTdHJpbmcodG9rZW4pXG4gICAgdmFsaWRhdGVTdHJpbmcoa2V5KVxuXG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRva2VuTGlzdChlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpKS5jb250YWlucyh0b2tlbik7XG5cbn1cblxuLyoqXG4gKiBUb2tlbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHtzdHJpbmd9IGZyb21cbiAqIEBwYXJhbSB7c3RyaW5nfSB0b1xuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBrZXksIGZyb20sIHRvKSB7XG4gICAgdmFsaWRhdGVJbnN0YW5jZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgdmFsaWRhdGVTdHJpbmcoZnJvbSlcbiAgICB2YWxpZGF0ZVN0cmluZyh0bylcbiAgICB2YWxpZGF0ZVN0cmluZyhrZXkpXG5cbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBuZXcgVG9rZW5MaXN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkpLnJlcGxhY2UoZnJvbSwgdG8pLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRcbn1cblxuLyoqXG4gKiBUb2tlbnMgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjkuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNsZWFyQXR0cmlidXRlVG9rZW5zKGVsZW1lbnQsIGtleSkge1xuICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuICAgIHZhbGlkYXRlU3RyaW5nKGtleSlcblxuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFwiXCIpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzLCBzdGFydGluZyBmcm9tIGFuIGBIVE1MRWxlbWVtZW50YCwgZm9yIHRoZSBuZXh0IGVsZW1lbnQgdGhhdCBoYXMgYSBjZXJ0YWluIGF0dHJpYnV0ZS5cbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGRhdGEtbXktYXR0cmlidXRlPVwiMlwiIGlkPVwiMlwiPlxuICogICAgIDxkaXYgaWQ9XCIxXCI+PC9kaXY+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCAodW5kZWZpbmVkKSwgdGhlbiBvbmx5IHRoZSBhdHRyaWJ1dGUgaXMgY2hlY2tlZC5cbiAqIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzEnKSwnZGF0YS1teS1hdHRyaWJ1dGUnKTsgLy8gXHUyMUE2IG5vZGUgd2l0aCBpZCAyXG4gKiBmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcyJyksJ2RhdGEtbXktYXR0cmlidXRlJyk7IC8vIFx1MjFBNiBub2RlIHdpdGggaWQgMlxuICpcbiAqIC8vIGlmIGEgdmFsdWUgaXMgc3BlY2lmaWVkLCBmb3IgZXhhbXBsZSBhbiBlbXB0eSBzdHJpbmcsIHRoZW4gdGhlIG5hbWUgYW5kIHRoZSB2YWx1ZSBhcmUgY2hlY2tlZC5cbiAqIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzEnKSwnZGF0YS1teS1hdHRyaWJ1dGUnLCAnJyk7ICAvLyBcdTIxQTYgdW5kZWZpbmVkXG4gKiBmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcxJyksJ2RhdGEtbXktYXR0cmlidXRlJywgJzInKTsgLy8gXHUyMUE2IG5vZGUgd2l0aCBpZCAyXG4gKiBgYGBcbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjE0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gdmFsdWVcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fHVuZGVmaW5lZH1cbiAqIEBzdW1tYXJ5IGZpbmQgY2xvc2VzdCBub2RlXG4gKi9cbmZ1bmN0aW9uIGZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSkge1xuICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgZ2V0R2xvYmFsRnVuY3Rpb24oJ0hUTUxFbGVtZW50JykpO1xuXG4gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSkgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgbGV0IHNlbGVjdG9yID0gdmFsaWRhdGVTdHJpbmcoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2VsZWN0b3IgKz0gXCI9XCIgKyB2YWxpZGF0ZVN0cmluZyh2YWx1ZSk7XG4gICAgbGV0IHJlc3VsdCA9IGVsZW1lbnQuY2xvc2VzdCgnWycgKyBzZWxlY3RvciArICddJyk7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcywgc3RhcnRpbmcgZnJvbSBhbiBgSFRNTEVsZW1lbWVudGAsIGZvciB0aGUgbmV4dCBlbGVtZW50IHRoYXQgaGFzIGEgY2VydGFpbiBhdHRyaWJ1dGUuXG4gKlxuICogYGBgaHRtbFxuICogPGRpdiBjbGFzcz1cIm15Y2xhc3NcIiBpZD1cIjJcIj5cbiAqICAgICA8ZGl2IGlkPVwiMVwiPjwvZGl2PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgKHVuZGVmaW5lZCksIHRoZW4gb25seSB0aGUgYXR0cmlidXRlIGlzIGNoZWNrZWQuXG4gKiBmaW5kQ2xvc2VzdEJ5Q2xhc3MoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzEnKSwnbXljbGFzcycpOyAvLyBcdTIxQTYgbm9kZSB3aXRoIGlkIDJcbiAqIGZpbmRDbG9zZXN0QnlDbGFzcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnMicpLCdteWNsYXNzJyk7IC8vIFx1MjFBNiBub2RlIHdpdGggaWQgMlxuICogYGBgXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7ZmluZENsb3Nlc3RCeUNsYXNzfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS9kb20vYXR0cmlidXRlcy5tanMnO1xuICogZmluZENsb3Nlc3RCeUNsYXNzKCk7XG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjcuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICogQHJldHVybiB7SFRNTEVsZW1lbnR8dW5kZWZpbmVkfVxuICogQHN1bW1hcnkgZmluZCBjbG9zZXN0IG5vZGVcbiAqL1xuZnVuY3Rpb24gZmluZENsb3Nlc3RCeUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgZ2V0R2xvYmFsRnVuY3Rpb24oJ0hUTUxFbGVtZW50JykpO1xuXG4gICAgaWYgKGVsZW1lbnQ/LmNsYXNzTGlzdD8uY29udGFpbnModmFsaWRhdGVTdHJpbmcoY2xhc3NOYW1lKSkpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IGVsZW1lbnQuY2xvc2VzdCgnLicgKyBjbGFzc05hbWUpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuLi9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7UGF0aGZpbmRlcn0gZnJvbSBcIi4uL2RhdGEvcGF0aGZpbmRlci5tanNcIjtcblxuaW1wb3J0IHtwYXJzZURhdGFVUkx9IGZyb20gXCIuLi90eXBlcy9kYXRhdXJsLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2lzQXJyYXksIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1N0cmluZ30gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uL3R5cGVzL29ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHtQcm94eU9ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVPYmplY3QsIHZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge2Nsb25lfSBmcm9tIFwiLi4vdXRpbC9jbG9uZS5tanNcIjtcbmltcG9ydCB7YWRkQXR0cmlidXRlVG9rZW4sIGFkZFRvT2JqZWN0TGluaywgZ2V0TGlua2VkT2JqZWN0cywgaGFzT2JqZWN0TGlua30gZnJvbSBcIi4vYXR0cmlidXRlcy5tanNcIjtcbmltcG9ydCB7XG4gICAgQVRUUklCVVRFX0RJU0FCTEVELFxuICAgIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsXG4gICAgQVRUUklCVVRFX09QVElPTlMsXG4gICAgQVRUUklCVVRFX09QVElPTlNfU0VMRUNUT1IsXG4gICAgb2JqZWN0VXBkYXRlckxpbmtTeW1ib2xcbn0gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtmaW5kRG9jdW1lbnRUZW1wbGF0ZSwgVGVtcGxhdGV9IGZyb20gXCIuL3RlbXBsYXRlLm1qc1wiO1xuaW1wb3J0IHtVcGRhdGVyfSBmcm9tIFwiLi91cGRhdGVyLm1qc1wiO1xuXG5leHBvcnQge0N1c3RvbUVsZW1lbnQsIGluaXRNZXRob2RTeW1ib2wsIGFzc2VtYmxlTWV0aG9kU3ltYm9sLCBhdHRyaWJ1dGVPYnNlcnZlclN5bWJvbCwgcmVnaXN0ZXJDdXN0b21FbGVtZW50LCBhc3NpZ25VcGRhdGVyVG9FbGVtZW50LCBnZXRTbG90dGVkRWxlbWVudHN9XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbml0TWV0aG9kU3ltYm9sID0gU3ltYm9sKCdpbml0TWV0aG9kU3ltYm9sJyk7XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBhc3NlbWJsZU1ldGhvZFN5bWJvbCA9IFN5bWJvbCgnYXNzZW1ibGVNZXRob2RTeW1ib2wnKTtcblxuLyoqXG4gKiB0aGlzIHN5bWJvbCBob2xkcyB0aGUgYXR0cmlidXRlIG9ic2VydmVyIGNhbGxiYWNrcy4gVGhlIGtleSBpcyB0aGUgYXR0cmlidXRlIG5hbWUuXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IGF0dHJpYnV0ZU9ic2VydmVyU3ltYm9sID0gU3ltYm9sKCdhdHRyaWJ1dGVPYnNlcnZlcicpO1xuXG5cbi8qKlxuICogSFRNTEVsZW1lbnRcbiAqIEBleHRlcm5hbCBIVE1MRWxlbWVudFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnRcbiAqXG4gKiBAc3RhcnR1bWwgY3VzdG9tZWxlbWVudC1zZXF1ZW5jZWRpYWdyYW0ucG5nXG4gKiBza2lucGFyYW0gbW9ub2Nocm9tZSB0cnVlXG4gKiBza2lucGFyYW0gc2hhZG93aW5nIGZhbHNlXG4gKlxuICogYXV0b251bWJlclxuICpcbiAqIFNjcmlwdCAtPiBET006IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdteS1lbGVtZW50JylcbiAqIERPTSAtPiBDdXN0b21FbGVtZW50OiBjb25zdHJ1Y3RvcigpXG4gKiBDdXN0b21FbGVtZW50IC0+IEN1c3RvbUVsZW1lbnQ6IFtpbml0TWV0aG9kU3ltYm9sXSgpXG4gKlxuICogQ3VzdG9tRWxlbWVudCAtLT4gRE9NOiBFbGVtZW50XG4gKiBET00gLS0+IFNjcmlwdCA6IGVsZW1lbnRcbiAqXG4gKlxuICogU2NyaXB0IC0+IERPTTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmFwcGVuZChlbGVtZW50KVxuICpcbiAqIERPTSAtPiBDdXN0b21FbGVtZW50IDogY29ubmVjdGVkQ2FsbGJhY2soKVxuICpcbiAqIG5vdGUgcmlnaHQgQ3VzdG9tRWxlbWVudDogaXMgb25seSBjYWxsZWQgYXRcXG50aGUgZmlyc3QgY29ubmVjdGlvblxuICogQ3VzdG9tRWxlbWVudCAtPiBDdXN0b21FbGVtZW50IDogW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpXG4gKlxuICogLi4uIC4uLlxuICpcbiAqIGF1dG9udW1iZXJcbiAqXG4gKiBTY3JpcHQgLT4gRE9NOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtb25zdGVyLWNvbmZpcm0tYnV0dG9uJykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KVxuICogRE9NIC0+IEN1c3RvbUVsZW1lbnQ6IGRpc2Nvbm5lY3RlZENhbGxiYWNrKClcbiAqXG4gKlxuICogQGVuZHVtbFxuICpcbiAqIEBzdGFydHVtbCBjdXN0b21lbGVtZW50LWNsYXNzLnBuZ1xuICogc2tpbnBhcmFtIG1vbm9jaHJvbWUgdHJ1ZVxuICogc2tpbnBhcmFtIHNoYWRvd2luZyBmYWxzZVxuICogSFRNTEVsZW1lbnQgPHwtLSBDdXN0b21FbGVtZW50XG4gKiBAZW5kdW1sXG4gKi9cblxuXG4vKipcbiAqIFRvIGRlZmluZSBhIG5ldyBIVE1MIGVsZW1lbnQgd2UgbmVlZCB0aGUgcG93ZXIgb2YgQ3VzdG9tRWxlbWVudFxuICpcbiAqIElNUE9SVEFOVDogYWZ0ZXIgZGVmaW5pbmcgYSBgQ3VzdG9tRWxlbWVudGAsIHRoZSBgcmVnaXN0ZXJDdXN0b21FbGVtZW50YCBtZXRob2QgbXVzdCBiZSBjYWxsZWRcbiAqIHdpdGggdGhlIG5ldyBjbGFzcyBuYW1lLiBvbmx5IHRoZW4gd2lsbCB0aGUgdGFnIGRlZmluZWQgdmlhIHRoZSBgZ2V0VGFnYCBtZXRob2QgYmUgbWFkZSBrbm93biB0byB0aGUgRE9NLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWFnZXMvY3VzdG9tZWxlbWVudC1jbGFzcy5wbmdcIj5cbiAqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IHZpYSB0aGUgZnVuY3Rpb24gYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoKWAuXG4gKlxuICpcbiAqICMjIEludGVyYWN0aW9uXG4gKlxuICogPGltZyBzcmM9XCIuL2ltYWdlcy9jdXN0b21lbGVtZW50LXNlcXVlbmNlZGlhZ3JhbS5wbmdcIj5cbiAqXG4gKiAjIyBTdHlsaW5nXG4gKlxuICogRm9yIG9wdGltYWwgZGlzcGxheSBvZiBjdXN0b20tZWxlbWVudHMgdGhlIHBzZXVkby1jbGFzcyA6ZGVmaW5lZCBjYW4gYmUgdXNlZC5cbiAqXG4gKiBUbyBwcmV2ZW50IHRoZSBjdXN0b20gZWxlbWVudHMgZnJvbSBiZWluZyBkaXNwbGF5ZWQgYW5kIGZsaWNrZXJpbmcgdW50aWwgdGhlIGNvbnRyb2wgaXMgcmVnaXN0ZXJlZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gY3JlYXRlIGEgY3NzIGRpcmVjdGl2ZS5cbiAqXG4gKiBJbiB0aGUgc2ltcGxlc3QgY2FzZSwgeW91IGNhbiBzaW1wbHkgaGlkZSB0aGUgY29udHJvbC5cbiAqXG4gKiBgYGBcbiAqIDxzdHlsZT5cbiAqXG4gKiBteS1jdXN0b20tZWxlbWVudDpub3QoOmRlZmluZWQpIHtcbiAqICAgICBkaXNwbGF5OiBub25lO1xuICogfVxuICpcbiAqIG15LWN1c3RvbS1lbGVtZW50OmRlZmluZWQge1xuICogICAgIGRpc3BsYXk6IGZsZXg7XG4gKiB9XG4gKlxuICogPC9zdHlsZT5cbiAqIGBgYFxuICpcbiAqIEFsdGVybmF0aXZlbHkgeW91IGNhbiBhbHNvIGRpc3BsYXkgYSBsb2FkZXJcbiAqXG4gKiBgYGBcbiAqIG15LWN1c3RvbS1lbGVtZW50Om5vdCg6ZGVmaW5lZCkge1xuICogICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMHB4IDAgcmdiYSgzMywgMzMsIDMzLCAwLjE1KTtcbiAqICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICogICAgICAgICAgICBoZWlnaHQ6IDIwMHB4O1xuICogICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gKiAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gKiAgICAgICAgfVxuICpcbiAqIG15LWN1c3RvbS1lbGVtZW50Om5vdCg6ZGVmaW5lZCk6OmJlZm9yZSB7XG4gKiAgICAgICAgICAgIGNvbnRlbnQ6ICcnO1xuICogICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAqICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICogICAgICAgICAgICBsZWZ0OiAtMTUwcHg7XG4gKiAgICAgICAgICAgIHRvcDogMDtcbiAqICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICogICAgICAgICAgICB3aWR0aDogMTUwcHg7XG4gKiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQgMCUsICNFOEU4RTggNTAlLCB0cmFuc3BhcmVudCAxMDAlKTtcbiAqICAgICAgICAgICAgYW5pbWF0aW9uOiBsb2FkIDFzIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKSBpbmZpbml0ZTtcbiAqICAgICAgICB9XG4gKlxuICogQGtleWZyYW1lcyBsb2FkIHtcbiAqICAgICAgICAgICAgZnJvbSB7XG4gKiAgICAgICAgICAgICAgICBsZWZ0OiAtMTUwcHg7XG4gKiAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgdG8gICB7XG4gKiAgICAgICAgICAgICAgICBsZWZ0OiAxMDAlO1xuICogICAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICpcbiAqIG15LWN1c3RvbS1lbGVtZW50OmRlZmluZWQge1xuICogICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gKiAgICAgICB9XG4gKiBgYGBcbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvZG9tL3RoZW1lLm1qc1xuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vV0lDRy93ZWJjb21wb25lbnRzXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2N1c3RvbS1lbGVtZW50cy5odG1sI2N1c3RvbS1lbGVtZW50c1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS43LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBleHRlbmRzIGV4dGVybmFsOkhUTUxFbGVtZW50XG4gKiBAc3VtbWFyeSBBIGJhc2UgY2xhc3MgZm9yIEhUTUw1IGN1c3RvbWNvbnRyb2xzXG4gKi9cbmNsYXNzIEN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAvKipcbiAgICAgKiBBIG5ldyBvYmplY3QgaXMgY3JlYXRlZC4gRmlyc3QgdGhlIGBpbml0T3B0aW9uc2AgbWV0aG9kIGlzIGNhbGxlZC4gSGVyZSB0aGVcbiAgICAgKiBvcHRpb25zIGNhbiBiZSBkZWZpbmVkIGluIGRlcml2ZWQgY2xhc3Nlcy4gU3Vic2VxdWVudGx5LCB0aGUgc2hhZG93Um9vdCBpcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgb3B0aW9ucyBhdHRyaWJ1dGUgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvbi5cbiAgICAgKiBAc2luY2UgMS43LjBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBuZXcgUHJveHlPYnNlcnZlcih7J29wdGlvbnMnOiBleHRlbmQoe30sIHRoaXMuZGVmYXVsdHMpfSk7XG4gICAgICAgIHRoaXNbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdID0ge307XG4gICAgICAgIGluaXRPcHRpb25PYnNlcnZlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzW2luaXRNZXRob2RTeW1ib2xdKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBtb25pdG9yZWQgYnkgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygpYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICAgICAqIEBzaW5jZSAxLjE1LjBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIFtBVFRSSUJVVEVfT1BUSU9OUywgQVRUUklCVVRFX0RJU0FCTEVEXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIGFuZCBleHRlbmQgdGhpcyBtZXRob2QgYXMgZm9sbG93cy5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGdldCBkZWZhdWx0cygpIHtcbiAgICAgKiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgKiAgICAgICAgbXlWYWx1ZTp0cnVlXG4gICAgICogICAgfSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVG8gc2V0IHRoZSBvcHRpb25zIHZpYSB0aGUgaHRtbCB0YWcgdGhlIGF0dHJpYnV0ZSBkYXRhLW1vbnN0ZXItb3B0aW9ucyBtdXN0IGJlIHNldC5cbiAgICAgKiBBcyB2YWx1ZSBhIEpTT04gb2JqZWN0IHdpdGggdGhlIGRlc2lyZWQgdmFsdWVzIG11c3QgYmUgZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIFNpbmNlIDEuMTguMCB0aGUgSlNPTiBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgRGF0YVVSSS5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIG5ldyBNb25zdGVyLlR5cGVzLkRhdGFVcmwoYnRvYShKU09OLnN0cmluZ2lmeSh7XG4gICAgICogICAgICAgIHNoYWRvd01vZGU6ICdvcGVuJyxcbiAgICAgKiAgICAgICAgZGVsZWdhdGVzRm9jdXM6IHRydWUsXG4gICAgICogICAgICAgIHRlbXBsYXRlczoge1xuICAgICAqICAgICAgICAgICAgbWFpbjogdW5kZWZpbmVkXG4gICAgICogICAgICAgIH1cbiAgICAgKiAgICB9KSksJ2FwcGxpY2F0aW9uL2pzb24nLHRydWUpLnRvU3RyaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBhdHRyaWJ1dGUgZGF0YS1tb25zdGVyLW9wdGlvbnMtc2VsZWN0b3IgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGEgc2NyaXB0IHRhZyB0aGF0IGNvbnRhaW5zIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEFzIHZhbHVlIGEgc2VsZWN0b3IgbXVzdCBiZSBzcGVjaWZpZWQsIHdoaWNoIGJlbG9uZ3MgdG8gYSBzY3JpcHQgdGFnIGFuZCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBhcyBqc29uLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogPHNjcmlwdCBpZD1cImlkLWZvci10aGlzLWNvbmZpZ1wiIHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCI+XG4gICAgICogICAge1xuICAgICAqICAgICAgICBcImNvbmZpZy1rZXlcIjogXCJjb25maWctdmFsdWVcIlxuICAgICAqICAgIH1cbiAgICAgKiA8L3NjcmlwdD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBpbmRpdmlkdWFsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGRpc2FibGVkPWZhbHNlIE9iamVjdCBUaGUgQm9vbGVhbiBkaXNhYmxlZCBhdHRyaWJ1dGUsIHdoZW4gcHJlc2VudCwgbWFrZXMgdGhlIGVsZW1lbnQgbm90IG11dGFibGUsIGZvY3VzYWJsZSwgb3IgZXZlbiBzdWJtaXR0ZWQgd2l0aCB0aGUgZm9ybS5cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gc2hhZG93TW9kZT1vcGVuIGBvcGVuYCBFbGVtZW50cyBvZiB0aGUgc2hhZG93IHJvb3QgYXJlIGFjY2Vzc2libGUgZnJvbSBKYXZhU2NyaXB0IG91dHNpZGUgdGhlIHJvb3QsIGZvciBleGFtcGxlIHVzaW5nLiBgY2xvc2VgIERlbmllcyBhY2Nlc3MgdG8gdGhlIG5vZGUocykgb2YgYSBjbG9zZWQgc2hhZG93IHJvb3QgZnJvbSBKYXZhU2NyaXB0IG91dHNpZGUgaXRcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGRlbGVnYXRlc0ZvY3VzPXRydWUgQSBib29sZWFuIHRoYXQsIHdoZW4gc2V0IHRvIHRydWUsIHNwZWNpZmllcyBiZWhhdmlvciB0aGF0IG1pdGlnYXRlcyBjdXN0b20gZWxlbWVudCBpc3N1ZXMgYXJvdW5kIGZvY3VzYWJpbGl0eS4gV2hlbiBhIG5vbi1mb2N1c2FibGUgcGFydCBvZiB0aGUgc2hhZG93IERPTSBpcyBjbGlja2VkLCB0aGUgZmlyc3QgZm9jdXNhYmxlIHBhcnQgaXMgZ2l2ZW4gZm9jdXMsIGFuZCB0aGUgc2hhZG93IGhvc3QgaXMgZ2l2ZW4gYW55IGF2YWlsYWJsZSA6Zm9jdXMgc3R5bGluZy5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gdGVtcGxhdGVzIFRlbXBsYXRlc1xuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZW1wbGF0ZXMubWFpbj11bmRlZmluZWQgTWFpbiB0ZW1wbGF0ZVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9hdHRhY2hTaGFkb3dcbiAgICAgKiBAc2luY2UgMS44LjBcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBBVFRSSUJVVEVfRElTQUJMRUQ6IHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9ESVNBQkxFRCksXG4gICAgICAgICAgICBzaGFkb3dNb2RlOiAnb3BlbicsXG4gICAgICAgICAgICBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSxcbiAgICAgICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgICAgIG1haW46IHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZXJlIGlzIG5vIGNoZWNrIG9uIHRoZSBuYW1lIGJ5IHRoaXMgY2xhc3MuIHRoZSBkZXZlbG9wZXIgaXMgcmVzcG9uc2libGUgZm9yIGFzc2lnbmluZyBhbiBhcHByb3ByaWF0ZSB0YWcuXG4gICAgICogaWYgdGhlIG5hbWUgaXMgbm90IHZhbGlkLCByZWdpc3RlckN1c3RvbUVsZW1lbnQoKSB3aWxsIGlzc3VlIGFuIGVycm9yXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jdXN0b20tZWxlbWVudHMuaHRtbCN2YWxpZC1jdXN0b20tZWxlbWVudC1uYW1lXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgbWV0aG9kIGdldFRhZyBtdXN0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLlxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoZSBtZXRob2QgZ2V0VGFnIG11c3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGRlcml2ZWQgY2xhc3MuXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0IHRoaXMgcG9pbnQgYSBgQ1NTU3R5bGVTaGVldGAgb2JqZWN0IGNhbiBiZSByZXR1cm5lZC4gSWYgdGhlIGVudmlyb25tZW50IGRvZXMgbm90XG4gICAgICogc3VwcG9ydCBhIGNvbnN0cnVjdG9yLCB0aGVuIGFuIG9iamVjdCBjYW4gYWxzbyBiZSBidWlsdCB1c2luZyB0aGUgZm9sbG93aW5nIGRldG91ci5cbiAgICAgKlxuICAgICAqIElmIGB1bmRlZmluZWRgIGlzIHJldHVybmVkIHRoZW4gdGhlIHNoYWRvd1Jvb3QgZG9lcyBub3QgZ2V0IGEgc3R5bGVzaGVldC5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGNvbnN0IGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgndGl0bGUnKTtcbiAgICAgKlxuICAgICAqIGxldCBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICogc3R5bGUuaW5uZXJIVE1MPVwicHtjb2xvcjpyZWQ7fVwiO1xuICAgICAqXG4gICAgICogLy8gV2ViS2l0IEhhY2tcbiAgICAgKiBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSk7XG4gICAgICogLy8gQWRkIHRoZSA8c3R5bGU+IGVsZW1lbnQgdG8gdGhlIHBhZ2VcbiAgICAgKiBkb2MuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICogcmV0dXJuIGRvYy5zdHlsZVNoZWV0c1swXTtcbiAgICAgKiA7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtDU1NTdHlsZVNoZWV0fENTU1N0eWxlU2hlZXRbXXxzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGF0dGFjaCBhIG5ldyBvYnNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7Q3VzdG9tRWxlbWVudH1cbiAgICAgKi9cbiAgICBhdHRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5hdHRhY2hPYnNlcnZlcihvYnNlcnZlcilcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGV0YWNoIGEgb2JzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVybnMge0N1c3RvbUVsZW1lbnR9XG4gICAgICovXG4gICAgZGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0uZGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVybnMge1Byb3h5T2JzZXJ2ZXJ9XG4gICAgICovXG4gICAgY29udGFpbnNPYnNlcnZlcihvYnNlcnZlcikge1xuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbFN5bWJvbF0uY29udGFpbnNPYnNlcnZlcihvYnNlcnZlcilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBuZXN0ZWQgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHBhdGggYGEuYi5jYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZVxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICogQHNpbmNlIDEuMTAuMFxuICAgICAqL1xuICAgIGdldE9wdGlvbihwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBQYXRoZmluZGVyKHRoaXNbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbJ29wdGlvbnMnXSkuZ2V0VmlhKHBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG9wdGlvbiBhbmQgaW5mb3JtIGVsZW1lbnRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtDdXN0b21FbGVtZW50fVxuICAgICAqIEBzaW5jZSAxLjE0LjBcbiAgICAgKi9cbiAgICBzZXRPcHRpb24ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgbmV3IFBhdGhmaW5kZXIodGhpc1tpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpWydvcHRpb25zJ10pLnNldFZpYShwYXRoLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzaW5jZSAxLjE1LjBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtDdXN0b21FbGVtZW50fVxuICAgICAqL1xuICAgIHNldE9wdGlvbnMob3B0aW9ucykge1xuXG4gICAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9uc0pTT04uY2FsbCh0aGlzLCBvcHRpb25zKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGV4dGVuZChzZWxmW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KClbJ29wdGlvbnMnXSwgc2VsZi5kZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIG9uY2UgdmlhIHRoZSBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAgICAgKiBAc2luY2UgMS44LjBcbiAgICAgKi9cbiAgICBbaW5pdE1ldGhvZFN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCBvbmNlIHdoZW4gdGhlIG9iamVjdCBpcyBpbmNsdWRlZCBpbiB0aGUgRE9NIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0N1c3RvbUVsZW1lbnR9XG4gICAgICogQHNpbmNlIDEuOC4wXG4gICAgICovXG4gICAgW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpIHtcblxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IGVsZW1lbnRzLCBub2RlTGlzdDtcblxuICAgICAgICBjb25zdCBBdHRyaWJ1dGVPcHRpb25zID0gZ2V0T3B0aW9uc0Zyb21BdHRyaWJ1dGVzLmNhbGwoc2VsZik7XG4gICAgICAgIGlmIChpc09iamVjdChBdHRyaWJ1dGVPcHRpb25zKSAmJiBPYmplY3Qua2V5cyhBdHRyaWJ1dGVPcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZWxmLnNldE9wdGlvbnMoQXR0cmlidXRlT3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBTY3JpcHRPcHRpb25zID0gZ2V0T3B0aW9uc0Zyb21TY3JpcHRUYWcuY2FsbChzZWxmKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KFNjcmlwdE9wdGlvbnMpICYmIE9iamVjdC5rZXlzKFNjcmlwdE9wdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9ucyhTY3JpcHRPcHRpb25zKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKHNlbGYuZ2V0T3B0aW9uKCdzaGFkb3dNb2RlJywgZmFsc2UpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpbml0U2hhZG93Um9vdC5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gc2VsZi5zaGFkb3dSb290LmNoaWxkTm9kZXM7XG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGluaXRDU1NTdHlsZXNoZWV0LmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlVG9rZW4oc2VsZiwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKGVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpKSB7XG4gICAgICAgICAgICBpZiAoIShlbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSkge1xuICAgICAgICAgICAgICAgIGluaXRIdG1sQ29udGVudC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gdGhpcy5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5vZGVMaXN0ID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgLi4uZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgLi4uZ2V0U2xvdHRlZEVsZW1lbnRzLmNhbGwoc2VsZilcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG5vZGVMaXN0ID0gZWxlbWVudHNcbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2lnblVwZGF0ZXJUb0VsZW1lbnQuY2FsbChzZWxmLCBub2RlTGlzdCwgY2xvbmUoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVsnb3B0aW9ucyddKSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBldmVyeSB0aW1lIHRoZSBlbGVtZW50IGlzIGluc2VydGVkIGludG8gdGhlIERPTS4gVXNlZnVsIGZvciBydW5uaW5nIHNldHVwIGNvZGUsIHN1Y2ggYXNcbiAgICAgKiBmZXRjaGluZyByZXNvdXJjZXMgb3IgcmVuZGVyaW5nLiBHZW5lcmFsbHksIHlvdSBzaG91bGQgdHJ5IHRvIGRlbGF5IHdvcmsgdW50aWwgdGhpcyB0aW1lLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAc2luY2UgMS43LjBcbiAgICAgKi9cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAoIWhhc09iamVjdExpbmsoc2VsZiwgb2JqZWN0VXBkYXRlckxpbmtTeW1ib2wpKSB7XG4gICAgICAgICAgICBzZWxmW2Fzc2VtYmxlTWV0aG9kU3ltYm9sXSgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgZXZlcnkgdGltZSB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4gVXNlZnVsIGZvciBydW5uaW5nIGNsZWFuIHVwIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSBlbGVtZW50IGhhcyBiZWVuIG1vdmVkIGludG8gYSBuZXcgZG9jdW1lbnQgKGUuZy4gc29tZW9uZSBjYWxsZWQgZG9jdW1lbnQuYWRvcHROb2RlKGVsKSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqIEBzaW5jZSAxLjcuMFxuICAgICAqL1xuICAgIGFkb3B0ZWRDYWxsYmFjaygpIHtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGFuIG9ic2VydmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBhZGRlZCwgcmVtb3ZlZCwgdXBkYXRlZCwgb3IgcmVwbGFjZWQuIEFsc28gY2FsbGVkIGZvciBpbml0aWFsXG4gICAgICogdmFsdWVzIHdoZW4gYW4gZWxlbWVudCBpcyBjcmVhdGVkIGJ5IHRoZSBwYXJzZXIsIG9yIHVwZ3JhZGVkLiBOb3RlOiBvbmx5IGF0dHJpYnV0ZXMgbGlzdGVkIGluIHRoZSBvYnNlcnZlZEF0dHJpYnV0ZXNcbiAgICAgKiBwcm9wZXJ0eSB3aWxsIHJlY2VpdmUgdGhpcyBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRWYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3VmFsXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAc2luY2UgMS4xNS4wXG4gICAgICovXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHJOYW1lLCBvbGRWYWwsIG5ld1ZhbCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHNlbGZbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdPy5bYXR0ck5hbWVdO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChzZWxmLCBuZXdWYWwsIG9sZFZhbCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICAgICAqIEBzaW5jZSAxLjE5LjBcbiAgICAgKi9cbiAgICBoYXNOb2RlKG5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5DaGlsZE5vZGUuY2FsbChzZWxmLCB2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShzZWxmLnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5DaGlsZE5vZGUuY2FsbChzZWxmLnNoYWRvd1Jvb3QsIG5vZGUpO1xuXG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfHVuZGVmaW5lZH0gcXVlcnlcbiAqIEBwYXJhbSB7U3RyaW5nfHVuZGVmaW5lZHxudWxsfSBuYW1lIG5hbWUgb2YgdGhlIHNsb3QgKGlmIHRoZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLCBhbGwgc2xvdHMgYXJlIHNlYXJjaGVkLCBpZiB0aGUgcGFyYW1ldGVyIGhhcyB0aGUgdmFsdWUgbnVsbCwgYWxsIHNsb3RzIHdpdGhvdXQgYSBuYW1lIGFyZSBzZWFyY2hlZC4gaWYgYSBzdHJpbmcgaXMgc3BlY2lmaWVkLCB0aGUgc2xvdHMgd2l0aCB0aGlzIG5hbWUgYXJlIHNlYXJjaGVkLilcbiAqIEByZXR1cm4geyp9XG4gKiBAdGhpcyBDdXN0b21FbGVtZW50XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjIzLjBcbiAqIEB0aHJvd3Mge0Vycm9yfSBxdWVyeSBtdXN0IGJlIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldFNsb3R0ZWRFbGVtZW50cyhxdWVyeSwgbmFtZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ7XG5cbiAgICBpZiAoIShzZWxmLnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGxldCBzZWxlY3RvciA9ICdzbG90JztcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChuYW1lID09PSBudWxsKSB7XG4gICAgICAgICAgICBzZWxlY3RvciArPSAnOm5vdChbbmFtZV0pJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdG9yICs9ICdbbmFtZT0nICsgdmFsaWRhdGVTdHJpbmcobmFtZSkgKyAnXSc7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGNvbnN0IHNsb3RzID0gc2VsZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuXG4gICAgZm9yIChjb25zdCBbLCBzbG90XSBvZiBPYmplY3QuZW50cmllcyhzbG90cykpIHtcbiAgICAgICAgc2xvdC5hc3NpZ25lZEVsZW1lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuXG4gICAgICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhxdWVyeSkpIHtcbiAgICAgICAgICAgICAgICBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlLm1hdGNoZXMocXVlcnkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5IG11c3QgYmUgYSBzdHJpbmcnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHRoaXMgQ3VzdG9tRWxlbWVudFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29udGFpbkNoaWxkTm9kZShub2RlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoc2VsZi5jb250YWlucyhub2RlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFssIGVdIG9mIE9iamVjdC5lbnRyaWVzKHNlbGYuY2hpbGROb2RlcykpIHtcbiAgICAgICAgaWYgKGUuY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbkNoaWxkTm9kZS5jYWxsKGUsIG5vZGUpO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTUuMFxuICogQHByaXZhdGVcbiAqIEB0aGlzIEN1c3RvbUVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gaW5pdE9wdGlvbk9ic2VydmVyKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgbGV0IGxhc3REaXNhYmxlZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHNlbGYuYXR0YWNoT2JzZXJ2ZXIobmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZmxhZyA9IHNlbGYuZ2V0T3B0aW9uKCdkaXNhYmxlZCcpO1xuXG4gICAgICAgIGlmIChmbGFnID09PSBsYXN0RGlzYWJsZWRWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdERpc2FibGVkVmFsdWUgPSBmbGFnO1xuXG4gICAgICAgIGlmICghKHNlbGYuc2hhZG93Um9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9ICdidXR0b24sIGNvbW1hbmQsIGZpZWxkc2V0LCBrZXlnZW4sIG9wdGdyb3VwLCBvcHRpb24sIHNlbGVjdCwgdGV4dGFyZWEsIGlucHV0LCBbZGF0YS1tb25zdGVyLW9iamVjdGxpbmtdJztcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBzZWxmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG5cbiAgICAgICAgbGV0IG5vZGVMaXN0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZUxpc3QgPSBuZXcgU2V0KFtcbiAgICAgICAgICAgICAgICAuLi5lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAuLi5nZXRTbG90dGVkRWxlbWVudHMuY2FsbChzZWxmLCBxdWVyeSlcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG5vZGVMaXN0ID0gZWxlbWVudHNcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBbLi4ubm9kZUxpc3RdKSB7XG4gICAgICAgICAgICBpZiAoZmxhZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9ESVNBQkxFRCwgJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfRElTQUJMRUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9KSk7XG5cbiAgICBzZWxmLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gbm90IGluaXRpYWxpc2VkXG4gICAgICAgIGlmICghaGFzT2JqZWN0TGluayhzZWxmLCBvYmplY3RVcGRhdGVyTGlua1N5bWJvbCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbmZvcm0gZXZlcnkgZWxlbWVudFxuICAgICAgICBjb25zdCB1cGRhdGVycyA9IGdldExpbmtlZE9iamVjdHMoc2VsZiwgb2JqZWN0VXBkYXRlckxpbmtTeW1ib2wpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGlzdCBvZiB1cGRhdGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB1cGRhdGVyIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGNsb25lKHNlbGZbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbJ29wdGlvbnMnXSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVyLmdldFN1YmplY3QoKSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0pKTtcblxuICAgIC8vIGRpc2FibGVkXG4gICAgc2VsZlthdHRyaWJ1dGVPYnNlcnZlclN5bWJvbF1bQVRUUklCVVRFX0RJU0FCTEVEXSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNlbGYuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9ESVNBQkxFRCkpIHtcbiAgICAgICAgICAgIHNlbGYuc2V0T3B0aW9uKEFUVFJJQlVURV9ESVNBQkxFRCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnNldE9wdGlvbihBVFRSSUJVVEVfRElTQUJMRUQsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRhLW1vbnN0ZXItb3B0aW9uc1xuICAgIHNlbGZbYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2xdW0FUVFJJQlVURV9PUFRJT05TXSA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnNGcm9tQXR0cmlidXRlcy5jYWxsKHNlbGYpO1xuICAgICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0YS1tb25zdGVyLW9wdGlvbnMtc2VsZWN0b3JcbiAgICBzZWxmW2F0dHJpYnV0ZU9ic2VydmVyU3ltYm9sXVtBVFRSSUJVVEVfT1BUSU9OU19TRUxFQ1RPUl0gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zRnJvbVNjcmlwdFRhZy5jYWxsKHNlbGYpO1xuICAgICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7b2JqZWN0fVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZ2V0T3B0aW9uc0Zyb21TY3JpcHRUYWcoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoIXNlbGYuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9PUFRJT05TX1NFTEVDVE9SKSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZi5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX09QVElPTlNfU0VMRUNUT1IpKTtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSFRNTFNjcmlwdEVsZW1lbnQpKSB7XG4gICAgICAgIGFkZEF0dHJpYnV0ZVRva2VuKHNlbGYsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsICd0aGUgc2VsZWN0b3IgJyArIEFUVFJJQlVURV9PUFRJT05TX1NFTEVDVE9SICsgJyBmb3Igb3B0aW9ucyB3YXMgc3BlY2lmaWVkICgnICsgc2VsZi5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX09QVElPTlNfU0VMRUNUT1IpICsgJykgYnV0IG5vdCBmb3VuZC4nKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGxldCBvYmogPSB7fTtcblxuICAgIHRyeSB7XG4gICAgICAgIG9iaiA9IHBhcnNlT3B0aW9uc0pTT04uY2FsbCh0aGlzLCBub2RlLnRleHRDb250ZW50LnRyaW0oKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGFkZEF0dHJpYnV0ZVRva2VuKHNlbGYsIEFUVFJJQlVURV9FUlJPUk1FU1NBR0UsICd3aGVuIGFuYWx5emluZyB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBzY3JpcHQgdGFnIHRoZXJlIHdhcyBhbiBlcnJvci4gJyArIGUpO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRPcHRpb25zRnJvbUF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoQVRUUklCVVRFX09QVElPTlMpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VPcHRpb25zSlNPTi5jYWxsKHNlbGYsIHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9PUFRJT05TKSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYWRkQXR0cmlidXRlVG9rZW4oc2VsZiwgQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgJ3RoZSBvcHRpb25zIGF0dHJpYnV0ZSAnICsgQVRUUklCVVRFX09QVElPTlMgKyAnIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBqc29uIGRlZmluaXRpb24gKGFjdHVhbDogJyArIHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9PUFRJT05TKSArICcpLicgKyBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gcGFyc2VPcHRpb25zSlNPTihkYXRhKSB7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcywgb2JqID0ge307XG5cbiAgICBpZiAoIWlzU3RyaW5nKGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHNwZWNpZmllZCBhcyBhIGRhdGEgdXJsLlxuICAgIHRyeSB7XG4gICAgICAgIGxldCBkYXRhVXJsID0gcGFyc2VEYXRhVVJMKGRhdGEpO1xuICAgICAgICBkYXRhID0gZGF0YVVybC5jb250ZW50O1xuICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGxldCBvYmogPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qob2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtpbml0SHRtbENvbnRlbnR9XG4gKi9cbmZ1bmN0aW9uIGluaXRIdG1sQ29udGVudCgpIHtcblxuICAgIHRyeSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9IGZpbmREb2N1bWVudFRlbXBsYXRlKHRoaXMuY29uc3RydWN0b3IuZ2V0VGFnKCkpO1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRlbXBsYXRlLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgIGxldCBodG1sID0gdGhpcy5nZXRPcHRpb24oJ3RlbXBsYXRlcy5tYWluJywgJycpO1xuICAgICAgICBpZiAoaXNTdHJpbmcoaHRtbCkgJiYgaHRtbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge0N1c3RvbUVsZW1lbnR9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEB0aGlzIEN1c3RvbUVsZW1lbnRcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTYuMFxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAqL1xuZnVuY3Rpb24gaW5pdENTU1N0eWxlc2hlZXQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoISh0aGlzLnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSkge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZVNoZWV0ID0gdGhpcy5jb25zdHJ1Y3Rvci5nZXRDU1NTdHlsZVNoZWV0KCk7XG5cbiAgICBpZiAoc3R5bGVTaGVldCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQpIHtcbiAgICAgICAgaWYgKHN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFtzdHlsZVNoZWV0XTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShzdHlsZVNoZWV0KSkge1xuICAgICAgICBjb25zdCBhc3NpZ24gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcyBvZiBzdHlsZVNoZWV0KSB7XG5cbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhzKSkge1xuICAgICAgICAgICAgICAgIGxldCB0cmltZWRTdHlsZVNoZWV0ID0gcy50cmltKClcbiAgICAgICAgICAgICAgICBpZiAodHJpbWVkU3R5bGVTaGVldCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmlubmVySFRNTCA9IHRyaW1lZFN0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93Um9vdC5wcmVwZW5kKHN0eWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRlSW5zdGFuY2UocywgQ1NTU3R5bGVTaGVldCk7XG5cbiAgICAgICAgICAgIGlmIChzLmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhc3NpZ24ucHVzaChzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzc2lnbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzID0gYXNzaWduO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHN0eWxlU2hlZXQpKSB7XG5cbiAgICAgICAgbGV0IHRyaW1lZFN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0LnRyaW0oKVxuICAgICAgICBpZiAodHJpbWVkU3R5bGVTaGVldCAhPT0gJycpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICAgICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gc3R5bGVTaGVldDtcbiAgICAgICAgICAgIHNlbGYuc2hhZG93Um9vdC5wcmVwZW5kKHN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7Q3VzdG9tRWxlbWVudH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBodG1sIGlzIG5vdCBzZXQuXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2F0dGFjaFNoYWRvd1xuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjguMFxuICovXG5mdW5jdGlvbiBpbml0U2hhZG93Um9vdCgpIHtcblxuICAgIGxldCB0ZW1wbGF0ZSwgaHRtbDtcblxuICAgIHRyeSB7XG4gICAgICAgIHRlbXBsYXRlID0gZmluZERvY3VtZW50VGVtcGxhdGUodGhpcy5jb25zdHJ1Y3Rvci5nZXRUYWcoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgIGh0bWwgPSB0aGlzLmdldE9wdGlvbigndGVtcGxhdGVzLm1haW4nLCAnJyk7XG4gICAgICAgIGlmICghaXNTdHJpbmcoaHRtbCkgfHwgaHRtbCA9PT0gdW5kZWZpbmVkIHx8IGh0bWwgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImh0bWwgaXMgbm90IHNldC5cIik7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHRoaXMuYXR0YWNoU2hhZG93KHtcbiAgICAgICAgbW9kZTogdGhpcy5nZXRPcHRpb24oJ3NoYWRvd01vZGUnLCAnb3BlbicpLFxuICAgICAgICBkZWxlZ2F0ZXNGb2N1czogdGhpcy5nZXRPcHRpb24oJ2RlbGVnYXRlc0ZvY3VzJywgdHJ1ZSlcbiAgICB9KTtcblxuICAgIGlmICh0ZW1wbGF0ZSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLnNoYWRvd1Jvb3QuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCByZWdpc3RlcnMgYSBuZXcgZWxlbWVudC4gVGhlIHN0cmluZyByZXR1cm5lZCBieSBgQ3VzdG9tRWxlbWVudC5nZXRUYWcoKWAgaXMgdXNlZCBhcyB0aGUgdGFnLlxuICpcbiAqIEBwYXJhbSB7Q3VzdG9tRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtET01FeGNlcHRpb259IEZhaWxlZCB0byBleGVjdXRlICdkZWZpbmUnIG9uICdDdXN0b21FbGVtZW50UmVnaXN0cnknOiBpcyBub3QgYSB2YWxpZCBjdXN0b20gZWxlbWVudCBuYW1lXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgdmFsaWRhdGVGdW5jdGlvbihlbGVtZW50KTtcbiAgICBnZXRHbG9iYWxPYmplY3QoJ2N1c3RvbUVsZW1lbnRzJykuZGVmaW5lKGVsZW1lbnQuZ2V0VGFnKCksIGVsZW1lbnQpO1xufVxuXG5cbi8qKlxuICpcbiAqIEBwYXJhbSBlbGVtZW50XG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcmV0dXJuIHtQcm9taXNlW119XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjIzLjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICovXG5mdW5jdGlvbiBhc3NpZ25VcGRhdGVyVG9FbGVtZW50KGVsZW1lbnRzLCBvYmplY3QpIHtcblxuICAgIGNvbnN0IHVwZGF0ZXJzID0gbmV3IFNldDtcblxuICAgIGlmIChlbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7XG4gICAgICAgIGVsZW1lbnRzID0gbmV3IFNldChbXG4gICAgICAgICAgICAuLi5lbGVtZW50c1xuICAgICAgICBdKVxuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgICBpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHUgPSBuZXcgVXBkYXRlcihlbGVtZW50LCBvYmplY3QpXG4gICAgICAgIHVwZGF0ZXJzLmFkZCh1KTtcblxuICAgICAgICByZXN1bHQucHVzaCh1LnJ1bigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHUuZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCk7XG4gICAgICAgIH0pKTtcblxuICAgIH0pO1xuXG4gICAgaWYgKHVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgIGFkZFRvT2JqZWN0TGluayh0aGlzLCBvYmplY3RVcGRhdGVyTGlua1N5bWJvbCwgdXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfVkFMVUV9IGZyb20gXCIuL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7Q3VzdG9tRWxlbWVudCwgYXR0cmlidXRlT2JzZXJ2ZXJTeW1ib2x9IGZyb20gXCIuL2N1c3RvbWVsZW1lbnQubWpzXCI7XG5cbmV4cG9ydCB7Q3VzdG9tQ29udHJvbH1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgYXR0YWNoZWRJbnRlcm5hbFN5bWJvbCA9IFN5bWJvbCgnYXR0YWNoZWRJbnRlcm5hbCcpO1xuXG4vKipcbiAqIFRvIGRlZmluZSBhIG5ldyBIVE1MIGNvbnRyb2wgd2UgbmVlZCB0aGUgcG93ZXIgb2YgQ3VzdG9tRWxlbWVudFxuICpcbiAqIElNUE9SVEFOVDogYWZ0ZXIgZGVmaW5pbmcgYSBgQ3VzdG9tRWxlbWVudGAsIHRoZSBgcmVnaXN0ZXJDdXN0b21FbGVtZW50YCBtZXRob2QgbXVzdCBiZSBjYWxsZWRcbiAqIHdpdGggdGhlIG5ldyBjbGFzcyBuYW1lLiBvbmx5IHRoZW4gd2lsbCB0aGUgdGFnIGRlZmluZWQgdmlhIHRoZSBgZ2V0VGFnYCBtZXRob2QgYmUgbWFkZSBrbm93biB0byB0aGUgRE9NLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWFnZXMvY3VzdG9tY29udHJvbC1jbGFzcy5wbmdcIj5cbiAqXG4gKiBUaGlzIGNvbnRyb2wgdXNlcyBgYXR0YWNoSW50ZXJuYWxzKClgIHRvIGludGVncmF0ZSB0aGUgY29udHJvbCBpbnRvIGEgZm9ybS5cbiAqIElmIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCwgdGhlIFtwb2x5ZmlsbF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZWxlbWVudC1pbnRlcm5hbHMtcG9seWZpbGwgKSBjYW4gYmUgdXNlZC5cbiAqXG4gKiBZb3UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IHZpYSB0aGUgZnVuY3Rpb24gYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoKWAuXG4gKlxuICogQHN0YXJ0dW1sIGN1c3RvbWNvbnRyb2wtY2xhc3MucG5nXG4gKiBza2lucGFyYW0gbW9ub2Nocm9tZSB0cnVlXG4gKiBza2lucGFyYW0gc2hhZG93aW5nIGZhbHNlXG4gKiBIVE1MRWxlbWVudCA8fC0tIEN1c3RvbUVsZW1lbnRcbiAqIEN1c3RvbUVsZW1lbnQgPHwtLSBDdXN0b21Db250cm9sXG4gKiBAZW5kdW1sXG4gKlxuICogQHN1bW1hcnkgQSBiYXNlIGNsYXNzIGZvciBjdXN0b21jb250cm9scyBiYXNlZCBvbiBDdXN0b21FbGVtZW50XG4gKiBAc2VlIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9lbGVtZW50LWludGVybmFscy1wb2x5ZmlsbH1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3dlYmNvbXBvbmVudHN9XG4gKiBAc2VlIHtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jdXN0b20tZWxlbWVudHMuaHRtbCNjdXN0b20tZWxlbWVudHN9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjE0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqL1xuY2xhc3MgQ3VzdG9tQ29udHJvbCBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuXG4gICAgLyoqXG4gICAgICogSU1QT1JUQU5UOiBDdXN0b21Db250cm9scyBpbnN0YW5jZXMgYXJlIG5vdCBjcmVhdGVkIHZpYSB0aGUgY29uc3RydWN0b3IsIGJ1dCBlaXRoZXIgdmlhIGEgdGFnIGluIHRoZSBIVE1MIG9yIHZpYSA8Y29kZT5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCk8L2NvZGU+LlxuICAgICAqXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICogQHN1bW1hcnkgY3JlYXRlIG5ldyBJbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1snYXR0YWNoSW50ZXJuYWxzJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGJ5IGNocm9tZVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9XG4gICAgICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzW2F0dGFjaGVkSW50ZXJuYWxTeW1ib2xdID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRPYnNlcnZlci5jYWxsKHRoaXMpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBtb25pdG9yZWQgYnkgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygpYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICAgICAqIEBzaW5jZSAxLjE1LjBcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgY29uc3QgbGlzdCA9IHN1cGVyLm9ic2VydmVkQXR0cmlidXRlcztcbiAgICAgICAgbGlzdC5wdXNoKEFUVFJJQlVURV9WQUxVRSk7XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgIH0gICAgXG4gICAgXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnQvYXR0YWNoSW50ZXJuYWxzfVxuICAgICAqIEBzaW5jZSAxLjE0LjBcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgZm9ybUFzc29jaWF0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZWQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYW5kIGV4dGVuZCB0aGlzIG1ldGhvZCBhcyBmb2xsb3dzLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZ2V0IGRlZmF1bHRzKCkge1xuICAgICAqICAgIHJldHVybiBleHRlbmRze30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICogICAgICAgIG15VmFsdWU6dHJ1ZVxuICAgICAqICAgIH0pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2N1c3RvbS1lbGVtZW50cy5odG1sI2N1c3RvbS1lbGVtZW50cy1mYWNlLWV4YW1wbGV9XG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxFbGVtZW50L2F0dGFjaEludGVybmFsc31cbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgc3VwZXIuZGVmYXVsdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE11c3QgYmUgb3ZlcnJpZGRlbiBieSBhIGRlcml2ZWQgY2xhc3MgYW5kIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgdmFsdWUgZ2V0dGVyIG11c3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGRlcml2ZWQgY2xhc3NcbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCd0aGUgdmFsdWUgZ2V0dGVyIG11c3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGRlcml2ZWQgY2xhc3MnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSB2YWx1ZSBzZXR0ZXIgbXVzdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZGVyaXZlZCBjbGFzc1xuICAgICAqL1xuICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aHJvdyBFcnJvcigndGhlIHZhbHVlIHNldHRlciBtdXN0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBkZXJpdmVkIGNsYXNzJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge05vZGVMaXN0fVxuICAgICAqIEBzaW5jZSAxLjE0LjBcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9sYWJlbHN9XG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICovXG4gICAgZ2V0IGxhYmVscygpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsLmNhbGwodGhpcyk/LmxhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAgICovXG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmdldFRhZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtWYWxpZGl0eVN0YXRlfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgRWxlbWVudEludGVybmFscyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9WYWxpZGl0eVN0YXRlfVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS92YWxpZGl0eX1cbiAgICAgKi9cbiAgICBnZXQgdmFsaWRpdHkoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbC5jYWxsKHRoaXMpPy52YWxpZGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqIEBzaW5jZSAxLjE0LjBcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL3ZhbGlkYXRpb25NZXNzYWdlXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICovXG4gICAgZ2V0IHZhbGlkYXRpb25NZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8udmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIG1ldGhvZCBvZiBbaW50ZXJuYWwgYXBpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscylcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvd2lsbFZhbGlkYXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICovXG4gICAgZ2V0IHdpbGxWYWxpZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsLmNhbGwodGhpcyk/LndpbGxWYWxpZGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHJldHVybiB7Q3VzdG9tU3RhdGVTZXR9XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvc3RhdGVzXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICovXG4gICAgZ2V0IHN0YXRlcygpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsLmNhbGwodGhpcyk/LnN0YXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHJldHVybiB7SFRNTEZvbnRFbGVtZW50fG51bGx9XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMvZm9ybVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgRWxlbWVudEludGVybmFscyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuICAgICAqL1xuICAgIGdldCBmb3JtKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWwuY2FsbCh0aGlzKT8uZm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogLy8gVXNlIHRoZSBjb250cm9sJ3MgbmFtZSBhcyB0aGUgYmFzZSBuYW1lIGZvciBzdWJtaXR0ZWQgZGF0YVxuICAgICAqIGNvbnN0IG4gPSB0aGlzLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuICAgICAqIGNvbnN0IGVudHJpZXMgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgKiBlbnRyaWVzLmFwcGVuZChuICsgJy1maXJzdC1uYW1lJywgdGhpcy5maXJzdE5hbWVfKTtcbiAgICAgKiBlbnRyaWVzLmFwcGVuZChuICsgJy1sYXN0LW5hbWUnLCB0aGlzLmxhc3ROYW1lXyk7XG4gICAgICogdGhpcy5zZXRGb3JtVmFsdWUoZW50cmllcyk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0ZpbGV8c3RyaW5nfEZvcm1EYXRhfSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7RmlsZXxzdHJpbmd8Rm9ybURhdGF9IHN0YXRlXG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgKiBAdGhyb3dzIHtET01FeGNlcHRpb259IE5vdFN1cHBvcnRlZEVycm9yXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9zZXRGb3JtVmFsdWVcbiAgICAgKi9cbiAgICBzZXRGb3JtVmFsdWUodmFsdWUsIHN0YXRlKSB7XG4gICAgICAgIGdldEludGVybmFsLmNhbGwodGhpcykuc2V0Rm9ybVZhbHVlKHZhbHVlLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZmxhZ3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBhbmNob3JcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL3NldFZhbGlkaXR5XG4gICAgICogQHNpbmNlIDEuMTQuMFxuICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgKiBAdGhyb3dzIHtET01FeGNlcHRpb259IE5vdFN1cHBvcnRlZEVycm9yXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICovXG4gICAgc2V0VmFsaWRpdHkoZmxhZ3MsIG1lc3NhZ2UsIGFuY2hvcikge1xuICAgICAgICBnZXRJbnRlcm5hbC5jYWxsKHRoaXMpLnNldFZhbGlkaXR5KGZsYWdzLCBtZXNzYWdlLCBhbmNob3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBtZXRob2Qgb2YgW2ludGVybmFsIGFwaV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnRJbnRlcm5hbHMpXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzL2NoZWNrVmFsaWRpdHlcbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKiBAdGhyb3dzIHtET01FeGNlcHRpb259IE5vdFN1cHBvcnRlZEVycm9yXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5XG4gICAgICovXG4gICAgY2hlY2tWYWxpZGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsLmNhbGwodGhpcyk/LmNoZWNrVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgbWV0aG9kIG9mIFtpbnRlcm5hbCBhcGldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50SW50ZXJuYWxzKVxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKiBAc2luY2UgMS4xNC4wXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudEludGVybmFscy9yZXBvcnRWYWxpZGl0eVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgRWxlbWVudEludGVybmFscyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuICAgICAqIEB0aHJvd3Mge0RPTUV4Y2VwdGlvbn0gTm90U3VwcG9ydGVkRXJyb3JcbiAgICAgKi9cbiAgICByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsLmNhbGwodGhpcyk/LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgRWxlbWVudEludGVybmFscyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhIHBvbHlmaWxsIGlzIG5lY2Vzc2FyeVxuICogQHRoaXMgQ3VzdG9tQ29udHJvbFxuICovXG5mdW5jdGlvbiBnZXRJbnRlcm5hbCgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmICghKGF0dGFjaGVkSW50ZXJuYWxTeW1ib2wgaW4gdGhpcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50SW50ZXJuYWxzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGEgcG9seWZpbGwgaXMgbmVjZXNzYXJ5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbYXR0YWNoZWRJbnRlcm5hbFN5bWJvbF07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEB0aGlzIEN1c3RvbUNvbnRyb2xcbiAqL1xuZnVuY3Rpb24gaW5pdE9ic2VydmVyKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gdmFsdWVcbiAgICBzZWxmW2F0dHJpYnV0ZU9ic2VydmVyU3ltYm9sXVsndmFsdWUnXSA9ICgpID0+IHtcbiAgICAgICAgc2VsZi5zZXRPcHRpb24oJ3ZhbHVlJywgc2VsZi5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpO1xuICAgIH1cblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtnZXREb2N1bWVudCwgZ2V0V2luZG93fSBmcm9tIFwiLi91dGlsLm1qc1wiO1xuXG5leHBvcnQge2RvbVJlYWR5LCB3aW5kb3dSZWFkeX1cblxuLyoqXG4gKiBUaGlzIHZhcmlhYmxlIGlzIGEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBhcyBzb29uIGFzIHRoZSBkb20gaXMgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIG9yaWdpbmFsIEhUTUwgZG9jdW1lbnQgaXMgZnVsbHkgbG9hZGVkIGFuZCBwYXJzZWRcbiAqIHdpdGhvdXQgd2FpdGluZyBmb3Igc3R5bGVzaGVldHMsIGltYWdlcywgYW5kIHN1YmZyYW1lcyB0byBmaW5pc2ggbG9hZGluZy5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMxLjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTVxuICogQHN1bW1hcnkgdmFyaWFibGUgdG8gY2hlY2sgaWYgZG9tIGlzIHJlYWR5XG4gKiBAdHlwZSB7UHJvbWlzZX1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L0RPTUNvbnRlbnRMb2FkZWRfZXZlbnRcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L3JlYWR5U3RhdGVcbiAqL1xuY29uc3QgZG9tUmVhZHkgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblxuICAgIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cbn0pO1xuXG5cbi8qKlxuICogVGhpcyB2YXJpYWJsZSBpcyBhIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgYXMgc29vbiBhcyB0aGUgd2luZG93cyBpcyBhdmFpbGFibGUuXG4gKlxuICogVGhlIGxvYWQgZXZlbnQgZmlyZXMgd2hlbiB0aGUgZW50aXJlIHBhZ2UgaXMgbG9hZGVkLCBpbmNsdWRpbmcgYWxsIGRlcGVuZGVudCByZXNvdXJjZXMgc3VjaCBhcyBzdHlsZXNoZWV0cyxcbiAqIGFzc2V0cywgYW5kIGltYWdlcy4gVW5saWtlIERPTUNvbnRlbnRMb2FkZWQsIHdoaWNoIGZpcmVzIGFzIHNvb24gYXMgdGhlIERPTSBvZiB0aGUgcGFnZSBpcyBsb2FkZWQsXG4gKiB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSByZXNvdXJjZXMgdG8gZmluaXNoIGxvYWRpbmcuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4zMS4wXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBzdW1tYXJ5IHZhcmlhYmxlIHRvIGNoZWNrIGlmIHdpbmRvdyBpcyByZWFkeVxuICogQHR5cGUge1Byb21pc2V9XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvbG9hZF9ldmVudFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcmVhZHlTdGF0ZVxuICovXG5jb25zdCB3aW5kb3dSZWFkeSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICAgIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuXG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZSk7XG4gICAgfVxufSk7XG4iLCAiLyohXG4gKiBNSVQgTGljZW5zZVxuICogXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMiBQZWN1bGlhciBWZW50dXJlcywgTExDXG4gKiBcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqIFxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICogXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuY29uc3QgQVJSQVlfQlVGRkVSX05BTUUgPSBcIltvYmplY3QgQXJyYXlCdWZmZXJdXCI7XHJcbmNsYXNzIEJ1ZmZlclNvdXJjZUNvbnZlcnRlciB7XHJcbiAgICBzdGF0aWMgaXNBcnJheUJ1ZmZlcihkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gQVJSQVlfQlVGRkVSX05BTUU7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgdG9BcnJheUJ1ZmZlcihkYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGEuYnl0ZUxlbmd0aCA9PT0gZGF0YS5idWZmZXIuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5idWZmZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRvVWludDhBcnJheShkYXRhKS5zbGljZSgpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyB0b1VpbnQ4QXJyYXkoZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvVmlldyhkYXRhLCBVaW50OEFycmF5KTtcclxuICAgIH1cclxuICAgIHN0YXRpYyB0b1ZpZXcoZGF0YSwgdHlwZSkge1xyXG4gICAgICAgIGlmIChkYXRhLmNvbnN0cnVjdG9yID09PSB0eXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc0FycmF5QnVmZmVyKGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgdHlwZShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyB0eXBlKGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBpc0J1ZmZlclNvdXJjZShkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSlcclxuICAgICAgICAgICAgfHwgdGhpcy5pc0FycmF5QnVmZmVyKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpXHJcbiAgICAgICAgICAgIHx8IChkYXRhICYmIHRoaXMuaXNBcnJheUJ1ZmZlcihkYXRhLmJ1ZmZlcikpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzRXF1YWwoYSwgYikge1xyXG4gICAgICAgIGNvbnN0IGFWaWV3ID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShhKTtcclxuICAgICAgICBjb25zdCBiVmlldyA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYik7XHJcbiAgICAgICAgaWYgKGFWaWV3Lmxlbmd0aCAhPT0gYlZpZXcuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYVZpZXcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFWaWV3W2ldICE9PSBiVmlld1tpXSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNvbmNhdCguLi5hcmdzKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcclxuICAgICAgICAgICAgY29uc3QgYnVmZmVycyA9IGFyZ3NbMF07XHJcbiAgICAgICAgICAgIGxldCBzaXplID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xyXG4gICAgICAgICAgICAgICAgc2l6ZSArPSBidWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShzaXplKTtcclxuICAgICAgICAgICAgbGV0IG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnRvVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgICAgICAgICAgcmVzLnNldCh2aWV3LCBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHZpZXcubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhcmdzWzFdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b1ZpZXcocmVzLCBhcmdzWzFdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzLmJ1ZmZlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmNhdChhcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgVXRmOENvbnZlcnRlciB7XHJcbiAgICBzdGF0aWMgZnJvbVN0cmluZyh0ZXh0KSB7XHJcbiAgICAgICAgY29uc3QgcyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSk7XHJcbiAgICAgICAgY29uc3QgdWludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkocy5sZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB1aW50QXJyYXlbaV0gPSBzLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1aW50QXJyYXkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHRvU3RyaW5nKGJ1ZmZlcikge1xyXG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgICAgICBsZXQgZW5jb2RlZFN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZW5jb2RlZFN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRlY29kZWRTdHJpbmcgPSBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGVuY29kZWRTdHJpbmcpKTtcclxuICAgICAgICByZXR1cm4gZGVjb2RlZFN0cmluZztcclxuICAgIH1cclxufVxyXG5jbGFzcyBVdGYxNkNvbnZlcnRlciB7XHJcbiAgICBzdGF0aWMgdG9TdHJpbmcoYnVmZmVyLCBsaXR0bGVFbmRpYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoYnVmZmVyKTtcclxuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgbGV0IHJlcyA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgICAgICAgY29uc3QgY29kZSA9IGRhdGFWaWV3LmdldFVpbnQxNihpLCBsaXR0bGVFbmRpYW4pO1xyXG4gICAgICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHRleHQsIGxpdHRsZUVuZGlhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IEFycmF5QnVmZmVyKHRleHQubGVuZ3RoICogMik7XHJcbiAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcocmVzKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KGkgKiAyLCB0ZXh0LmNoYXJDb2RlQXQoaSksIGxpdHRsZUVuZGlhbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgQ29udmVydCB7XHJcbiAgICBzdGF0aWMgaXNIZXgoZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIlxyXG4gICAgICAgICAgICAmJiAvXlthLXowLTldKyQvaS50ZXN0KGRhdGEpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzQmFzZTY0KGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCJcclxuICAgICAgICAgICAgJiYgL14oPzpbQS1aYS16MC05Ky9dezR9KSooPzpbQS1aYS16MC05Ky9dezJ9PT18W0EtWmEtejAtOSsvXXszfT0pPyQvLnRlc3QoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNCYXNlNjRVcmwoZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIlxyXG4gICAgICAgICAgICAmJiAvXlthLXpBLVowLTktX10rJC9pLnRlc3QoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgVG9TdHJpbmcoYnVmZmVyLCBlbmMgPSBcInV0ZjhcIikge1xyXG4gICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgICAgICBzd2l0Y2ggKGVuYy50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGY4XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub1V0ZjhTdHJpbmcoYnVmKTtcclxuICAgICAgICAgICAgY2FzZSBcImJpbmFyeVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVG9CaW5hcnkoYnVmKTtcclxuICAgICAgICAgICAgY2FzZSBcImhleFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVG9IZXgoYnVmKTtcclxuICAgICAgICAgICAgY2FzZSBcImJhc2U2NFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVG9CYXNlNjQoYnVmKTtcclxuICAgICAgICAgICAgY2FzZSBcImJhc2U2NHVybFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVG9CYXNlNjRVcmwoYnVmKTtcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2bGVcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci50b1N0cmluZyhidWYsIHRydWUpO1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZcIjpcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2YmVcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci50b1N0cmluZyhidWYpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgb2YgZW5jb2RpbmcgJyR7ZW5jfSdgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgRnJvbVN0cmluZyhzdHIsIGVuYyA9IFwidXRmOFwiKSB7XHJcbiAgICAgICAgaWYgKCFzdHIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoIChlbmMudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmOFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbVV0ZjhTdHJpbmcoc3RyKTtcclxuICAgICAgICAgICAgY2FzZSBcImJpbmFyeVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbUJpbmFyeShzdHIpO1xyXG4gICAgICAgICAgICBjYXNlIFwiaGV4XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Gcm9tSGV4KHN0cik7XHJcbiAgICAgICAgICAgIGNhc2UgXCJiYXNlNjRcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkZyb21CYXNlNjQoc3RyKTtcclxuICAgICAgICAgICAgY2FzZSBcImJhc2U2NHVybFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbUJhc2U2NFVybChzdHIpO1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZsZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLmZyb21TdHJpbmcoc3RyLCB0cnVlKTtcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNmJlXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIuZnJvbVN0cmluZyhzdHIpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgb2YgZW5jb2RpbmcgJyR7ZW5jfSdgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgVG9CYXNlNjQoYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLlRvU3RyaW5nKGJ1ZiwgXCJiaW5hcnlcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBidG9hKGJpbmFyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYnVmKS50b1N0cmluZyhcImJhc2U2NFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgRnJvbUJhc2U2NChiYXNlNjQpIHtcclxuICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdFN0cmluZyhiYXNlNjQpO1xyXG4gICAgICAgIGlmICghZm9ybWF0dGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghQ29udmVydC5pc0Jhc2U2NChmb3JtYXR0ZWQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCAnYmFzZTY0VGV4dCcgaXMgbm90IEJhc2U2NCBlbmNvZGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGF0b2IgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuRnJvbUJpbmFyeShhdG9iKGZvcm1hdHRlZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKGZvcm1hdHRlZCwgXCJiYXNlNjRcIikpLmJ1ZmZlcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgRnJvbUJhc2U2NFVybChiYXNlNjR1cmwpIHtcclxuICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdFN0cmluZyhiYXNlNjR1cmwpO1xyXG4gICAgICAgIGlmICghZm9ybWF0dGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghQ29udmVydC5pc0Jhc2U2NFVybChmb3JtYXR0ZWQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCAnYmFzZTY0dXJsJyBpcyBub3QgQmFzZTY0VXJsIGVuY29kZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLkZyb21CYXNlNjQodGhpcy5CYXNlNjRQYWRkaW5nKGZvcm1hdHRlZC5yZXBsYWNlKC9cXC0vZywgXCIrXCIpLnJlcGxhY2UoL1xcXy9nLCBcIi9cIikpKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBUb0Jhc2U2NFVybChkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuVG9CYXNlNjQoZGF0YSkucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpLnJlcGxhY2UoL1xcPS9nLCBcIlwiKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBGcm9tVXRmOFN0cmluZyh0ZXh0LCBlbmNvZGluZyA9IENvbnZlcnQuREVGQVVMVF9VVEY4X0VOQ09ESU5HKSB7XHJcbiAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xyXG4gICAgICAgICAgICBjYXNlIFwiYXNjaWlcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkZyb21CaW5hcnkodGV4dCk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGY4XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmOENvbnZlcnRlci5mcm9tU3RyaW5nKHRleHQpO1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZcIjpcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjE2YmVcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGYxNkNvbnZlcnRlci5mcm9tU3RyaW5nKHRleHQpO1xyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZsZVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidXNjMlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLmZyb21TdHJpbmcodGV4dCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZSBvZiBlbmNvZGluZyAnJHtlbmNvZGluZ30nYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIFRvVXRmOFN0cmluZyhidWZmZXIsIGVuY29kaW5nID0gQ29udmVydC5ERUZBVUxUX1VURjhfRU5DT0RJTkcpIHtcclxuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJhc2NpaVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVG9CaW5hcnkoYnVmZmVyKTtcclxuICAgICAgICAgICAgY2FzZSBcInV0ZjhcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBVdGY4Q29udmVydGVyLnRvU3RyaW5nKGJ1ZmZlcik7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNlwiOlxyXG4gICAgICAgICAgICBjYXNlIFwidXRmMTZiZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLnRvU3RyaW5nKGJ1ZmZlcik7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1dGYxNmxlXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1c2MyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIudG9TdHJpbmcoYnVmZmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0eXBlIG9mIGVuY29kaW5nICcke2VuY29kaW5nfSdgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgRnJvbUJpbmFyeSh0ZXh0KSB7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nTGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0VmlldyA9IG5ldyBVaW50OEFycmF5KHN0cmluZ0xlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmdMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRWaWV3W2ldID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0Vmlldy5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgVG9CaW5hcnkoYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIGxldCByZXMgPSBcIlwiO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgVG9IZXgoYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgICAgIGNvbnN0IHNwbGl0dGVyID0gXCJcIjtcclxuICAgICAgICBjb25zdCByZXMgPSBbXTtcclxuICAgICAgICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2hhciA9IGJ1ZltpXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpO1xyXG4gICAgICAgICAgICByZXMucHVzaChjaGFyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcy5qb2luKHNwbGl0dGVyKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBGcm9tSGV4KGhleFN0cmluZykge1xyXG4gICAgICAgIGxldCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdFN0cmluZyhoZXhTdHJpbmcpO1xyXG4gICAgICAgIGlmICghZm9ybWF0dGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghQ29udmVydC5pc0hleChmb3JtYXR0ZWQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCAnaGV4U3RyaW5nJyBpcyBub3QgSEVYIGVuY29kZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3JtYXR0ZWQubGVuZ3RoICUgMikge1xyXG4gICAgICAgICAgICBmb3JtYXR0ZWQgPSBgMCR7Zm9ybWF0dGVkfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KGZvcm1hdHRlZC5sZW5ndGggLyAyKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1hdHRlZC5sZW5ndGg7IGkgPSBpICsgMikge1xyXG4gICAgICAgICAgICBjb25zdCBjID0gZm9ybWF0dGVkLnNsaWNlKGksIGkgKyAyKTtcclxuICAgICAgICAgICAgcmVzW2kgLyAyXSA9IHBhcnNlSW50KGMsIDE2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcy5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgVG9VdGYxNlN0cmluZyhidWZmZXIsIGxpdHRsZUVuZGlhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIFV0ZjE2Q29udmVydGVyLnRvU3RyaW5nKGJ1ZmZlciwgbGl0dGxlRW5kaWFuKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBGcm9tVXRmMTZTdHJpbmcodGV4dCwgbGl0dGxlRW5kaWFuID0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4gVXRmMTZDb252ZXJ0ZXIuZnJvbVN0cmluZyh0ZXh0LCBsaXR0bGVFbmRpYW4pO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIEJhc2U2NFBhZGRpbmcoYmFzZTY0KSB7XHJcbiAgICAgICAgY29uc3QgcGFkQ291bnQgPSA0IC0gKGJhc2U2NC5sZW5ndGggJSA0KTtcclxuICAgICAgICBpZiAocGFkQ291bnQgPCA0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYmFzZTY0ICs9IFwiPVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiYXNlNjQ7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZm9ybWF0U3RyaW5nKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5yZXBsYWNlKC9bXFxuXFxyXFx0IF0vZywgXCJcIikpIHx8IFwiXCI7XHJcbiAgICB9XHJcbn1cclxuQ29udmVydC5ERUZBVUxUX1VURjhfRU5DT0RJTkcgPSBcInV0ZjhcIjtcblxuZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgLi4uc291cmNlcykge1xyXG4gICAgY29uc3QgcmVzID0gYXJndW1lbnRzWzBdO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBvYmogPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xyXG4gICAgICAgICAgICByZXNbcHJvcF0gPSBvYmpbcHJvcF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxufVxyXG5mdW5jdGlvbiBjb21iaW5lKC4uLmJ1Zikge1xyXG4gICAgY29uc3QgdG90YWxCeXRlTGVuZ3RoID0gYnVmLm1hcCgoaXRlbSkgPT4gaXRlbS5ieXRlTGVuZ3RoKS5yZWR1Y2UoKHByZXYsIGN1cikgPT4gcHJldiArIGN1cik7XHJcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVMZW5ndGgpO1xyXG4gICAgbGV0IGN1cnJlbnRQb3MgPSAwO1xyXG4gICAgYnVmLm1hcCgoaXRlbSkgPT4gbmV3IFVpbnQ4QXJyYXkoaXRlbSkpLmZvckVhY2goKGFycikgPT4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbTIgb2YgYXJyKSB7XHJcbiAgICAgICAgICAgIHJlc1tjdXJyZW50UG9zKytdID0gaXRlbTI7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzLmJ1ZmZlcjtcclxufVxyXG5mdW5jdGlvbiBpc0VxdWFsKGJ5dGVzMSwgYnl0ZXMyKSB7XHJcbiAgICBpZiAoIShieXRlczEgJiYgYnl0ZXMyKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChieXRlczEuYnl0ZUxlbmd0aCAhPT0gYnl0ZXMyLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBiMSA9IG5ldyBVaW50OEFycmF5KGJ5dGVzMSk7XHJcbiAgICBjb25zdCBiMiA9IG5ldyBVaW50OEFycmF5KGJ5dGVzMik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzMS5ieXRlTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoYjFbaV0gIT09IGIyW2ldKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxuXG5leHBvcnRzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlcjtcbmV4cG9ydHMuQ29udmVydCA9IENvbnZlcnQ7XG5leHBvcnRzLmFzc2lnbiA9IGFzc2lnbjtcbmV4cG9ydHMuY29tYmluZSA9IGNvbWJpbmU7XG5leHBvcnRzLmlzRXF1YWwgPSBpc0VxdWFsO1xuIiwgIi8qIVxuIENvcHlyaWdodCAoYykgUGVjdWxpYXIgVmVudHVyZXMsIExMQ1xuKi9cblxuZnVuY3Rpb24gZ2V0VVRDRGF0ZShkYXRlKSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgKyAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDApKTtcclxufVxyXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJzVmFsdWUocGFyYW1ldGVycywgbmFtZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICBpZiAoKHBhcmFtZXRlcnMgaW5zdGFuY2VvZiBPYmplY3QpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKF9hID0gcGFyYW1ldGVyc1tuYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGVmYXVsdFZhbHVlO1xyXG59XHJcbmZ1bmN0aW9uIGJ1ZmZlclRvSGV4Q29kZXMoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0ID0gMCwgaW5wdXRMZW5ndGggPSAoaW5wdXRCdWZmZXIuYnl0ZUxlbmd0aCAtIGlucHV0T2Zmc2V0KSwgaW5zZXJ0U3BhY2UgPSBmYWxzZSkge1xyXG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgKG5ldyBVaW50OEFycmF5KGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSkge1xyXG4gICAgICAgIGNvbnN0IHN0ciA9IGl0ZW0udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IFwiMFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQgKz0gc3RyO1xyXG4gICAgICAgIGlmIChpbnNlcnRTcGFjZSkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gXCIgXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdC50cmltKCk7XHJcbn1cclxuZnVuY3Rpb24gY2hlY2tCdWZmZXJQYXJhbXMoYmFzZUJsb2NrLCBpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICBpZiAoIShpbnB1dEJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xyXG4gICAgICAgIGJhc2VCbG9jay5lcnJvciA9IFwiV3JvbmcgcGFyYW1ldGVyOiBpbnB1dEJ1ZmZlciBtdXN0IGJlIFxcXCJBcnJheUJ1ZmZlclxcXCJcIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlucHV0QnVmZmVyLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRCdWZmZXIgaGFzIHplcm8gbGVuZ3RoXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0T2Zmc2V0IDwgMCkge1xyXG4gICAgICAgIGJhc2VCbG9jay5lcnJvciA9IFwiV3JvbmcgcGFyYW1ldGVyOiBpbnB1dE9mZnNldCBsZXNzIHRoYW4gemVyb1wiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dExlbmd0aCA8IDApIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRMZW5ndGggbGVzcyB0aGFuIHplcm9cIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoKGlucHV0QnVmZmVyLmJ5dGVMZW5ndGggLSBpbnB1dE9mZnNldCAtIGlucHV0TGVuZ3RoKSA8IDApIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIkVuZCBvZiBpbnB1dCByZWFjaGVkIGJlZm9yZSBtZXNzYWdlIHdhcyBmdWxseSBkZWNvZGVkIChpbmNvbnNpc3RlbnQgb2Zmc2V0IGFuZCBsZW5ndGggdmFsdWVzKVwiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIHV0aWxGcm9tQmFzZShpbnB1dEJ1ZmZlciwgaW5wdXRCYXNlKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgIGlmIChpbnB1dEJ1ZmZlci5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICByZXR1cm4gaW5wdXRCdWZmZXJbMF07XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gKGlucHV0QnVmZmVyLmxlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHJlc3VsdCArPSBpbnB1dEJ1ZmZlclsoaW5wdXRCdWZmZXIubGVuZ3RoIC0gMSkgLSBpXSAqIE1hdGgucG93KDIsIGlucHV0QmFzZSAqIGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5mdW5jdGlvbiB1dGlsVG9CYXNlKHZhbHVlLCBiYXNlLCByZXNlcnZlZCA9ICgtMSkpIHtcclxuICAgIGNvbnN0IGludGVybmFsUmVzZXJ2ZWQgPSByZXNlcnZlZDtcclxuICAgIGxldCBpbnRlcm5hbFZhbHVlID0gdmFsdWU7XHJcbiAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgIGxldCBiaWdnZXN0ID0gTWF0aC5wb3coMiwgYmFzZSk7XHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IDg7IGkrKykge1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IGJpZ2dlc3QpIHtcclxuICAgICAgICAgICAgbGV0IHJldEJ1ZjtcclxuICAgICAgICAgICAgaWYgKGludGVybmFsUmVzZXJ2ZWQgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXRCdWYgPSBuZXcgQXJyYXlCdWZmZXIoaSk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFsUmVzZXJ2ZWQgPCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQXJyYXlCdWZmZXIoMCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0QnVmID0gbmV3IEFycmF5QnVmZmVyKGludGVybmFsUmVzZXJ2ZWQpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW50ZXJuYWxSZXNlcnZlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmV0QnVmKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IChpIC0gMSk7IGogPj0gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNpcyA9IE1hdGgucG93KDIsIGogKiBiYXNlKTtcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbcmVzdWx0IC0gaiAtIDFdID0gTWF0aC5mbG9vcihpbnRlcm5hbFZhbHVlIC8gYmFzaXMpO1xyXG4gICAgICAgICAgICAgICAgaW50ZXJuYWxWYWx1ZSAtPSAocmV0Vmlld1tyZXN1bHQgLSBqIC0gMV0pICogYmFzaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmlnZ2VzdCAqPSBNYXRoLnBvdygyLCBiYXNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbn1cclxuZnVuY3Rpb24gdXRpbENvbmNhdEJ1ZiguLi5idWZmZXJzKSB7XHJcbiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMDtcclxuICAgIGxldCBwcmV2TGVuZ3RoID0gMDtcclxuICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcclxuICAgICAgICBvdXRwdXRMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXRCdWYgPSBuZXcgQXJyYXlCdWZmZXIob3V0cHV0TGVuZ3RoKTtcclxuICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xyXG4gICAgICAgIHJldFZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIHByZXZMZW5ndGgpO1xyXG4gICAgICAgIHByZXZMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0QnVmO1xyXG59XHJcbmZ1bmN0aW9uIHV0aWxDb25jYXRWaWV3KC4uLnZpZXdzKSB7XHJcbiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMDtcclxuICAgIGxldCBwcmV2TGVuZ3RoID0gMDtcclxuICAgIGZvciAoY29uc3QgdmlldyBvZiB2aWV3cykge1xyXG4gICAgICAgIG91dHB1dExlbmd0aCArPSB2aWV3Lmxlbmd0aDtcclxuICAgIH1cclxuICAgIGNvbnN0IHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihvdXRwdXRMZW5ndGgpO1xyXG4gICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcclxuICAgICAgICByZXRWaWV3LnNldCh2aWV3LCBwcmV2TGVuZ3RoKTtcclxuICAgICAgICBwcmV2TGVuZ3RoICs9IHZpZXcubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFZpZXc7XHJcbn1cclxuZnVuY3Rpb24gdXRpbERlY29kZVRDKCkge1xyXG4gICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZUhleCk7XHJcbiAgICBpZiAodGhpcy52YWx1ZUhleC5ieXRlTGVuZ3RoID49IDIpIHtcclxuICAgICAgICBjb25zdCBjb25kaXRpb24xID0gKGJ1ZlswXSA9PT0gMHhGRikgJiYgKGJ1ZlsxXSAmIDB4ODApO1xyXG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbjIgPSAoYnVmWzBdID09PSAweDAwKSAmJiAoKGJ1ZlsxXSAmIDB4ODApID09PSAweDAwKTtcclxuICAgICAgICBpZiAoY29uZGl0aW9uMSB8fCBjb25kaXRpb24yKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIk5lZWRsZXNzbHkgbG9uZyBmb3JtYXRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgYmlnSW50QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXguYnl0ZUxlbmd0aCk7XHJcbiAgICBjb25zdCBiaWdJbnRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYmlnSW50QnVmZmVyKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZUhleC5ieXRlTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBiaWdJbnRWaWV3W2ldID0gMDtcclxuICAgIH1cclxuICAgIGJpZ0ludFZpZXdbMF0gPSAoYnVmWzBdICYgMHg4MCk7XHJcbiAgICBjb25zdCBiaWdJbnQgPSB1dGlsRnJvbUJhc2UoYmlnSW50VmlldywgOCk7XHJcbiAgICBjb25zdCBzbWFsbEludEJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLnZhbHVlSGV4LmJ5dGVMZW5ndGgpO1xyXG4gICAgY29uc3Qgc21hbGxJbnRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoc21hbGxJbnRCdWZmZXIpO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnZhbHVlSGV4LmJ5dGVMZW5ndGg7IGorKykge1xyXG4gICAgICAgIHNtYWxsSW50Vmlld1tqXSA9IGJ1ZltqXTtcclxuICAgIH1cclxuICAgIHNtYWxsSW50Vmlld1swXSAmPSAweDdGO1xyXG4gICAgY29uc3Qgc21hbGxJbnQgPSB1dGlsRnJvbUJhc2Uoc21hbGxJbnRWaWV3LCA4KTtcclxuICAgIHJldHVybiAoc21hbGxJbnQgLSBiaWdJbnQpO1xyXG59XHJcbmZ1bmN0aW9uIHV0aWxFbmNvZGVUQyh2YWx1ZSkge1xyXG4gICAgY29uc3QgbW9kVmFsdWUgPSAodmFsdWUgPCAwKSA/ICh2YWx1ZSAqICgtMSkpIDogdmFsdWU7XHJcbiAgICBsZXQgYmlnSW50ID0gMTI4O1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCA4OyBpKyspIHtcclxuICAgICAgICBpZiAobW9kVmFsdWUgPD0gYmlnSW50KSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNtYWxsSW50ID0gYmlnSW50IC0gbW9kVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXRCdWYgPSB1dGlsVG9CYXNlKHNtYWxsSW50LCA4LCBpKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1swXSB8PSAweDgwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldEJ1ZjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmV0QnVmID0gdXRpbFRvQmFzZShtb2RWYWx1ZSwgOCwgaSk7XHJcbiAgICAgICAgICAgIGxldCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmV0QnVmKTtcclxuICAgICAgICAgICAgaWYgKHJldFZpZXdbMF0gJiAweDgwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wQnVmID0gcmV0QnVmLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFZpZXcgPSBuZXcgVWludDhBcnJheSh0ZW1wQnVmKTtcclxuICAgICAgICAgICAgICAgIHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihyZXRCdWYuYnl0ZUxlbmd0aCArIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHJldEJ1Zik7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRlbXBCdWYuYnl0ZUxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0Vmlld1trICsgMV0gPSB0ZW1wVmlld1trXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldFZpZXdbMF0gPSAweDAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJpZ0ludCAqPSBNYXRoLnBvdygyLCA4KTtcclxuICAgIH1cclxuICAgIHJldHVybiAobmV3IEFycmF5QnVmZmVyKDApKTtcclxufVxyXG5mdW5jdGlvbiBpc0VxdWFsQnVmZmVyKGlucHV0QnVmZmVyMSwgaW5wdXRCdWZmZXIyKSB7XHJcbiAgICBpZiAoaW5wdXRCdWZmZXIxLmJ5dGVMZW5ndGggIT09IGlucHV0QnVmZmVyMi5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmlldzEgPSBuZXcgVWludDhBcnJheShpbnB1dEJ1ZmZlcjEpO1xyXG4gICAgY29uc3QgdmlldzIgPSBuZXcgVWludDhBcnJheShpbnB1dEJ1ZmZlcjIpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3MS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh2aWV3MVtpXSAhPT0gdmlldzJbaV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbmZ1bmN0aW9uIHBhZE51bWJlcihpbnB1dE51bWJlciwgZnVsbExlbmd0aCkge1xyXG4gICAgY29uc3Qgc3RyID0gaW5wdXROdW1iZXIudG9TdHJpbmcoMTApO1xyXG4gICAgaWYgKGZ1bGxMZW5ndGggPCBzdHIubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkaWYgPSBmdWxsTGVuZ3RoIC0gc3RyLmxlbmd0aDtcclxuICAgIGNvbnN0IHBhZGRpbmcgPSBuZXcgQXJyYXkoZGlmKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmOyBpKyspIHtcclxuICAgICAgICBwYWRkaW5nW2ldID0gXCIwXCI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYWRkaW5nU3RyaW5nID0gcGFkZGluZy5qb2luKFwiXCIpO1xyXG4gICAgcmV0dXJuIHBhZGRpbmdTdHJpbmcuY29uY2F0KHN0cik7XHJcbn1cclxuY29uc3QgYmFzZTY0VGVtcGxhdGUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XHJcbmNvbnN0IGJhc2U2NFVybFRlbXBsYXRlID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fPVwiO1xyXG5mdW5jdGlvbiB0b0Jhc2U2NChpbnB1dCwgdXNlVXJsVGVtcGxhdGUgPSBmYWxzZSwgc2tpcFBhZGRpbmcgPSBmYWxzZSwgc2tpcExlYWRpbmdaZXJvcyA9IGZhbHNlKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgZmxhZzEgPSAwO1xyXG4gICAgbGV0IGZsYWcyID0gMDtcclxuICAgIGxldCBvdXRwdXQgPSBcIlwiO1xyXG4gICAgY29uc3QgdGVtcGxhdGUgPSAodXNlVXJsVGVtcGxhdGUpID8gYmFzZTY0VXJsVGVtcGxhdGUgOiBiYXNlNjRUZW1wbGF0ZTtcclxuICAgIGlmIChza2lwTGVhZGluZ1plcm9zKSB7XHJcbiAgICAgICAgbGV0IG5vblplcm9Qb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChpKSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbm9uWmVyb1Bvc2l0aW9uID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2Uobm9uWmVyb1Bvc2l0aW9uKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgY2hyMSA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICBpZiAoaSA+PSBpbnB1dC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZmxhZzEgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjaHIyID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgIGlmIChpID49IGlucHV0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmbGFnMiA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNocjMgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XHJcbiAgICAgICAgY29uc3QgZW5jMSA9IGNocjEgPj4gMjtcclxuICAgICAgICBjb25zdCBlbmMyID0gKChjaHIxICYgMHgwMykgPDwgNCkgfCAoY2hyMiA+PiA0KTtcclxuICAgICAgICBsZXQgZW5jMyA9ICgoY2hyMiAmIDB4MEYpIDw8IDIpIHwgKGNocjMgPj4gNik7XHJcbiAgICAgICAgbGV0IGVuYzQgPSBjaHIzICYgMHgzRjtcclxuICAgICAgICBpZiAoZmxhZzEgPT09IDEpIHtcclxuICAgICAgICAgICAgZW5jMyA9IGVuYzQgPSA2NDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChmbGFnMiA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgZW5jNCA9IDY0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChza2lwUGFkZGluZykge1xyXG4gICAgICAgICAgICBpZiAoZW5jMyA9PT0gNjQpIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dCArPSBgJHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMSl9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMil9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmM0ID09PSA2NCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBgJHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMSl9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMil9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMyl9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBgJHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMSl9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMil9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jMyl9JHt0ZW1wbGF0ZS5jaGFyQXQoZW5jNCl9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9IGAke3RlbXBsYXRlLmNoYXJBdChlbmMxKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMyKX0ke3RlbXBsYXRlLmNoYXJBdChlbmMzKX0ke3RlbXBsYXRlLmNoYXJBdChlbmM0KX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn1cclxuZnVuY3Rpb24gZnJvbUJhc2U2NChpbnB1dCwgdXNlVXJsVGVtcGxhdGUgPSBmYWxzZSwgY3V0VGFpbFplcm9zID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlID0gKHVzZVVybFRlbXBsYXRlKSA/IGJhc2U2NFVybFRlbXBsYXRlIDogYmFzZTY0VGVtcGxhdGU7XHJcbiAgICBmdW5jdGlvbiBpbmRleE9mKHRvU2VhcmNoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5jaGFyQXQoaSkgPT09IHRvU2VhcmNoKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiA2NDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHRlc3QoaW5jb21pbmcpIHtcclxuICAgICAgICByZXR1cm4gKChpbmNvbWluZyA9PT0gNjQpID8gMHgwMCA6IGluY29taW5nKTtcclxuICAgIH1cclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBvdXRwdXQgPSBcIlwiO1xyXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBlbmMxID0gaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XHJcbiAgICAgICAgY29uc3QgZW5jMiA9IChpID49IGlucHV0Lmxlbmd0aCkgPyAweDAwIDogaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XHJcbiAgICAgICAgY29uc3QgZW5jMyA9IChpID49IGlucHV0Lmxlbmd0aCkgPyAweDAwIDogaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XHJcbiAgICAgICAgY29uc3QgZW5jNCA9IChpID49IGlucHV0Lmxlbmd0aCkgPyAweDAwIDogaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XHJcbiAgICAgICAgY29uc3QgY2hyMSA9ICh0ZXN0KGVuYzEpIDw8IDIpIHwgKHRlc3QoZW5jMikgPj4gNCk7XHJcbiAgICAgICAgY29uc3QgY2hyMiA9ICgodGVzdChlbmMyKSAmIDB4MEYpIDw8IDQpIHwgKHRlc3QoZW5jMykgPj4gMik7XHJcbiAgICAgICAgY29uc3QgY2hyMyA9ICgodGVzdChlbmMzKSAmIDB4MDMpIDw8IDYpIHwgdGVzdChlbmM0KTtcclxuICAgICAgICBvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIxKTtcclxuICAgICAgICBpZiAoZW5jMyAhPT0gNjQpIHtcclxuICAgICAgICAgICAgb3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbmM0ICE9PSA2NCkge1xyXG4gICAgICAgICAgICBvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY3V0VGFpbFplcm9zKSB7XHJcbiAgICAgICAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcclxuICAgICAgICBsZXQgbm9uWmVyb1N0YXJ0ID0gKC0xKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gKG91dHB1dExlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBpZiAob3V0cHV0LmNoYXJDb2RlQXQoaSkgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIG5vblplcm9TdGFydCA9IGk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9uWmVyb1N0YXJ0ICE9PSAoLTEpKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5zbGljZSgwLCBub25aZXJvU3RhcnQgKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxufVxyXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvU3RyaW5nKGJ1ZmZlcikge1xyXG4gICAgbGV0IHJlc3VsdFN0cmluZyA9IFwiXCI7XHJcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB2aWV3KSB7XHJcbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0U3RyaW5nO1xyXG59XHJcbmZ1bmN0aW9uIHN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyKSB7XHJcbiAgICBjb25zdCBzdHJpbmdMZW5ndGggPSBzdHIubGVuZ3RoO1xyXG4gICAgY29uc3QgcmVzdWx0QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHN0cmluZ0xlbmd0aCk7XHJcbiAgICBjb25zdCByZXN1bHRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmVzdWx0QnVmZmVyKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICByZXN1bHRWaWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0QnVmZmVyO1xyXG59XHJcbmNvbnN0IGxvZzIgPSBNYXRoLmxvZygyKTtcclxuZnVuY3Rpb24gbmVhcmVzdFBvd2VyT2YyKGxlbmd0aCkge1xyXG4gICAgY29uc3QgYmFzZSA9IChNYXRoLmxvZyhsZW5ndGgpIC8gbG9nMik7XHJcbiAgICBjb25zdCBmbG9vciA9IE1hdGguZmxvb3IoYmFzZSk7XHJcbiAgICBjb25zdCByb3VuZCA9IE1hdGgucm91bmQoYmFzZSk7XHJcbiAgICByZXR1cm4gKChmbG9vciA9PT0gcm91bmQpID8gZmxvb3IgOiByb3VuZCk7XHJcbn1cclxuZnVuY3Rpb24gY2xlYXJQcm9wcyhvYmplY3QsIHByb3BzQXJyYXkpIHtcclxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wc0FycmF5KSB7XHJcbiAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wXTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBhcnJheUJ1ZmZlclRvU3RyaW5nLCBidWZmZXJUb0hleENvZGVzLCBjaGVja0J1ZmZlclBhcmFtcywgY2xlYXJQcm9wcywgZnJvbUJhc2U2NCwgZ2V0UGFyYW1ldGVyc1ZhbHVlLCBnZXRVVENEYXRlLCBpc0VxdWFsQnVmZmVyLCBuZWFyZXN0UG93ZXJPZjIsIHBhZE51bWJlciwgc3RyaW5nVG9BcnJheUJ1ZmZlciwgdG9CYXNlNjQsIHV0aWxDb25jYXRCdWYsIHV0aWxDb25jYXRWaWV3LCB1dGlsRGVjb2RlVEMsIHV0aWxFbmNvZGVUQywgdXRpbEZyb21CYXNlLCB1dGlsVG9CYXNlIH07XG4iLCAiLyohXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEdNTyBHbG9iYWxTaWduXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMiwgUGVjdWxpYXIgVmVudHVyZXNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBcbiAqIEF1dGhvciAyMDE0LTIwMTksIFl1cnkgU3Ryb3poZXZza3lcbiAqIFxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqIFxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiBcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vclxuICogICBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogXG4gKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqIFxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICogXG4gKi9cblxuaW1wb3J0ICogYXMgcHZ0c3V0aWxzIGZyb20gJ3B2dHN1dGlscyc7XG5pbXBvcnQgKiBhcyBwdnV0aWxzIGZyb20gJ3B2dXRpbHMnO1xuXG5mdW5jdGlvbiBhc3NlcnRCaWdJbnQoKSB7XHJcbiAgICBpZiAodHlwZW9mIEJpZ0ludCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJpZ0ludCBpcyBub3QgZGVmaW5lZC4gWW91ciBlbnZpcm9ubWVudCBkb2Vzbid0IGltcGxlbWVudCBCaWdJbnQuXCIpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNvbmNhdChidWZmZXJzKSB7XHJcbiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMDtcclxuICAgIGxldCBwcmV2TGVuZ3RoID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGJ1ZmZlcnNbaV07XHJcbiAgICAgICAgb3V0cHV0TGVuZ3RoICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KG91dHB1dExlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBidWZmZXIgPSBidWZmZXJzW2ldO1xyXG4gICAgICAgIHJldFZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlciksIHByZXZMZW5ndGgpO1xyXG4gICAgICAgIHByZXZMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbn1cclxuZnVuY3Rpb24gY2hlY2tCdWZmZXJQYXJhbXMoYmFzZUJsb2NrLCBpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICBpZiAoIShpbnB1dEJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJXcm9uZyBwYXJhbWV0ZXI6IGlucHV0QnVmZmVyIG11c3QgYmUgJ1VpbnQ4QXJyYXknXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpbnB1dEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJXcm9uZyBwYXJhbWV0ZXI6IGlucHV0QnVmZmVyIGhhcyB6ZXJvIGxlbmd0aFwiO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dE9mZnNldCA8IDApIHtcclxuICAgICAgICBiYXNlQmxvY2suZXJyb3IgPSBcIldyb25nIHBhcmFtZXRlcjogaW5wdXRPZmZzZXQgbGVzcyB0aGFuIHplcm9cIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRMZW5ndGggPCAwKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJXcm9uZyBwYXJhbWV0ZXI6IGlucHV0TGVuZ3RoIGxlc3MgdGhhbiB6ZXJvXCI7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKChpbnB1dEJ1ZmZlci5ieXRlTGVuZ3RoIC0gaW5wdXRPZmZzZXQgLSBpbnB1dExlbmd0aCkgPCAwKSB7XHJcbiAgICAgICAgYmFzZUJsb2NrLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZCAoaW5jb25zaXN0ZW50IG9mZnNldCBhbmQgbGVuZ3RoIHZhbHVlcylcIjtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxuXG5jbGFzcyBWaWV3V3JpdGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcclxuICAgIH1cclxuICAgIHdyaXRlKGJ1Zikge1xyXG4gICAgICAgIHRoaXMuaXRlbXMucHVzaChidWYpO1xyXG4gICAgfVxyXG4gICAgZmluYWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmNhdCh0aGlzLml0ZW1zKTtcclxuICAgIH1cclxufVxuXG5jb25zdCBwb3dlcnMyID0gW25ldyBVaW50OEFycmF5KFsxXSldO1xyXG5jb25zdCBkaWdpdHNTdHJpbmcgPSBcIjAxMjM0NTY3ODlcIjtcclxuY29uc3QgTkFNRSA9IFwibmFtZVwiO1xyXG5jb25zdCBWQUxVRV9IRVhfVklFVyA9IFwidmFsdWVIZXhWaWV3XCI7XHJcbmNvbnN0IElTX0hFWF9PTkxZID0gXCJpc0hleE9ubHlcIjtcclxuY29uc3QgSURfQkxPQ0sgPSBcImlkQmxvY2tcIjtcclxuY29uc3QgVEFHX0NMQVNTID0gXCJ0YWdDbGFzc1wiO1xyXG5jb25zdCBUQUdfTlVNQkVSID0gXCJ0YWdOdW1iZXJcIjtcclxuY29uc3QgSVNfQ09OU1RSVUNURUQgPSBcImlzQ29uc3RydWN0ZWRcIjtcclxuY29uc3QgRlJPTV9CRVIgPSBcImZyb21CRVJcIjtcclxuY29uc3QgVE9fQkVSID0gXCJ0b0JFUlwiO1xyXG5jb25zdCBMT0NBTCA9IFwibG9jYWxcIjtcclxuY29uc3QgRU1QVFlfU1RSSU5HID0gXCJcIjtcclxuY29uc3QgRU1QVFlfQlVGRkVSID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG5jb25zdCBFTVBUWV9WSUVXID0gbmV3IFVpbnQ4QXJyYXkoMCk7XHJcbmNvbnN0IEVORF9PRl9DT05URU5UX05BTUUgPSBcIkVuZE9mQ29udGVudFwiO1xyXG5jb25zdCBPQ1RFVF9TVFJJTkdfTkFNRSA9IFwiT0NURVQgU1RSSU5HXCI7XHJcbmNvbnN0IEJJVF9TVFJJTkdfTkFNRSA9IFwiQklUIFNUUklOR1wiO1xuXG5mdW5jdGlvbiBIZXhCbG9jayhCYXNlQ2xhc3MpIHtcclxuICAgIHZhciBfYTtcclxuICAgIHJldHVybiBfYSA9IGNsYXNzIFNvbWUgZXh0ZW5kcyBCYXNlQ2xhc3Mge1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3NbMF0gfHwge307XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IChfYSA9IHBhcmFtcy5pc0hleE9ubHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBwYXJhbXMudmFsdWVIZXggPyBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShwYXJhbXMudmFsdWVIZXgpIDogRU1QVFlfVklFVztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBnZXQgdmFsdWVIZXgoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUhleFZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2V0IHZhbHVlSGV4KHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBpbnB1dEJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbmV3IFVpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpIDogaW5wdXRCdWZmZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIHZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRMZW5ndGggPSBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSB2aWV3LnN1YmFycmF5KGlucHV0T2Zmc2V0LCBlbmRMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlSGV4Vmlldy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJaZXJvIGJ1ZmZlciBsZW5ndGhcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IGlucHV0TGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZExlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0b0JFUihzaXplT25seSA9IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiRmxhZyAnaXNIZXhPbmx5JyBpcyBub3Qgc2V0LCBhYm9ydFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoID09PSB0aGlzLnZhbHVlSGV4Vmlldy5idWZmZXIuYnl0ZUxlbmd0aClcclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMudmFsdWVIZXhWaWV3LmJ1ZmZlclxyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy52YWx1ZUhleFZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdG9KU09OKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgICAgICAgICBpc0hleE9ubHk6IHRoaXMuaXNIZXhPbmx5LFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlSGV4OiBwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnZhbHVlSGV4VmlldyksXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBfYS5OQU1FID0gXCJoZXhCbG9ja1wiLFxyXG4gICAgICAgIF9hO1xyXG59XG5cbmNsYXNzIExvY2FsQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgYmxvY2tMZW5ndGggPSAwLCBlcnJvciA9IEVNUFRZX1NUUklORywgd2FybmluZ3MgPSBbXSwgdmFsdWVCZWZvcmVEZWNvZGUgPSBFTVBUWV9WSUVXLCB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xyXG4gICAgICAgIHRoaXMud2FybmluZ3MgPSB3YXJuaW5ncztcclxuICAgICAgICB0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHZhbHVlQmVmb3JlRGVjb2RlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBibG9ja05hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTkFNRTtcclxuICAgIH1cclxuICAgIGdldCB2YWx1ZUJlZm9yZURlY29kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUJlZm9yZURlY29kZVZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzZXQgdmFsdWVCZWZvcmVEZWNvZGUodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldyA9IG5ldyBVaW50OEFycmF5KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBibG9ja05hbWU6IHRoaXMuY29uc3RydWN0b3IuTkFNRSxcclxuICAgICAgICAgICAgYmxvY2tMZW5ndGg6IHRoaXMuYmxvY2tMZW5ndGgsXHJcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLmVycm9yLFxyXG4gICAgICAgICAgICB3YXJuaW5nczogdGhpcy53YXJuaW5ncyxcclxuICAgICAgICAgICAgdmFsdWVCZWZvcmVEZWNvZGU6IHB2dHN1dGlscy5Db252ZXJ0LlRvSGV4KHRoaXMudmFsdWVCZWZvcmVEZWNvZGVWaWV3KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsQmFzZUJsb2NrLk5BTUUgPSBcImJhc2VCbG9ja1wiO1xuXG5jbGFzcyBWYWx1ZUJsb2NrIGV4dGVuZHMgTG9jYWxCYXNlQmxvY2sge1xyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiVXNlciBuZWVkIHRvIG1ha2UgYSBzcGVjaWZpYyBmdW5jdGlvbiBpbiBhIGNsYXNzIHdoaWNoIGV4dGVuZHMgJ1ZhbHVlQmxvY2snXCIpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihcIlVzZXIgbmVlZCB0byBtYWtlIGEgc3BlY2lmaWMgZnVuY3Rpb24gaW4gYSBjbGFzcyB3aGljaCBleHRlbmRzICdWYWx1ZUJsb2NrJ1wiKTtcclxuICAgIH1cclxufVxyXG5WYWx1ZUJsb2NrLk5BTUUgPSBcInZhbHVlQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxJZGVudGlmaWNhdGlvbkJsb2NrIGV4dGVuZHMgSGV4QmxvY2soTG9jYWxCYXNlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgaWRCbG9jayA9IHt9LCB9ID0ge30pIHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBpZiAoaWRCbG9jaykge1xyXG4gICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IChfYSA9IGlkQmxvY2suaXNIZXhPbmx5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBpZEJsb2NrLnZhbHVlSGV4ID8gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaWRCbG9jay52YWx1ZUhleCkgOiBFTVBUWV9WSUVXO1xyXG4gICAgICAgICAgICB0aGlzLnRhZ0NsYXNzID0gKF9iID0gaWRCbG9jay50YWdDbGFzcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogLTE7XHJcbiAgICAgICAgICAgIHRoaXMudGFnTnVtYmVyID0gKF9jID0gaWRCbG9jay50YWdOdW1iZXIpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IC0xO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSAoX2QgPSBpZEJsb2NrLmlzQ29uc3RydWN0ZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50YWdDbGFzcyA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLnRhZ051bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGZpcnN0T2N0ZXQgPSAwO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy50YWdDbGFzcykge1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBmaXJzdE9jdGV0IHw9IDB4MDA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgZmlyc3RPY3RldCB8PSAweDQwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICAgIGZpcnN0T2N0ZXQgfD0gMHg4MDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICBmaXJzdE9jdGV0IHw9IDB4QzA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIlVua25vd24gdGFnIGNsYXNzXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc0NvbnN0cnVjdGVkKVxyXG4gICAgICAgICAgICBmaXJzdE9jdGV0IHw9IDB4MjA7XHJcbiAgICAgICAgaWYgKHRoaXMudGFnTnVtYmVyIDwgMzEgJiYgIXRoaXMuaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheSgxKTtcclxuICAgICAgICAgICAgaWYgKCFzaXplT25seSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG51bWJlciA9IHRoaXMudGFnTnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyICY9IDB4MUY7XHJcbiAgICAgICAgICAgICAgICBmaXJzdE9jdGV0IHw9IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbMF0gPSBmaXJzdE9jdGV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXRWaWV3LmJ1ZmZlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSGV4T25seSkge1xyXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkQnVmID0gcHZ1dGlscy51dGlsVG9CYXNlKHRoaXMudGFnTnVtYmVyLCA3KTtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmKTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVuY29kZWRCdWYuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHNpemUgKyAxKTtcclxuICAgICAgICAgICAgcmV0Vmlld1swXSA9IChmaXJzdE9jdGV0IHwgMHgxRik7XHJcbiAgICAgICAgICAgIGlmICghc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKHNpemUgLSAxKTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldFZpZXdbaSArIDFdID0gZW5jb2RlZFZpZXdbaV0gfCAweDgwO1xyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tzaXplXSA9IGVuY29kZWRWaWV3W3NpemUgLSAxXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoICsgMSk7XHJcbiAgICAgICAgcmV0Vmlld1swXSA9IChmaXJzdE9jdGV0IHwgMHgxRik7XHJcbiAgICAgICAgaWYgKCFzaXplT25seSkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJWaWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGN1clZpZXcubGVuZ3RoIC0gMSk7IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaSArIDFdID0gY3VyVmlld1tpXSB8IDB4ODA7XHJcbiAgICAgICAgICAgIHJldFZpZXdbdGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aF0gPSBjdXJWaWV3W2N1clZpZXcubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRWaWV3LmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0VmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIGlucHV0VmlldywgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGludEJ1ZmZlciA9IGlucHV0Vmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgaWYgKGludEJ1ZmZlci5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiWmVybyBidWZmZXIgbGVuZ3RoXCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGFnQ2xhc3NNYXNrID0gaW50QnVmZmVyWzBdICYgMHhDMDtcclxuICAgICAgICBzd2l0Y2ggKHRhZ0NsYXNzTWFzaykge1xyXG4gICAgICAgICAgICBjYXNlIDB4MDA6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ0NsYXNzID0gKDEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMHg0MDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFnQ2xhc3MgPSAoMik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAweDgwOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWdDbGFzcyA9ICgzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDB4QzA6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ0NsYXNzID0gKDQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJVbmtub3duIHRhZyBjbGFzc1wiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSAoaW50QnVmZmVyWzBdICYgMHgyMCkgPT09IDB4MjA7XHJcbiAgICAgICAgdGhpcy5pc0hleE9ubHkgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCB0YWdOdW1iZXJNYXNrID0gaW50QnVmZmVyWzBdICYgMHgxRjtcclxuICAgICAgICBpZiAodGFnTnVtYmVyTWFzayAhPT0gMHgxRikge1xyXG4gICAgICAgICAgICB0aGlzLnRhZ051bWJlciA9ICh0YWdOdW1iZXJNYXNrKTtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY291bnQgPSAxO1xyXG4gICAgICAgICAgICBsZXQgaW50VGFnTnVtYmVyQnVmZmVyID0gdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheSgyNTUpO1xyXG4gICAgICAgICAgICBsZXQgdGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoID0gMjU1O1xyXG4gICAgICAgICAgICB3aGlsZSAoaW50QnVmZmVyW2NvdW50XSAmIDB4ODApIHtcclxuICAgICAgICAgICAgICAgIGludFRhZ051bWJlckJ1ZmZlcltjb3VudCAtIDFdID0gaW50QnVmZmVyW2NvdW50XSAmIDB4N0Y7XHJcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID49IGludEJ1ZmZlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gdGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoICs9IDI1NTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wQnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KHRhZ051bWJlckJ1ZmZlck1heExlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRUYWdOdW1iZXJCdWZmZXIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJWaWV3W2ldID0gaW50VGFnTnVtYmVyQnVmZmVyW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGludFRhZ051bWJlckJ1ZmZlciA9IHRoaXMudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGFnTnVtYmVyQnVmZmVyTWF4TGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gKGNvdW50ICsgMSk7XHJcbiAgICAgICAgICAgIGludFRhZ051bWJlckJ1ZmZlcltjb3VudCAtIDFdID0gaW50QnVmZmVyW2NvdW50XSAmIDB4N0Y7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBCdWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspXHJcbiAgICAgICAgICAgICAgICB0ZW1wQnVmZmVyVmlld1tpXSA9IGludFRhZ051bWJlckJ1ZmZlcltpXTtcclxuICAgICAgICAgICAgaW50VGFnTnVtYmVyQnVmZmVyID0gdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheShjb3VudCk7XHJcbiAgICAgICAgICAgIGludFRhZ051bWJlckJ1ZmZlci5zZXQodGVtcEJ1ZmZlclZpZXcpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja0xlbmd0aCA8PSA5KVxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWdOdW1iZXIgPSBwdnV0aWxzLnV0aWxGcm9tQmFzZShpbnRUYWdOdW1iZXJCdWZmZXIsIDcpO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIlRhZyB0b28gbG9uZywgcmVwcmVzZW50ZWQgYXMgaGV4LWNvZGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoKHRoaXMudGFnQ2xhc3MgPT09IDEpKSAmJlxyXG4gICAgICAgICAgICAodGhpcy5pc0NvbnN0cnVjdGVkKSkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudGFnTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDk6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcclxuICAgICAgICAgICAgICAgIGNhc2UgMjM6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI0OlxyXG4gICAgICAgICAgICAgICAgY2FzZSAzMTpcclxuICAgICAgICAgICAgICAgIGNhc2UgMzI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDMzOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAzNDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJDb25zdHJ1Y3RlZCBlbmNvZGluZyB1c2VkIGZvciBwcmltaXRpdmUgdHlwZVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgdGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHRhZ0NsYXNzOiB0aGlzLnRhZ0NsYXNzLFxyXG4gICAgICAgICAgICB0YWdOdW1iZXI6IHRoaXMudGFnTnVtYmVyLFxyXG4gICAgICAgICAgICBpc0NvbnN0cnVjdGVkOiB0aGlzLmlzQ29uc3RydWN0ZWQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5Mb2NhbElkZW50aWZpY2F0aW9uQmxvY2suTkFNRSA9IFwiaWRlbnRpZmljYXRpb25CbG9ja1wiO1xuXG5jbGFzcyBMb2NhbExlbmd0aEJsb2NrIGV4dGVuZHMgTG9jYWxCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyBsZW5CbG9jayA9IHt9LCB9ID0ge30pIHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuaXNJbmRlZmluaXRlRm9ybSA9IChfYSA9IGxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9uZ0Zvcm1Vc2VkID0gKF9iID0gbGVuQmxvY2subG9uZ0Zvcm1Vc2VkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IChfYyA9IGxlbkJsb2NrLmxlbmd0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICAgICAgaWYgKCFjaGVja0J1ZmZlclBhcmFtcyh0aGlzLCB2aWV3LCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW50QnVmZmVyID0gdmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgaWYgKGludEJ1ZmZlci5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiWmVybyBidWZmZXIgbGVuZ3RoXCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGludEJ1ZmZlclswXSA9PT0gMHhGRikge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJMZW5ndGggYmxvY2sgMHhGRiBpcyByZXNlcnZlZCBieSBzdGFuZGFyZFwiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNJbmRlZmluaXRlRm9ybSA9IGludEJ1ZmZlclswXSA9PT0gMHg4MDtcclxuICAgICAgICBpZiAodGhpcy5pc0luZGVmaW5pdGVGb3JtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSAxO1xyXG4gICAgICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgdGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9uZ0Zvcm1Vc2VkID0gISEoaW50QnVmZmVyWzBdICYgMHg4MCk7XHJcbiAgICAgICAgaWYgKHRoaXMubG9uZ0Zvcm1Vc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IChpbnRCdWZmZXJbMF0pO1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gMTtcclxuICAgICAgICAgICAgcmV0dXJuIChpbnB1dE9mZnNldCArIHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb3VudCA9IGludEJ1ZmZlclswXSAmIDB4N0Y7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gOCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJUb28gYmlnIGludGVnZXJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGNvdW50ICsgMSkgPiBpbnRCdWZmZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVuZCBvZiBpbnB1dCByZWFjaGVkIGJlZm9yZSBtZXNzYWdlIHdhcyBmdWxseSBkZWNvZGVkXCI7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuT2Zmc2V0ID0gaW5wdXRPZmZzZXQgKyAxO1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aEJ1ZmZlclZpZXcgPSB2aWV3LnN1YmFycmF5KGxlbk9mZnNldCwgbGVuT2Zmc2V0ICsgY291bnQpO1xyXG4gICAgICAgIGlmIChsZW5ndGhCdWZmZXJWaWV3W2NvdW50IC0gMV0gPT09IDB4MDApXHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIk5lZWRsZXNzbHkgbG9uZyBlbmNvZGVkIGxlbmd0aFwiKTtcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IHB2dXRpbHMudXRpbEZyb21CYXNlKGxlbmd0aEJ1ZmZlclZpZXcsIDgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxvbmdGb3JtVXNlZCAmJiAodGhpcy5sZW5ndGggPD0gMTI3KSlcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiVW5uZWNlc3NhcnkgdXNhZ2Ugb2YgbG9uZyBsZW5ndGggZm9ybVwiKTtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gY291bnQgKyAxO1xyXG4gICAgICAgIHJldHVybiAoaW5wdXRPZmZzZXQgKyB0aGlzLmJsb2NrTGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgcmV0QnVmO1xyXG4gICAgICAgIGxldCByZXRWaWV3O1xyXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDEyNylcclxuICAgICAgICAgICAgdGhpcy5sb25nRm9ybVVzZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5kZWZpbml0ZUZvcm0pIHtcclxuICAgICAgICAgICAgcmV0QnVmID0gbmV3IEFycmF5QnVmZmVyKDEpO1xyXG4gICAgICAgICAgICBpZiAoc2l6ZU9ubHkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkocmV0QnVmKTtcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbMF0gPSAweDgwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxvbmdGb3JtVXNlZCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkQnVmID0gcHZ1dGlscy51dGlsVG9CYXNlKHRoaXMubGVuZ3RoLCA4KTtcclxuICAgICAgICAgICAgaWYgKGVuY29kZWRCdWYuYnl0ZUxlbmd0aCA+IDEyNykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiVG9vIGJpZyBsZW5ndGhcIjtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoRU1QVFlfQlVGRkVSKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXRCdWYgPSBuZXcgQXJyYXlCdWZmZXIoZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChzaXplT25seSlcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZEJ1Zik7XHJcbiAgICAgICAgICAgIHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICByZXRWaWV3WzBdID0gZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoIHwgMHg4MDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNvZGVkQnVmLmJ5dGVMZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaSArIDFdID0gZW5jb2RlZFZpZXdbaV07XHJcbiAgICAgICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcigxKTtcclxuICAgICAgICBpZiAoc2l6ZU9ubHkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICByZXRWaWV3WzBdID0gdGhpcy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIGlzSW5kZWZpbml0ZUZvcm06IHRoaXMuaXNJbmRlZmluaXRlRm9ybSxcclxuICAgICAgICAgICAgbG9uZ0Zvcm1Vc2VkOiB0aGlzLmxvbmdGb3JtVXNlZCxcclxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsTGVuZ3RoQmxvY2suTkFNRSA9IFwibGVuZ3RoQmxvY2tcIjtcblxuY29uc3QgdHlwZVN0b3JlID0ge307XG5cbmNsYXNzIEJhc2VCbG9jayBleHRlbmRzIExvY2FsQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgbmFtZSA9IEVNUFRZX1NUUklORywgb3B0aW9uYWwgPSBmYWxzZSwgcHJpbWl0aXZlU2NoZW1hLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSwgdmFsdWVCbG9ja1R5cGUpIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDtcclxuICAgICAgICBpZiAocHJpbWl0aXZlU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJpbWl0aXZlU2NoZW1hID0gcHJpbWl0aXZlU2NoZW1hO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlkQmxvY2sgPSBuZXcgTG9jYWxJZGVudGlmaWNhdGlvbkJsb2NrKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMubGVuQmxvY2sgPSBuZXcgTG9jYWxMZW5ndGhCbG9jayhwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sgPSB2YWx1ZUJsb2NrVHlwZSA/IG5ldyB2YWx1ZUJsb2NrVHlwZShwYXJhbWV0ZXJzKSA6IG5ldyBWYWx1ZUJsb2NrKHBhcmFtZXRlcnMpO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0T2Zmc2V0ID0gdGhpcy52YWx1ZUJsb2NrLmZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCAodGhpcy5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtKSA/IGlucHV0TGVuZ3RoIDogdGhpcy5sZW5CbG9jay5sZW5ndGgpO1xyXG4gICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSB0aGlzLnZhbHVlQmxvY2suZXJyb3I7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5pZEJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmlkQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxlbkJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmxlbkJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgIGlmICghdGhpcy52YWx1ZUJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLnZhbHVlQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5LCB3cml0ZXIpIHtcclxuICAgICAgICBjb25zdCBfd3JpdGVyID0gd3JpdGVyIHx8IG5ldyBWaWV3V3JpdGVyKCk7XHJcbiAgICAgICAgaWYgKCF3cml0ZXIpIHtcclxuICAgICAgICAgICAgcHJlcGFyZUluZGVmaW5pdGVGb3JtKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZEJsb2NrQnVmID0gdGhpcy5pZEJsb2NrLnRvQkVSKHNpemVPbmx5KTtcclxuICAgICAgICBfd3JpdGVyLndyaXRlKGlkQmxvY2tCdWYpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pIHtcclxuICAgICAgICAgICAgX3dyaXRlci53cml0ZShuZXcgVWludDhBcnJheShbMHg4MF0pLmJ1ZmZlcik7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay50b0JFUihzaXplT25seSwgX3dyaXRlcik7XHJcbiAgICAgICAgICAgIF93cml0ZXIud3JpdGUobmV3IEFycmF5QnVmZmVyKDIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQmxvY2tCdWYgPSB0aGlzLnZhbHVlQmxvY2sudG9CRVIoc2l6ZU9ubHkpO1xyXG4gICAgICAgICAgICB0aGlzLmxlbkJsb2NrLmxlbmd0aCA9IHZhbHVlQmxvY2tCdWYuYnl0ZUxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgbGVuQmxvY2tCdWYgPSB0aGlzLmxlbkJsb2NrLnRvQkVSKHNpemVPbmx5KTtcclxuICAgICAgICAgICAgX3dyaXRlci53cml0ZShsZW5CbG9ja0J1Zik7XHJcbiAgICAgICAgICAgIF93cml0ZXIud3JpdGUodmFsdWVCbG9ja0J1Zik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghd3JpdGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBfd3JpdGVyLmZpbmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgaWRCbG9jazogdGhpcy5pZEJsb2NrLnRvSlNPTigpLFxyXG4gICAgICAgICAgICBsZW5CbG9jazogdGhpcy5sZW5CbG9jay50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWVCbG9jazogdGhpcy52YWx1ZUJsb2NrLnRvSlNPTigpLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMucHJpbWl0aXZlU2NoZW1hKVxyXG4gICAgICAgICAgICBvYmplY3QucHJpbWl0aXZlU2NoZW1hID0gdGhpcy5wcmltaXRpdmVTY2hlbWEudG9KU09OKCk7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKGVuY29kaW5nID0gXCJhc2NpaVwiKSB7XHJcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSBcImFzY2lpXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub25Bc2NpaUVuY29kaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnRvQkVSKCkpO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHtwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnZhbHVlQmxvY2sudmFsdWVCZWZvcmVEZWNvZGVWaWV3KX1gO1xyXG4gICAgfVxyXG4gICAgaXNFcXVhbChvdGhlcikge1xyXG4gICAgICAgIGlmICh0aGlzID09PSBvdGhlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRoaXNSYXcgPSB0aGlzLnRvQkVSKCk7XHJcbiAgICAgICAgY29uc3Qgb3RoZXJSYXcgPSBvdGhlci50b0JFUigpO1xyXG4gICAgICAgIHJldHVybiBwdnV0aWxzLmlzRXF1YWxCdWZmZXIodGhpc1Jhdywgb3RoZXJSYXcpO1xyXG4gICAgfVxyXG59XHJcbkJhc2VCbG9jay5OQU1FID0gXCJCYXNlQmxvY2tcIjtcclxuZnVuY3Rpb24gcHJlcGFyZUluZGVmaW5pdGVGb3JtKGJhc2VCbG9jaykge1xyXG4gICAgaWYgKGJhc2VCbG9jayBpbnN0YW5jZW9mIHR5cGVTdG9yZS5Db25zdHJ1Y3RlZCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYmFzZUJsb2NrLnZhbHVlQmxvY2sudmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHByZXBhcmVJbmRlZmluaXRlRm9ybSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGJhc2VCbG9jay5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAhIWJhc2VCbG9jay5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtO1xyXG59XG5cbmNsYXNzIEJhc2VTdHJpbmdCbG9jayBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlID0gRU1QVFlfU1RSSU5HLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSwgc3RyaW5nVmFsdWVCbG9ja1R5cGUpIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBzdHJpbmdWYWx1ZUJsb2NrVHlwZSk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbVN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVCbG9jay52YWx1ZTtcclxuICAgIH1cclxuICAgIHNldFZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHRPZmZzZXQgPSB0aGlzLnZhbHVlQmxvY2suZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsICh0aGlzLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pID8gaW5wdXRMZW5ndGggOiB0aGlzLmxlbkJsb2NrLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMudmFsdWVCbG9jay5lcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcm9tQnVmZmVyKHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcpO1xyXG4gICAgICAgIGlmICghdGhpcy5pZEJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmlkQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxlbkJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmxlbkJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgIGlmICghdGhpcy52YWx1ZUJsb2NrLmVycm9yLmxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLnZhbHVlQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIG9uQXNjaWlFbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfSA6ICcke3RoaXMudmFsdWVCbG9jay52YWx1ZX0nYDtcclxuICAgIH1cclxufVxyXG5CYXNlU3RyaW5nQmxvY2suTkFNRSA9IFwiQmFzZVN0cmluZ0Jsb2NrXCI7XG5cbmNsYXNzIExvY2FsUHJpbWl0aXZlVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKFZhbHVlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgaXNIZXhPbmx5ID0gdHJ1ZSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlzSGV4T25seSA9IGlzSGV4T25seTtcclxuICAgIH1cclxufVxyXG5Mb2NhbFByaW1pdGl2ZVZhbHVlQmxvY2suTkFNRSA9IFwiUHJpbWl0aXZlVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkdztcclxuY2xhc3MgUHJpbWl0aXZlIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIExvY2FsUHJpbWl0aXZlVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLmlzQ29uc3RydWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG5fYSR3ID0gUHJpbWl0aXZlO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlByaW1pdGl2ZSA9IF9hJHc7XHJcbn0pKCk7XHJcblByaW1pdGl2ZS5OQU1FID0gXCJQUklNSVRJVkVcIjtcblxuZnVuY3Rpb24gbG9jYWxDaGFuZ2VUeXBlKGlucHV0T2JqZWN0LCBuZXdUeXBlKSB7XHJcbiAgICBpZiAoaW5wdXRPYmplY3QgaW5zdGFuY2VvZiBuZXdUeXBlKSB7XHJcbiAgICAgICAgcmV0dXJuIGlucHV0T2JqZWN0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3IG5ld1R5cGUoKTtcclxuICAgIG5ld09iamVjdC5pZEJsb2NrID0gaW5wdXRPYmplY3QuaWRCbG9jaztcclxuICAgIG5ld09iamVjdC5sZW5CbG9jayA9IGlucHV0T2JqZWN0LmxlbkJsb2NrO1xyXG4gICAgbmV3T2JqZWN0Lndhcm5pbmdzID0gaW5wdXRPYmplY3Qud2FybmluZ3M7XHJcbiAgICBuZXdPYmplY3QudmFsdWVCZWZvcmVEZWNvZGVWaWV3ID0gaW5wdXRPYmplY3QudmFsdWVCZWZvcmVEZWNvZGVWaWV3O1xyXG4gICAgcmV0dXJuIG5ld09iamVjdDtcclxufVxyXG5mdW5jdGlvbiBsb2NhbEZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0ID0gMCwgaW5wdXRMZW5ndGggPSBpbnB1dEJ1ZmZlci5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGluY29taW5nT2Zmc2V0ID0gaW5wdXRPZmZzZXQ7XHJcbiAgICBsZXQgcmV0dXJuT2JqZWN0ID0gbmV3IEJhc2VCbG9jayh7fSwgVmFsdWVCbG9jayk7XHJcbiAgICBjb25zdCBiYXNlQmxvY2sgPSBuZXcgTG9jYWxCYXNlQmxvY2soKTtcclxuICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXMoYmFzZUJsb2NrLCBpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC5lcnJvciA9IGJhc2VCbG9jay5lcnJvcjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBvZmZzZXQ6IC0xLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbnRCdWZmZXIgPSBpbnB1dEJ1ZmZlci5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICBpZiAoIWludEJ1ZmZlci5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSBcIlplcm8gYnVmZmVyIGxlbmd0aFwiO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGxldCByZXN1bHRPZmZzZXQgPSByZXR1cm5PYmplY3QuaWRCbG9jay5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgaWYgKHJldHVybk9iamVjdC5pZEJsb2NrLndhcm5pbmdzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC53YXJuaW5ncy5jb25jYXQocmV0dXJuT2JqZWN0LmlkQmxvY2sud2FybmluZ3MpO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSByZXR1cm5PYmplY3QuaWRCbG9jay5lcnJvcjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBvZmZzZXQ6IC0xLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpbnB1dE9mZnNldCA9IHJlc3VsdE9mZnNldDtcclxuICAgIGlucHV0TGVuZ3RoIC09IHJldHVybk9iamVjdC5pZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgcmVzdWx0T2Zmc2V0ID0gcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCk7XHJcbiAgICBpZiAocmV0dXJuT2JqZWN0LmxlbkJsb2NrLndhcm5pbmdzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybk9iamVjdC53YXJuaW5ncy5jb25jYXQocmV0dXJuT2JqZWN0LmxlbkJsb2NrLndhcm5pbmdzKTtcclxuICAgIH1cclxuICAgIGlmIChyZXN1bHRPZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmVycm9yO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlucHV0T2Zmc2V0ID0gcmVzdWx0T2Zmc2V0O1xyXG4gICAgaW5wdXRMZW5ndGggLT0gcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgaWYgKCFyZXR1cm5PYmplY3QuaWRCbG9jay5pc0NvbnN0cnVjdGVkICYmXHJcbiAgICAgICAgcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pIHtcclxuICAgICAgICByZXR1cm5PYmplY3QuZXJyb3IgPSBcIkluZGVmaW5pdGUgbGVuZ3RoIGZvcm0gdXNlZCBmb3IgcHJpbWl0aXZlIGVuY29kaW5nIGZvcm1cIjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBvZmZzZXQ6IC0xLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3QVNOMVR5cGUgPSBCYXNlQmxvY2s7XHJcbiAgICBzd2l0Y2ggKHJldHVybk9iamVjdC5pZEJsb2NrLnRhZ0NsYXNzKSB7XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICBpZiAoKHJldHVybk9iamVjdC5pZEJsb2NrLnRhZ051bWJlciA+PSAzNykgJiZcclxuICAgICAgICAgICAgICAgIChyZXR1cm5PYmplY3QuaWRCbG9jay5pc0hleE9ubHkgPT09IGZhbHNlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gXCJVTklWRVJTQUwgMzcgYW5kIHVwcGVyIHRhZ3MgYXJlIHJlc2VydmVkIGJ5IEFTTi4xIHN0YW5kYXJkXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByZXR1cm5PYmplY3RcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3dpdGNoIChyZXR1cm5PYmplY3QuaWRCbG9jay50YWdOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJldHVybk9iamVjdC5pZEJsb2NrLmlzQ29uc3RydWN0ZWQpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXR1cm5PYmplY3QubGVuQmxvY2subGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gXCJUeXBlIFtVTklWRVJTQUwgMF0gaXMgcmVzZXJ2ZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJldHVybk9iamVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5FbmRPZkNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuQm9vbGVhbjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5JbnRlZ2VyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkJpdFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5PY3RldFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5OdWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLk9iamVjdElkZW50aWZpZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkVudW1lcmF0ZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlV0ZjhTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlJlbGF0aXZlT2JqZWN0SWRlbnRpZmllcjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuVElNRTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTU6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0LmVycm9yID0gXCJbVU5JVkVSU0FMIDE1XSBpcyByZXNlcnZlZCBieSBBU04uMSBzdGFuZGFyZFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogLTEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmV0dXJuT2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTY6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuU2VxdWVuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlNldDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTg6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuTnVtZXJpY1N0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMTk6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuUHJpbnRhYmxlU3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5UZWxldGV4U3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5WaWRlb3RleFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjI6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuSUE1U3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyMzpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5VVENUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyNDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5HZW5lcmFsaXplZFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI1OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkdyYXBoaWNTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI2OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlZpc2libGVTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI3OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkdlbmVyYWxTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI4OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlVuaXZlcnNhbFN0cmluZztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjk6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuQ2hhcmFjdGVyU3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzMDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdBU04xVHlwZSA9IHR5cGVTdG9yZS5CbXBTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDMxOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkRBVEU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDMyOlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLlRpbWVPZkRheTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMzM6XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3QVNOMVR5cGUgPSB0eXBlU3RvcmUuRGF0ZVRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM0OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0FTTjFUeXBlID0gdHlwZVN0b3JlLkR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld09iamVjdCA9IHJldHVybk9iamVjdC5pZEJsb2NrLmlzQ29uc3RydWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgdHlwZVN0b3JlLkNvbnN0cnVjdGVkKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgdHlwZVN0b3JlLlByaW1pdGl2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld09iamVjdC5pZEJsb2NrID0gcmV0dXJuT2JqZWN0LmlkQmxvY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3T2JqZWN0LmxlbkJsb2NrID0gcmV0dXJuT2JqZWN0LmxlbkJsb2NrO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld09iamVjdC53YXJuaW5ncyA9IHJldHVybk9iamVjdC53YXJuaW5ncztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXdPYmplY3Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgICBuZXdBU04xVHlwZSA9IHJldHVybk9iamVjdC5pZEJsb2NrLmlzQ29uc3RydWN0ZWRcclxuICAgICAgICAgICAgICAgID8gdHlwZVN0b3JlLkNvbnN0cnVjdGVkXHJcbiAgICAgICAgICAgICAgICA6IHR5cGVTdG9yZS5QcmltaXRpdmU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuT2JqZWN0ID0gbG9jYWxDaGFuZ2VUeXBlKHJldHVybk9iamVjdCwgbmV3QVNOMVR5cGUpO1xyXG4gICAgcmVzdWx0T2Zmc2V0ID0gcmV0dXJuT2JqZWN0LmZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCByZXR1cm5PYmplY3QubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybSA/IGlucHV0TGVuZ3RoIDogcmV0dXJuT2JqZWN0LmxlbkJsb2NrLmxlbmd0aCk7XHJcbiAgICByZXR1cm5PYmplY3QudmFsdWVCZWZvcmVEZWNvZGVWaWV3ID0gaW5wdXRCdWZmZXIuc3ViYXJyYXkoaW5jb21pbmdPZmZzZXQsIGluY29taW5nT2Zmc2V0ICsgcmV0dXJuT2JqZWN0LmJsb2NrTGVuZ3RoKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgb2Zmc2V0OiByZXN1bHRPZmZzZXQsXHJcbiAgICAgICAgcmVzdWx0OiByZXR1cm5PYmplY3RcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gZnJvbUJFUihpbnB1dEJ1ZmZlcikge1xyXG4gICAgaWYgKCFpbnB1dEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEJhc2VCbG9jayh7fSwgVmFsdWVCbG9jayk7XHJcbiAgICAgICAgcmVzdWx0LmVycm9yID0gXCJJbnB1dCBidWZmZXIgaGFzIHplcm8gbGVuZ3RoXCI7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgb2Zmc2V0OiAtMSxcclxuICAgICAgICAgICAgcmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBsb2NhbEZyb21CRVIocHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpLnNsaWNlKCksIDAsIGlucHV0QnVmZmVyLmJ5dGVMZW5ndGgpO1xyXG59XG5cbmZ1bmN0aW9uIGNoZWNrTGVuKGluZGVmaW5pdGVMZW5ndGgsIGxlbmd0aCkge1xyXG4gICAgaWYgKGluZGVmaW5pdGVMZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIHJldHVybiBsZW5ndGg7XHJcbn1cclxuY2xhc3MgTG9jYWxDb25zdHJ1Y3RlZFZhbHVlQmxvY2sgZXh0ZW5kcyBWYWx1ZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUgPSBbXSwgaXNJbmRlZmluaXRlRm9ybSA9IGZhbHNlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmlzSW5kZWZpbml0ZUZvcm0gPSBpc0luZGVmaW5pdGVGb3JtO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIHZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldyA9IHZpZXcuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQmVmb3JlRGVjb2RlVmlldy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiWmVybyBidWZmZXIgbGVuZ3RoXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjdXJyZW50T2Zmc2V0ID0gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgd2hpbGUgKGNoZWNrTGVuKHRoaXMuaXNJbmRlZmluaXRlRm9ybSwgaW5wdXRMZW5ndGgpID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5PYmplY3QgPSBsb2NhbEZyb21CRVIodmlldywgY3VycmVudE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmV0dXJuT2JqZWN0Lm9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSByZXR1cm5PYmplY3QucmVzdWx0LmVycm9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5jb25jYXQocmV0dXJuT2JqZWN0LnJlc3VsdC53YXJuaW5ncyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudE9mZnNldCA9IHJldHVybk9iamVjdC5vZmZzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggKz0gcmV0dXJuT2JqZWN0LnJlc3VsdC5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgaW5wdXRMZW5ndGggLT0gcmV0dXJuT2JqZWN0LnJlc3VsdC5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHJldHVybk9iamVjdC5yZXN1bHQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0luZGVmaW5pdGVGb3JtICYmIHJldHVybk9iamVjdC5yZXN1bHQuY29uc3RydWN0b3IuTkFNRSA9PT0gRU5EX09GX0NPTlRFTlRfTkFNRSkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbmRlZmluaXRlRm9ybSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZVt0aGlzLnZhbHVlLmxlbmd0aCAtIDFdLmNvbnN0cnVjdG9yLk5BTUUgPT09IEVORF9PRl9DT05URU5UX05BTUUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUucG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJObyBFbmRPZkNvbnRlbnQgYmxvY2sgZW5jb2RlZFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY3VycmVudE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5LCB3cml0ZXIpIHtcclxuICAgICAgICBjb25zdCBfd3JpdGVyID0gd3JpdGVyIHx8IG5ldyBWaWV3V3JpdGVyKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVbaV0udG9CRVIoc2l6ZU9ubHksIF93cml0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXdyaXRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gX3dyaXRlci5maW5hbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIGlzSW5kZWZpbml0ZUZvcm06IHRoaXMuaXNJbmRlZmluaXRlRm9ybSxcclxuICAgICAgICAgICAgdmFsdWU6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC52YWx1ZS5wdXNoKHZhbHVlLnRvSlNPTigpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgIH1cclxufVxyXG5Mb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jay5OQU1FID0gXCJDb25zdHJ1Y3RlZFZhbHVlQmxvY2tcIjtcblxudmFyIF9hJHY7XHJcbmNsYXNzIENvbnN0cnVjdGVkIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2suaXNDb25zdHJ1Y3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suaXNJbmRlZmluaXRlRm9ybSA9IHRoaXMubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybTtcclxuICAgICAgICBjb25zdCByZXN1bHRPZmZzZXQgPSB0aGlzLnZhbHVlQmxvY2suZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsICh0aGlzLmxlbkJsb2NrLmlzSW5kZWZpbml0ZUZvcm0pID8gaW5wdXRMZW5ndGggOiB0aGlzLmxlbkJsb2NrLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMudmFsdWVCbG9jay5lcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmlkQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMuaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICBpZiAoIXRoaXMubGVuQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMubGVuQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMudmFsdWVCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy52YWx1ZUJsb2NrLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlLnRvU3RyaW5nKFwiYXNjaWlcIikuc3BsaXQoXCJcXG5cIikubWFwKG8gPT4gYCAgJHtvfWApLmpvaW4oXCJcXG5cIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBibG9ja05hbWUgPSB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPT09IDNcclxuICAgICAgICAgICAgPyBgWyR7dGhpcy5pZEJsb2NrLnRhZ051bWJlcn1dYFxyXG4gICAgICAgICAgICA6IHRoaXMuY29uc3RydWN0b3IuTkFNRTtcclxuICAgICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aFxyXG4gICAgICAgICAgICA/IGAke2Jsb2NrTmFtZX0gOlxcbiR7dmFsdWVzLmpvaW4oXCJcXG5cIil9YFxyXG4gICAgICAgICAgICA6IGAke2Jsb2NrTmFtZX0gOmA7XHJcbiAgICB9XHJcbn1cclxuX2EkdiA9IENvbnN0cnVjdGVkO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkNvbnN0cnVjdGVkID0gX2EkdjtcclxufSkoKTtcclxuQ29uc3RydWN0ZWQuTkFNRSA9IFwiQ09OU1RSVUNURURcIjtcblxuY2xhc3MgTG9jYWxFbmRPZkNvbnRlbnRWYWx1ZUJsb2NrIGV4dGVuZHMgVmFsdWVCbG9jayB7XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSkge1xyXG4gICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICB9XHJcbn1cclxuTG9jYWxFbmRPZkNvbnRlbnRWYWx1ZUJsb2NrLm92ZXJyaWRlID0gXCJFbmRPZkNvbnRlbnRWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSR1O1xyXG5jbGFzcyBFbmRPZkNvbnRlbnQgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxFbmRPZkNvbnRlbnRWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAwO1xyXG4gICAgfVxyXG59XHJcbl9hJHUgPSBFbmRPZkNvbnRlbnQ7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuRW5kT2ZDb250ZW50ID0gX2EkdTtcclxufSkoKTtcclxuRW5kT2ZDb250ZW50Lk5BTUUgPSBFTkRfT0ZfQ09OVEVOVF9OQU1FO1xuXG52YXIgX2EkdDtcclxuY2xhc3MgTnVsbCBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSA1O1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGVuQmxvY2subGVuZ3RoID4gMClcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiTm9uLXplcm8gbGVuZ3RoIG9mIHZhbHVlIGJsb2NrIGZvciBOdWxsIHR5cGVcIik7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlkQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMuaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICBpZiAoIXRoaXMubGVuQmxvY2suZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMubGVuQmxvY2suYmxvY2tMZW5ndGg7XHJcbiAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSBpbnB1dExlbmd0aDtcclxuICAgICAgICBpZiAoKGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpID4gaW5wdXRCdWZmZXIuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZCAoaW5jb25zaXN0ZW50IG9mZnNldCBhbmQgbGVuZ3RoIHZhbHVlcylcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGNvbnN0IHJldEJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcigyKTtcclxuICAgICAgICBpZiAoIXNpemVPbmx5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShyZXRCdWYpO1xyXG4gICAgICAgICAgICByZXRWaWV3WzBdID0gMHgwNTtcclxuICAgICAgICAgICAgcmV0Vmlld1sxXSA9IDB4MDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3cml0ZXIpIHtcclxuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHJldEJ1Zik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRCdWY7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX1gO1xyXG4gICAgfVxyXG59XHJcbl9hJHQgPSBOdWxsO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLk51bGwgPSBfYSR0O1xyXG59KSgpO1xyXG5OdWxsLk5BTUUgPSBcIk5VTExcIjtcblxuY2xhc3MgTG9jYWxCb29sZWFuVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKFZhbHVlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMudmFsdWVIZXgpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShwYXJhbWV0ZXJzLnZhbHVlSGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qgb2N0ZXQgb2YgdGhpcy52YWx1ZUhleFZpZXcpIHtcclxuICAgICAgICAgICAgaWYgKG9jdGV0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXdbMF0gPSB2YWx1ZSA/IDB4RkYgOiAweDAwO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXModGhpcywgaW5wdXRWaWV3LCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBpbnB1dFZpZXcuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIGlmIChpbnB1dExlbmd0aCA+IDEpXHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIkJvb2xlYW4gdmFsdWUgZW5jb2RlZCBpbiBtb3JlIHRoZW4gMSBvY3RldFwiKTtcclxuICAgICAgICB0aGlzLmlzSGV4T25seSA9IHRydWU7XHJcbiAgICAgICAgcHZ1dGlscy51dGlsRGVjb2RlVEMuY2FsbCh0aGlzKTtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gaW5wdXRMZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIChpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHRvQkVSKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsQm9vbGVhblZhbHVlQmxvY2suTkFNRSA9IFwiQm9vbGVhblZhbHVlQmxvY2tcIjtcblxudmFyIF9hJHM7XHJcbmNsYXNzIEJvb2xlYW4gZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxCb29sZWFuVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTtcclxuICAgIH1cclxuICAgIGdldFZhbHVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlQmxvY2sudmFsdWU7XHJcbiAgICB9XHJcbiAgICBzZXRWYWx1ZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHt0aGlzLmdldFZhbHVlfWA7XHJcbiAgICB9XHJcbn1cclxuX2EkcyA9IEJvb2xlYW47XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuQm9vbGVhbiA9IF9hJHM7XHJcbn0pKCk7XHJcbkJvb2xlYW4uTkFNRSA9IFwiQk9PTEVBTlwiO1xuXG5jbGFzcyBMb2NhbE9jdGV0U3RyaW5nVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrKSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IGlzQ29uc3RydWN0ZWQgPSBmYWxzZSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlzQ29uc3RydWN0ZWQgPSBpc0NvbnN0cnVjdGVkO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdE9mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jay5wcm90b3R5cGUuZnJvbUJFUi5jYWxsKHRoaXMsIGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSlcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEJsb2NrTmFtZSA9IHRoaXMudmFsdWVbaV0uY29uc3RydWN0b3IuTkFNRTtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmxvY2tOYW1lID09PSBFTkRfT0ZfQ09OVEVOVF9OQU1FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbmRlZmluaXRlRm9ybSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkVuZE9mQ29udGVudCBpcyB1bmV4cGVjdGVkLCBPQ1RFVCBTVFJJTkcgbWF5IGNvbnNpc3RzIG9mIE9DVEVUIFNUUklOR3Mgb25seVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja05hbWUgIT09IE9DVEVUX1NUUklOR19OQU1FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiT0NURVQgU1RSSU5HIG1heSBjb25zaXN0cyBvZiBPQ1RFVCBTVFJJTkdzIG9ubHlcIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ID0gc3VwZXIuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IGlucHV0TGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29uc3RydWN0ZWQpXHJcbiAgICAgICAgICAgIHJldHVybiBMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jay5wcm90b3R5cGUudG9CRVIuY2FsbCh0aGlzLCBzaXplT25seSwgd3JpdGVyKTtcclxuICAgICAgICByZXR1cm4gc2l6ZU9ubHlcclxuICAgICAgICAgICAgPyBuZXcgQXJyYXlCdWZmZXIodGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aClcclxuICAgICAgICAgICAgOiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgaXNDb25zdHJ1Y3RlZDogdGhpcy5pc0NvbnN0cnVjdGVkLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuTG9jYWxPY3RldFN0cmluZ1ZhbHVlQmxvY2suTkFNRSA9IFwiT2N0ZXRTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSRyO1xyXG5jbGFzcyBPY3RldFN0cmluZyBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IGlkQmxvY2sgPSB7fSwgbGVuQmxvY2sgPSB7fSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICB2YXIgX2IsIF9jO1xyXG4gICAgICAgIChfYiA9IHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogKHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCA9ICEhKChfYyA9IHBhcmFtZXRlcnMudmFsdWUpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5sZW5ndGgpKTtcclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkQmxvY2s6IHtcclxuICAgICAgICAgICAgICAgIGlzQ29uc3RydWN0ZWQ6IHBhcmFtZXRlcnMuaXNDb25zdHJ1Y3RlZCxcclxuICAgICAgICAgICAgICAgIC4uLmlkQmxvY2ssXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGxlbkJsb2NrOiB7XHJcbiAgICAgICAgICAgICAgICAuLi5sZW5CbG9jayxcclxuICAgICAgICAgICAgICAgIGlzSW5kZWZpbml0ZUZvcm06ICEhcGFyYW1ldGVycy5pc0luZGVmaW5pdGVGb3JtLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxyXG4gICAgICAgIH0sIExvY2FsT2N0ZXRTdHJpbmdWYWx1ZUJsb2NrKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSA0O1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLmlzQ29uc3RydWN0ZWQgPSB0aGlzLmlkQmxvY2suaXNDb25zdHJ1Y3RlZDtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suaXNJbmRlZmluaXRlRm9ybSA9IHRoaXMubGVuQmxvY2suaXNJbmRlZmluaXRlRm9ybTtcclxuICAgICAgICBpZiAoaW5wdXRMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaWRCbG9jay5lcnJvci5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHRoaXMuaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVuQmxvY2suZXJyb3IubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCArPSB0aGlzLmxlbkJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy52YWx1ZUJsb2NrLmlzQ29uc3RydWN0ZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgdmlldyA9IGlucHV0QnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBuZXcgVWludDhBcnJheShpbnB1dEJ1ZmZlcikgOiBpbnB1dEJ1ZmZlcjtcclxuICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYnVmLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc24gPSBsb2NhbEZyb21CRVIoYnVmLCAwLCBidWYuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFzbi5vZmZzZXQgIT09IC0xICYmIGFzbi5vZmZzZXQgPT09IGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IFthc24ucmVzdWx0XTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VwZXIuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgIH1cclxuICAgIG9uQXNjaWlFbmNvZGluZygpIHtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZUJsb2NrLmlzQ29uc3RydWN0ZWQgfHwgKHRoaXMudmFsdWVCbG9jay52YWx1ZSAmJiB0aGlzLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gQ29uc3RydWN0ZWQucHJvdG90eXBlLm9uQXNjaWlFbmNvZGluZy5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FfSA6ICR7cHZ0c3V0aWxzLkNvbnZlcnQuVG9IZXgodGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4Vmlldyl9YDtcclxuICAgIH1cclxuICAgIGdldFZhbHVlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZEJsb2NrLmlzQ29uc3RydWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcuc2xpY2UoKS5idWZmZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFycmF5ID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBjb250ZW50IG9mIHRoaXMudmFsdWVCbG9jay52YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIE9jdGV0U3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGNvbnRlbnQudmFsdWVCbG9jay52YWx1ZUhleFZpZXcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLmNvbmNhdChhcnJheSk7XHJcbiAgICB9XHJcbn1cclxuX2EkciA9IE9jdGV0U3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLk9jdGV0U3RyaW5nID0gX2EkcjtcclxufSkoKTtcclxuT2N0ZXRTdHJpbmcuTkFNRSA9IE9DVEVUX1NUUklOR19OQU1FO1xuXG5jbGFzcyBMb2NhbEJpdFN0cmluZ1ZhbHVlQmxvY2sgZXh0ZW5kcyBIZXhCbG9jayhMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyB1bnVzZWRCaXRzID0gMCwgaXNDb25zdHJ1Y3RlZCA9IGZhbHNlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudW51c2VkQml0cyA9IHVudXNlZEJpdHM7XHJcbiAgICAgICAgdGhpcy5pc0NvbnN0cnVjdGVkID0gaXNDb25zdHJ1Y3RlZDtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gdGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aDtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGlmICghaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0ID0gLTE7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBMb2NhbENvbnN0cnVjdGVkVmFsdWVCbG9jay5wcm90b3R5cGUuZnJvbUJFUi5jYWxsKHRoaXMsIGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSlcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRPZmZzZXQ7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEJsb2NrTmFtZSA9IHZhbHVlLmNvbnN0cnVjdG9yLk5BTUU7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrTmFtZSA9PT0gRU5EX09GX0NPTlRFTlRfTkFNRSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5kZWZpbml0ZUZvcm0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmRPZkNvbnRlbnQgaXMgdW5leHBlY3RlZCwgQklUIFNUUklORyBtYXkgY29uc2lzdHMgb2YgQklUIFNUUklOR3Mgb25seVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja05hbWUgIT09IEJJVF9TVFJJTkdfTkFNRSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBcIkJJVCBTVFJJTkcgbWF5IGNvbnNpc3RzIG9mIEJJVCBTVFJJTkdzIG9ubHlcIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUJsb2NrID0gdmFsdWUudmFsdWVCbG9jaztcclxuICAgICAgICAgICAgICAgIGlmICgodGhpcy51bnVzZWRCaXRzID4gMCkgJiYgKHZhbHVlQmxvY2sudW51c2VkQml0cyA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiVXNpbmcgb2YgXFxcInVudXNlZCBiaXRzXFxcIiBpbnNpZGUgY29uc3RydWN0aXZlIEJJVCBTVFJJTkcgYWxsb3dlZCBmb3IgbGVhc3Qgb25lIG9ubHlcIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVudXNlZEJpdHMgPSB2YWx1ZUJsb2NrLnVudXNlZEJpdHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5wdXRWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgICAgIGlmICghY2hlY2tCdWZmZXJQYXJhbXModGhpcywgaW5wdXRWaWV3LCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW50QnVmZmVyID0gaW5wdXRWaWV3LnN1YmFycmF5KGlucHV0T2Zmc2V0LCBpbnB1dE9mZnNldCArIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICB0aGlzLnVudXNlZEJpdHMgPSBpbnRCdWZmZXJbMF07XHJcbiAgICAgICAgaWYgKHRoaXMudW51c2VkQml0cyA+IDcpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiVW51c2VkIGJpdHMgZm9yIEJpdFN0cmluZyBtdXN0IGJlIGluIHJhbmdlIDAtN1wiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy51bnVzZWRCaXRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IGludEJ1ZmZlci5zdWJhcnJheSgxKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChidWYuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbiA9IGxvY2FsRnJvbUJFUihidWYsIDAsIGJ1Zi5ieXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXNuLm9mZnNldCAhPT0gLTEgJiYgYXNuLm9mZnNldCA9PT0gKGlucHV0TGVuZ3RoIC0gMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFthc24ucmVzdWx0XTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IGludEJ1ZmZlci5zdWJhcnJheSgxKTtcclxuICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoID0gaW50QnVmZmVyLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgdG9CRVIoc2l6ZU9ubHksIHdyaXRlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29uc3RydWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIExvY2FsQ29uc3RydWN0ZWRWYWx1ZUJsb2NrLnByb3RvdHlwZS50b0JFUi5jYWxsKHRoaXMsIHNpemVPbmx5LCB3cml0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcih0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy52YWx1ZUhleFZpZXcuYnl0ZUxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoICsgMSk7XHJcbiAgICAgICAgcmV0Vmlld1swXSA9IHRoaXMudW51c2VkQml0cztcclxuICAgICAgICByZXRWaWV3LnNldCh0aGlzLnZhbHVlSGV4VmlldywgMSk7XHJcbiAgICAgICAgcmV0dXJuIHJldFZpZXcuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB1bnVzZWRCaXRzOiB0aGlzLnVudXNlZEJpdHMsXHJcbiAgICAgICAgICAgIGlzQ29uc3RydWN0ZWQ6IHRoaXMuaXNDb25zdHJ1Y3RlZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsQml0U3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJCaXRTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbnZhciBfYSRxO1xyXG5jbGFzcyBCaXRTdHJpbmcgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyBpZEJsb2NrID0ge30sIGxlbkJsb2NrID0ge30sIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgdmFyIF9iLCBfYztcclxuICAgICAgICAoX2IgPSBwYXJhbWV0ZXJzLmlzQ29uc3RydWN0ZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChwYXJhbWV0ZXJzLmlzQ29uc3RydWN0ZWQgPSAhISgoX2MgPSBwYXJhbWV0ZXJzLnZhbHVlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSk7XHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZEJsb2NrOiB7XHJcbiAgICAgICAgICAgICAgICBpc0NvbnN0cnVjdGVkOiBwYXJhbWV0ZXJzLmlzQ29uc3RydWN0ZWQsXHJcbiAgICAgICAgICAgICAgICAuLi5pZEJsb2NrLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsZW5CbG9jazoge1xyXG4gICAgICAgICAgICAgICAgLi4ubGVuQmxvY2ssXHJcbiAgICAgICAgICAgICAgICBpc0luZGVmaW5pdGVGb3JtOiAhIXBhcmFtZXRlcnMuaXNJbmRlZmluaXRlRm9ybSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4ucGFyYW1ldGVycyxcclxuICAgICAgICB9LCBMb2NhbEJpdFN0cmluZ1ZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDM7XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suaXNDb25zdHJ1Y3RlZCA9IHRoaXMuaWRCbG9jay5pc0NvbnN0cnVjdGVkO1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay5pc0luZGVmaW5pdGVGb3JtID0gdGhpcy5sZW5CbG9jay5pc0luZGVmaW5pdGVGb3JtO1xyXG4gICAgICAgIHJldHVybiBzdXBlci5mcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQmxvY2suaXNDb25zdHJ1Y3RlZCB8fCAodGhpcy52YWx1ZUJsb2NrLnZhbHVlICYmIHRoaXMudmFsdWVCbG9jay52YWx1ZS5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBDb25zdHJ1Y3RlZC5wcm90b3R5cGUub25Bc2NpaUVuY29kaW5nLmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBiaXRzID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGV4ID0gdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldztcclxuICAgICAgICAgICAgZm9yIChjb25zdCBieXRlIG9mIHZhbHVlSGV4KSB7XHJcbiAgICAgICAgICAgICAgICBiaXRzLnB1c2goYnl0ZS50b1N0cmluZygyKS5wYWRTdGFydCg4LCBcIjBcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGJpdHNTdHIgPSBiaXRzLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHtiaXRzU3RyLnN1YnN0cmluZygwLCBiaXRzU3RyLmxlbmd0aCAtIHRoaXMudmFsdWVCbG9jay51bnVzZWRCaXRzKX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5fYSRxID0gQml0U3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkJpdFN0cmluZyA9IF9hJHE7XHJcbn0pKCk7XHJcbkJpdFN0cmluZy5OQU1FID0gQklUX1NUUklOR19OQU1FO1xuXG52YXIgX2EkcDtcclxuZnVuY3Rpb24gdmlld0FkZChmaXJzdCwgc2Vjb25kKSB7XHJcbiAgICBjb25zdCBjID0gbmV3IFVpbnQ4QXJyYXkoWzBdKTtcclxuICAgIGNvbnN0IGZpcnN0VmlldyA9IG5ldyBVaW50OEFycmF5KGZpcnN0KTtcclxuICAgIGNvbnN0IHNlY29uZFZpZXcgPSBuZXcgVWludDhBcnJheShzZWNvbmQpO1xyXG4gICAgbGV0IGZpcnN0Vmlld0NvcHkgPSBmaXJzdFZpZXcuc2xpY2UoMCk7XHJcbiAgICBjb25zdCBmaXJzdFZpZXdDb3B5TGVuZ3RoID0gZmlyc3RWaWV3Q29weS5sZW5ndGggLSAxO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlld0NvcHkgPSBzZWNvbmRWaWV3LnNsaWNlKDApO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlld0NvcHlMZW5ndGggPSBzZWNvbmRWaWV3Q29weS5sZW5ndGggLSAxO1xyXG4gICAgbGV0IHZhbHVlID0gMDtcclxuICAgIGNvbnN0IG1heCA9IChzZWNvbmRWaWV3Q29weUxlbmd0aCA8IGZpcnN0Vmlld0NvcHlMZW5ndGgpID8gZmlyc3RWaWV3Q29weUxlbmd0aCA6IHNlY29uZFZpZXdDb3B5TGVuZ3RoO1xyXG4gICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IG1heDsgaSA+PSAwOyBpLS0sIGNvdW50ZXIrKykge1xyXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjYXNlIChjb3VudGVyIDwgc2Vjb25kVmlld0NvcHkubGVuZ3RoKTpcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gKyBzZWNvbmRWaWV3Q29weVtzZWNvbmRWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdICsgY1swXTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSArIGNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNbMF0gPSB2YWx1ZSAvIDEwO1xyXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjYXNlIChjb3VudGVyID49IGZpcnN0Vmlld0NvcHkubGVuZ3RoKTpcclxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld0NvcHkgPSBwdnV0aWxzLnV0aWxDb25jYXRWaWV3KG5ldyBVaW50OEFycmF5KFt2YWx1ZSAlIDEwXSksIGZpcnN0Vmlld0NvcHkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSA9IHZhbHVlICUgMTA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNbMF0gPiAwKVxyXG4gICAgICAgIGZpcnN0Vmlld0NvcHkgPSBwdnV0aWxzLnV0aWxDb25jYXRWaWV3KGMsIGZpcnN0Vmlld0NvcHkpO1xyXG4gICAgcmV0dXJuIGZpcnN0Vmlld0NvcHk7XHJcbn1cclxuZnVuY3Rpb24gcG93ZXIyKG4pIHtcclxuICAgIGlmIChuID49IHBvd2VyczIubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgcCA9IHBvd2VyczIubGVuZ3RoOyBwIDw9IG47IHArKykge1xyXG4gICAgICAgICAgICBjb25zdCBjID0gbmV3IFVpbnQ4QXJyYXkoWzBdKTtcclxuICAgICAgICAgICAgbGV0IGRpZ2l0cyA9IChwb3dlcnMyW3AgLSAxXSkuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAoZGlnaXRzLmxlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBuZXcgVWludDhBcnJheShbKGRpZ2l0c1tpXSA8PCAxKSArIGNbMF1dKTtcclxuICAgICAgICAgICAgICAgIGNbMF0gPSBuZXdWYWx1ZVswXSAvIDEwO1xyXG4gICAgICAgICAgICAgICAgZGlnaXRzW2ldID0gbmV3VmFsdWVbMF0gJSAxMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY1swXSA+IDApXHJcbiAgICAgICAgICAgICAgICBkaWdpdHMgPSBwdnV0aWxzLnV0aWxDb25jYXRWaWV3KGMsIGRpZ2l0cyk7XHJcbiAgICAgICAgICAgIHBvd2VyczIucHVzaChkaWdpdHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwb3dlcnMyW25dO1xyXG59XHJcbmZ1bmN0aW9uIHZpZXdTdWIoZmlyc3QsIHNlY29uZCkge1xyXG4gICAgbGV0IGIgPSAwO1xyXG4gICAgY29uc3QgZmlyc3RWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3QpO1xyXG4gICAgY29uc3Qgc2Vjb25kVmlldyA9IG5ldyBVaW50OEFycmF5KHNlY29uZCk7XHJcbiAgICBjb25zdCBmaXJzdFZpZXdDb3B5ID0gZmlyc3RWaWV3LnNsaWNlKDApO1xyXG4gICAgY29uc3QgZmlyc3RWaWV3Q29weUxlbmd0aCA9IGZpcnN0Vmlld0NvcHkubGVuZ3RoIC0gMTtcclxuICAgIGNvbnN0IHNlY29uZFZpZXdDb3B5ID0gc2Vjb25kVmlldy5zbGljZSgwKTtcclxuICAgIGNvbnN0IHNlY29uZFZpZXdDb3B5TGVuZ3RoID0gc2Vjb25kVmlld0NvcHkubGVuZ3RoIC0gMTtcclxuICAgIGxldCB2YWx1ZTtcclxuICAgIGxldCBjb3VudGVyID0gMDtcclxuICAgIGZvciAobGV0IGkgPSBzZWNvbmRWaWV3Q29weUxlbmd0aDsgaSA+PSAwOyBpLS0sIGNvdW50ZXIrKykge1xyXG4gICAgICAgIHZhbHVlID0gZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gLSBzZWNvbmRWaWV3Q29weVtzZWNvbmRWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdIC0gYjtcclxuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcclxuICAgICAgICAgICAgY2FzZSAodmFsdWUgPCAwKTpcclxuICAgICAgICAgICAgICAgIGIgPSAxO1xyXG4gICAgICAgICAgICAgICAgZmlyc3RWaWV3Q29weVtmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gY291bnRlcl0gPSB2YWx1ZSArIDEwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBiID0gMDtcclxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGIgPiAwKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IChmaXJzdFZpZXdDb3B5TGVuZ3RoIC0gc2Vjb25kVmlld0NvcHlMZW5ndGggKyAxKTsgaSA+PSAwOyBpLS0sIGNvdW50ZXIrKykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdIC0gYjtcclxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgYiA9IDE7XHJcbiAgICAgICAgICAgICAgICBmaXJzdFZpZXdDb3B5W2ZpcnN0Vmlld0NvcHlMZW5ndGggLSBjb3VudGVyXSA9IHZhbHVlICsgMTA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiID0gMDtcclxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld0NvcHlbZmlyc3RWaWV3Q29weUxlbmd0aCAtIGNvdW50ZXJdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmaXJzdFZpZXdDb3B5LnNsaWNlKCk7XHJcbn1cclxuY2xhc3MgTG9jYWxJbnRlZ2VyVmFsdWVCbG9jayBleHRlbmRzIEhleEJsb2NrKFZhbHVlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWUsIC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5fdmFsdWVEZWMgPSAwO1xyXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnZhbHVlSGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVIZXgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZURlYyA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNldFZhbHVlSGV4KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlSGV4Vmlldy5sZW5ndGggPj0gNCkge1xyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJUb28gYmlnIEludGVnZXIgZm9yIGRlY29kaW5nLCBoZXggb25seVwiKTtcclxuICAgICAgICAgICAgdGhpcy5pc0hleE9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZURlYyA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzSGV4T25seSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVEZWMgPSBwdnV0aWxzLnV0aWxEZWNvZGVUQy5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlRGVjKHYpIHtcclxuICAgICAgICB0aGlzLl92YWx1ZURlYyA9IHY7XHJcbiAgICAgICAgdGhpcy5pc0hleE9ubHkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHB2dXRpbHMudXRpbEVuY29kZVRDKHYpKTtcclxuICAgIH1cclxuICAgIGdldCB2YWx1ZURlYygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVEZWM7XHJcbiAgICB9XHJcbiAgICBmcm9tREVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgsIGV4cGVjdGVkTGVuZ3RoID0gMCkge1xyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICBpZiAob2Zmc2V0ID09PSAtMSlcclxuICAgICAgICAgICAgcmV0dXJuIG9mZnNldDtcclxuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgaWYgKCh2aWV3WzBdID09PSAweDAwKSAmJiAoKHZpZXdbMV0gJiAweDgwKSAhPT0gMCkpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSB2aWV3LnN1YmFycmF5KDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGV4cGVjdGVkTGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmlldy5sZW5ndGggPCBleHBlY3RlZExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWRMZW5ndGggLSB2aWV3Lmxlbmd0aCkgPiAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IHZpZXcubGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHZpZXcuc3ViYXJyYXkoZXhwZWN0ZWRMZW5ndGggLSB2aWV3Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcclxuICAgIH1cclxuICAgIHRvREVSKHNpemVPbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgKCh2aWV3WzBdICYgMHg4MCkgIT09IDApOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZUhleFZpZXcubGVuZ3RoICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZpZXdbMF0gPSAweDAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWaWV3LnNldCh2aWV3LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlSGV4VmlldyA9IHVwZGF0ZWRWaWV3O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKCh2aWV3WzBdID09PSAweDAwKSAmJiAoKHZpZXdbMV0gJiAweDgwKSA9PT0gMCkpOlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gdGhpcy52YWx1ZUhleFZpZXcuc3ViYXJyYXkoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9CRVIoc2l6ZU9ubHkpO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0T2Zmc2V0ID0gc3VwZXIuZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldFZhbHVlSGV4KCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIHNpemVPbmx5XHJcbiAgICAgICAgICAgID8gbmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXhWaWV3Lmxlbmd0aClcclxuICAgICAgICAgICAgOiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWVEZWM6IHRoaXMudmFsdWVEZWMsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0Qml0ID0gKHRoaXMudmFsdWVIZXhWaWV3Lmxlbmd0aCAqIDgpIC0gMTtcclxuICAgICAgICBsZXQgZGlnaXRzID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMudmFsdWVIZXhWaWV3Lmxlbmd0aCAqIDgpIC8gMyk7XHJcbiAgICAgICAgbGV0IGJpdE51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRCeXRlO1xyXG4gICAgICAgIGNvbnN0IGFzbjFWaWV3ID0gdGhpcy52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGZsYWcgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBieXRlTnVtYmVyID0gKGFzbjFWaWV3LmJ5dGVMZW5ndGggLSAxKTsgYnl0ZU51bWJlciA+PSAwOyBieXRlTnVtYmVyLS0pIHtcclxuICAgICAgICAgICAgY3VycmVudEJ5dGUgPSBhc24xVmlld1tieXRlTnVtYmVyXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICgoY3VycmVudEJ5dGUgJiAxKSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYml0TnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZmlyc3RCaXQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSB2aWV3U3ViKHBvd2VyMihiaXROdW1iZXIpLCBkaWdpdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gXCItXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IHZpZXdBZGQoZGlnaXRzLCBwb3dlcjIoYml0TnVtYmVyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYml0TnVtYmVyKys7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Qnl0ZSA+Pj0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZ2l0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZGlnaXRzW2ldKVxyXG4gICAgICAgICAgICAgICAgZmxhZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChmbGFnKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGRpZ2l0c1N0cmluZy5jaGFyQXQoZGlnaXRzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZsYWcgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICByZXN1bHQgKz0gZGlnaXRzU3RyaW5nLmNoYXJBdCgwKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcbl9hJHAgPSBMb2NhbEludGVnZXJWYWx1ZUJsb2NrO1xyXG5Mb2NhbEludGVnZXJWYWx1ZUJsb2NrLk5BTUUgPSBcIkludGVnZXJWYWx1ZUJsb2NrXCI7XHJcbigoKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2EkcC5wcm90b3R5cGUsIFwidmFsdWVIZXhcIiwge1xyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheSh2KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUhleCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlSGV4Vmlldy5zbGljZSgpLmJ1ZmZlcjtcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcbn0pKCk7XG5cbnZhciBfYSRvO1xyXG5jbGFzcyBJbnRlZ2VyIGV4dGVuZHMgQmFzZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMsIExvY2FsSW50ZWdlclZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI7XHJcbiAgICB9XHJcbiAgICB0b0JpZ0ludCgpIHtcclxuICAgICAgICBhc3NlcnRCaWdJbnQoKTtcclxuICAgICAgICByZXR1cm4gQmlnSW50KHRoaXMudmFsdWVCbG9jay50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tQmlnSW50KHZhbHVlKSB7XHJcbiAgICAgICAgYXNzZXJ0QmlnSW50KCk7XHJcbiAgICAgICAgY29uc3QgYmlnSW50VmFsdWUgPSBCaWdJbnQodmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBWaWV3V3JpdGVyKCk7XHJcbiAgICAgICAgY29uc3QgaGV4ID0gYmlnSW50VmFsdWUudG9TdHJpbmcoMTYpLnJlcGxhY2UoL14tLywgXCJcIik7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KHB2dHN1dGlscy5Db252ZXJ0LkZyb21IZXgoaGV4KSk7XHJcbiAgICAgICAgaWYgKGJpZ0ludFZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IG5ldyBVaW50OEFycmF5KHZpZXcubGVuZ3RoICsgKHZpZXdbMF0gJiAweDgwID8gMSA6IDApKTtcclxuICAgICAgICAgICAgZmlyc3RbMF0gfD0gMHg4MDtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RJbnQgPSBCaWdJbnQoYDB4JHtwdnRzdXRpbHMuQ29udmVydC5Ub0hleChmaXJzdCl9YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZEludCA9IGZpcnN0SW50ICsgYmlnSW50VmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHB2dHN1dGlscy5Db252ZXJ0LkZyb21IZXgoc2Vjb25kSW50LnRvU3RyaW5nKDE2KSkpO1xyXG4gICAgICAgICAgICBzZWNvbmRbMF0gfD0gMHg4MDtcclxuICAgICAgICAgICAgd3JpdGVyLndyaXRlKHNlY29uZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodmlld1swXSAmIDB4ODApIHtcclxuICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShuZXcgVWludDhBcnJheShbMF0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUodmlldyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBJbnRlZ2VyKHtcclxuICAgICAgICAgICAgdmFsdWVIZXg6IHdyaXRlci5maW5hbCgpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBjb252ZXJ0VG9ERVIoKSB7XHJcbiAgICAgICAgY29uc3QgaW50ZWdlciA9IG5ldyBJbnRlZ2VyKHsgdmFsdWVIZXg6IHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgfSk7XHJcbiAgICAgICAgaW50ZWdlci52YWx1ZUJsb2NrLnRvREVSKCk7XHJcbiAgICAgICAgcmV0dXJuIGludGVnZXI7XHJcbiAgICB9XHJcbiAgICBjb252ZXJ0RnJvbURFUigpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoe1xyXG4gICAgICAgICAgICB2YWx1ZUhleDogdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4Vmlld1swXSA9PT0gMFxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3LnN1YmFycmF5KDEpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3RoaXMudmFsdWVCbG9jay50b1N0cmluZygpfWA7XHJcbiAgICB9XHJcbn1cclxuX2EkbyA9IEludGVnZXI7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuSW50ZWdlciA9IF9hJG87XHJcbn0pKCk7XHJcbkludGVnZXIuTkFNRSA9IFwiSU5URUdFUlwiO1xuXG52YXIgX2EkbjtcclxuY2xhc3MgRW51bWVyYXRlZCBleHRlbmRzIEludGVnZXIge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTA7XHJcbiAgICB9XHJcbn1cclxuX2EkbiA9IEVudW1lcmF0ZWQ7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuRW51bWVyYXRlZCA9IF9hJG47XHJcbn0pKCk7XHJcbkVudW1lcmF0ZWQuTkFNRSA9IFwiRU5VTUVSQVRFRFwiO1xuXG5jbGFzcyBMb2NhbFNpZFZhbHVlQmxvY2sgZXh0ZW5kcyBIZXhCbG9jayhWYWx1ZUJsb2NrKSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlRGVjID0gLTEsIGlzRmlyc3RTaWQgPSBmYWxzZSwgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLnZhbHVlRGVjID0gdmFsdWVEZWM7XHJcbiAgICAgICAgdGhpcy5pc0ZpcnN0U2lkID0gaXNGaXJzdFNpZDtcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGlmICghaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0T2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnB1dFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICAgICAgaWYgKCFjaGVja0J1ZmZlclBhcmFtcyh0aGlzLCBpbnB1dFZpZXcsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnRCdWZmZXIgPSBpbnB1dFZpZXcuc3ViYXJyYXkoaW5wdXRPZmZzZXQsIGlucHV0T2Zmc2V0ICsgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlSGV4Vmlld1tpXSA9IGludEJ1ZmZlcltpXSAmIDB4N0Y7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGgrKztcclxuICAgICAgICAgICAgaWYgKChpbnRCdWZmZXJbaV0gJiAweDgwKSA9PT0gMHgwMClcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZW1wVmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ibG9ja0xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRlbXBWaWV3W2ldID0gdGhpcy52YWx1ZUhleFZpZXdbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWVIZXhWaWV3ID0gdGVtcFZpZXc7XHJcbiAgICAgICAgaWYgKChpbnRCdWZmZXJbdGhpcy5ibG9ja0xlbmd0aCAtIDFdICYgMHg4MCkgIT09IDB4MDApIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiRW5kIG9mIGlucHV0IHJlYWNoZWQgYmVmb3JlIG1lc3NhZ2Ugd2FzIGZ1bGx5IGRlY29kZWRcIjtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy52YWx1ZUhleFZpZXdbMF0gPT09IDB4MDApXHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChcIk5lZWRsZXNzbHkgbG9uZyBmb3JtYXQgb2YgU0lEIGVuY29kaW5nXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLmJsb2NrTGVuZ3RoIDw9IDgpXHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVEZWMgPSBwdnV0aWxzLnV0aWxGcm9tQmFzZSh0aGlzLnZhbHVlSGV4VmlldywgNyk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiVG9vIGJpZyBTSUQgZm9yIGRlY29kaW5nLCBoZXggb25seVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChpbnB1dE9mZnNldCArIHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlQmlnSW50KHZhbHVlKSB7XHJcbiAgICAgICAgYXNzZXJ0QmlnSW50KCk7XHJcbiAgICAgICAgbGV0IGJpdHMgPSBCaWdJbnQodmFsdWUpLnRvU3RyaW5nKDIpO1xyXG4gICAgICAgIHdoaWxlIChiaXRzLmxlbmd0aCAlIDcpIHtcclxuICAgICAgICAgICAgYml0cyA9IFwiMFwiICsgYml0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaXRzLmxlbmd0aCAvIDcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYnl0ZXNbaV0gPSBwYXJzZUludChiaXRzLnNsaWNlKGkgKiA3LCBpICogNyArIDcpLCAyKSArIChpICsgMSA8IGJ5dGVzLmxlbmd0aCA/IDB4ODAgOiAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcm9tQkVSKGJ5dGVzLmJ1ZmZlciwgMCwgYnl0ZXMubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgIGlmIChzaXplT25seSlcclxuICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFycmF5QnVmZmVyKHRoaXMudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGgpKTtcclxuICAgICAgICAgICAgY29uc3QgY3VyVmlldyA9IHRoaXMudmFsdWVIZXhWaWV3O1xyXG4gICAgICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKHRoaXMuYmxvY2tMZW5ndGggLSAxKTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgcmV0Vmlld1tpXSA9IGN1clZpZXdbaV0gfCAweDgwO1xyXG4gICAgICAgICAgICByZXRWaWV3W3RoaXMuYmxvY2tMZW5ndGggLSAxXSA9IGN1clZpZXdbdGhpcy5ibG9ja0xlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVuY29kZWRCdWYgPSBwdnV0aWxzLnV0aWxUb0Jhc2UodGhpcy52YWx1ZURlYywgNyk7XHJcbiAgICAgICAgaWYgKGVuY29kZWRCdWYuYnl0ZUxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFcnJvciBkdXJpbmcgZW5jb2RpbmcgU0lEIHZhbHVlXCI7XHJcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJldFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIGlmICghc2l6ZU9ubHkpIHtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZFZpZXcgPSBuZXcgVWludDhBcnJheShlbmNvZGVkQnVmKTtcclxuICAgICAgICAgICAgY29uc3QgbGVuID0gZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaV0gPSBlbmNvZGVkVmlld1tpXSB8IDB4ODA7XHJcbiAgICAgICAgICAgIHJldFZpZXdbbGVuXSA9IGVuY29kZWRWaWV3W2xlbl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXRWaWV3O1xyXG4gICAgfVxyXG4gICAgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNIZXhPbmx5KVxyXG4gICAgICAgICAgICByZXN1bHQgPSBwdnRzdXRpbHMuQ29udmVydC5Ub0hleCh0aGlzLnZhbHVlSGV4Vmlldyk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRmlyc3RTaWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzaWRWYWx1ZSA9IHRoaXMudmFsdWVEZWM7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZURlYyA8PSAzOSlcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBcIjAuXCI7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZURlYyA8PSA3OSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBcIjEuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZFZhbHVlIC09IDQwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gXCIyLlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRWYWx1ZSAtPSA4MDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2lkVmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnZhbHVlRGVjLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uc3VwZXIudG9KU09OKCksXHJcbiAgICAgICAgICAgIHZhbHVlRGVjOiB0aGlzLnZhbHVlRGVjLFxyXG4gICAgICAgICAgICBpc0ZpcnN0U2lkOiB0aGlzLmlzRmlyc3RTaWQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5Mb2NhbFNpZFZhbHVlQmxvY2suTkFNRSA9IFwic2lkQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxPYmplY3RJZGVudGlmaWVyVmFsdWVCbG9jayBleHRlbmRzIFZhbHVlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSA9IEVNUFRZX1NUUklORywgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLnZhbHVlID0gW107XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbVN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdE9mZnNldCA9IGlucHV0T2Zmc2V0O1xyXG4gICAgICAgIHdoaWxlIChpbnB1dExlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc2lkQmxvY2sgPSBuZXcgTG9jYWxTaWRWYWx1ZUJsb2NrKCk7XHJcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCA9IHNpZEJsb2NrLmZyb21CRVIoaW5wdXRCdWZmZXIsIHJlc3VsdE9mZnNldCwgaW5wdXRMZW5ndGgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gc2lkQmxvY2suZXJyb3I7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0T2Zmc2V0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHNpZEJsb2NrLmlzRmlyc3RTaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHNpZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICBpbnB1dExlbmd0aCAtPSBzaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHNpZEJsb2NrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5KSB7XHJcbiAgICAgICAgY29uc3QgcmV0QnVmZmVycyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUJ1ZiA9IHRoaXMudmFsdWVbaV0udG9CRVIoc2l6ZU9ubHkpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWVCdWYuYnl0ZUxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IHRoaXMudmFsdWVbaV0uZXJyb3I7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldEJ1ZmZlcnMucHVzaCh2YWx1ZUJ1Zik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25jYXQocmV0QnVmZmVycyk7XHJcbiAgICB9XHJcbiAgICBmcm9tU3RyaW5nKHN0cmluZykge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICBsZXQgcG9zMSA9IDA7XHJcbiAgICAgICAgbGV0IHBvczIgPSAwO1xyXG4gICAgICAgIGxldCBzaWQgPSBcIlwiO1xyXG4gICAgICAgIGxldCBmbGFnID0gZmFsc2U7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBwb3MyID0gc3RyaW5nLmluZGV4T2YoXCIuXCIsIHBvczEpO1xyXG4gICAgICAgICAgICBpZiAocG9zMiA9PT0gLTEpXHJcbiAgICAgICAgICAgICAgICBzaWQgPSBzdHJpbmcuc3Vic3RyaW5nKHBvczEpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBzaWQgPSBzdHJpbmcuc3Vic3RyaW5nKHBvczEsIHBvczIpO1xyXG4gICAgICAgICAgICBwb3MxID0gcG9zMiArIDE7XHJcbiAgICAgICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaWRCbG9jayA9IHRoaXMudmFsdWVbMF07XHJcbiAgICAgICAgICAgICAgICBsZXQgcGx1cyA9IDA7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpZEJsb2NrLnZhbHVlRGVjKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdXMgPSA0MDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVzID0gODA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkU0lEID0gcGFyc2VJbnQoc2lkLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ocGFyc2VkU0lEKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBzaWRCbG9jay52YWx1ZURlYyA9IHBhcnNlZFNJRCArIHBsdXM7XHJcbiAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaWRCbG9jayA9IG5ldyBMb2NhbFNpZFZhbHVlQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGlmIChzaWQgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydEJpZ0ludCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZFZhbHVlID0gQmlnSW50KHNpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2lkQmxvY2sudmFsdWVCaWdJbnQgPSBzaWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNpZEJsb2NrLnZhbHVlRGVjID0gcGFyc2VJbnQoc2lkLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKHNpZEJsb2NrLnZhbHVlRGVjKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNpZEJsb2NrLmlzRmlyc3RTaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHNpZEJsb2NrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gd2hpbGUgKHBvczIgIT09IC0xKTtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xyXG4gICAgICAgIGxldCBpc0hleE9ubHkgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaXNIZXhPbmx5ID0gdGhpcy52YWx1ZVtpXS5pc0hleE9ubHk7XHJcbiAgICAgICAgICAgIGxldCBzaWRTdHIgPSB0aGlzLnZhbHVlW2ldLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGlmIChpICE9PSAwKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYCR7cmVzdWx0fS5gO1xyXG4gICAgICAgICAgICBpZiAoaXNIZXhPbmx5KSB7XHJcbiAgICAgICAgICAgICAgICBzaWRTdHIgPSBgeyR7c2lkU3RyfX1gO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVbaV0uaXNGaXJzdFNpZClcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBgMi57JHtzaWRTdHJ9IC0gODB9YDtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2lkU3RyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzaWRTdHI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgc2lkQXJyYXk6IFtdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5zaWRBcnJheS5wdXNoKHRoaXMudmFsdWVbaV0udG9KU09OKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqZWN0O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2suTkFNRSA9IFwiT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2tcIjtcblxudmFyIF9hJG07XHJcbmNsYXNzIE9iamVjdElkZW50aWZpZXIgZXh0ZW5kcyBCYXNlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxPYmplY3RJZGVudGlmaWVyVmFsdWVCbG9jayk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gNjtcclxuICAgIH1cclxuICAgIGdldFZhbHVlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlQmxvY2sudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIHNldFZhbHVlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLmZyb21TdHJpbmcodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgb25Bc2NpaUVuY29kaW5nKCkge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9IDogJHt0aGlzLnZhbHVlQmxvY2sudG9TdHJpbmcoKSB8fCBcImVtcHR5XCJ9YDtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0VmFsdWUoKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbl9hJG0gPSBPYmplY3RJZGVudGlmaWVyO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLk9iamVjdElkZW50aWZpZXIgPSBfYSRtO1xyXG59KSgpO1xyXG5PYmplY3RJZGVudGlmaWVyLk5BTUUgPSBcIk9CSkVDVCBJREVOVElGSUVSXCI7XG5cbmNsYXNzIExvY2FsUmVsYXRpdmVTaWRWYWx1ZUJsb2NrIGV4dGVuZHMgSGV4QmxvY2soTG9jYWxCYXNlQmxvY2spIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgdmFsdWVEZWMgPSAwLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWVEZWMgPSB2YWx1ZURlYztcclxuICAgIH1cclxuICAgIGZyb21CRVIoaW5wdXRCdWZmZXIsIGlucHV0T2Zmc2V0LCBpbnB1dExlbmd0aCkge1xyXG4gICAgICAgIGlmIChpbnB1dExlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIGlucHV0T2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IGlucHV0VmlldyA9IHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyUGFyYW1zKHRoaXMsIGlucHV0VmlldywgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSlcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIGNvbnN0IGludEJ1ZmZlciA9IGlucHV0Vmlldy5zdWJhcnJheShpbnB1dE9mZnNldCwgaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheShpbnB1dExlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVIZXhWaWV3W2ldID0gaW50QnVmZmVyW2ldICYgMHg3RjtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja0xlbmd0aCsrO1xyXG4gICAgICAgICAgICBpZiAoKGludEJ1ZmZlcltpXSAmIDB4ODApID09PSAweDAwKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRlbXBWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJsb2NrTGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHRlbXBWaWV3W2ldID0gdGhpcy52YWx1ZUhleFZpZXdbaV07XHJcbiAgICAgICAgdGhpcy52YWx1ZUhleFZpZXcgPSB0ZW1wVmlldztcclxuICAgICAgICBpZiAoKGludEJ1ZmZlclt0aGlzLmJsb2NrTGVuZ3RoIC0gMV0gJiAweDgwKSAhPT0gMHgwMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gXCJFbmQgb2YgaW5wdXQgcmVhY2hlZCBiZWZvcmUgbWVzc2FnZSB3YXMgZnVsbHkgZGVjb2RlZFwiO1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlSGV4Vmlld1swXSA9PT0gMHgwMClcclxuICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5wdXNoKFwiTmVlZGxlc3NseSBsb25nIGZvcm1hdCBvZiBTSUQgZW5jb2RpbmdcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuYmxvY2tMZW5ndGggPD0gOClcclxuICAgICAgICAgICAgdGhpcy52YWx1ZURlYyA9IHB2dXRpbHMudXRpbEZyb21CYXNlKHRoaXMudmFsdWVIZXhWaWV3LCA3KTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0hleE9ubHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2goXCJUb28gYmlnIFNJRCBmb3IgZGVjb2RpbmcsIGhleCBvbmx5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKGlucHV0T2Zmc2V0ICsgdGhpcy5ibG9ja0xlbmd0aCk7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSGV4T25seSkge1xyXG4gICAgICAgICAgICBpZiAoc2l6ZU9ubHkpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBcnJheUJ1ZmZlcih0aGlzLnZhbHVlSGV4Vmlldy5ieXRlTGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1clZpZXcgPSB0aGlzLnZhbHVlSGV4VmlldztcclxuICAgICAgICAgICAgY29uc3QgcmV0VmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tMZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICh0aGlzLmJsb2NrTGVuZ3RoIC0gMSk7IGkrKylcclxuICAgICAgICAgICAgICAgIHJldFZpZXdbaV0gPSBjdXJWaWV3W2ldIHwgMHg4MDtcclxuICAgICAgICAgICAgcmV0Vmlld1t0aGlzLmJsb2NrTGVuZ3RoIC0gMV0gPSBjdXJWaWV3W3RoaXMuYmxvY2tMZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgcmV0dXJuIHJldFZpZXcuYnVmZmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbmNvZGVkQnVmID0gcHZ1dGlscy51dGlsVG9CYXNlKHRoaXMudmFsdWVEZWMsIDcpO1xyXG4gICAgICAgIGlmIChlbmNvZGVkQnVmLmJ5dGVMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiRXJyb3IgZHVyaW5nIGVuY29kaW5nIFNJRCB2YWx1ZVwiO1xyXG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQlVGRkVSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZEJ1Zi5ieXRlTGVuZ3RoKTtcclxuICAgICAgICBpZiAoIXNpemVPbmx5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZEJ1Zik7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IGVuY29kZWRCdWYuYnl0ZUxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgICAgICByZXRWaWV3W2ldID0gZW5jb2RlZFZpZXdbaV0gfCAweDgwO1xyXG4gICAgICAgICAgICByZXRWaWV3W2xlbl0gPSBlbmNvZGVkVmlld1tsZW5dO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0Vmlldy5idWZmZXI7XHJcbiAgICB9XHJcbiAgICB0b1N0cmluZygpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICBpZiAodGhpcy5pc0hleE9ubHkpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHB2dHN1dGlscy5Db252ZXJ0LlRvSGV4KHRoaXMudmFsdWVIZXhWaWV3KTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy52YWx1ZURlYy50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZURlYzogdGhpcy52YWx1ZURlYyxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsUmVsYXRpdmVTaWRWYWx1ZUJsb2NrLk5BTUUgPSBcInJlbGF0aXZlU2lkQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxSZWxhdGl2ZU9iamVjdElkZW50aWZpZXJWYWx1ZUJsb2NrIGV4dGVuZHMgVmFsdWVCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlID0gRU1QVFlfU1RSSU5HLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmcm9tQkVSKGlucHV0QnVmZmVyLCBpbnB1dE9mZnNldCwgaW5wdXRMZW5ndGgpIHtcclxuICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0ID0gaW5wdXRPZmZzZXQ7XHJcbiAgICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaWRCbG9jayA9IG5ldyBMb2NhbFJlbGF0aXZlU2lkVmFsdWVCbG9jaygpO1xyXG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgPSBzaWRCbG9jay5mcm9tQkVSKGlucHV0QnVmZmVyLCByZXN1bHRPZmZzZXQsIGlucHV0TGVuZ3RoKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tMZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IHNpZEJsb2NrLmVycm9yO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrTGVuZ3RoICs9IHNpZEJsb2NrLmJsb2NrTGVuZ3RoO1xyXG4gICAgICAgICAgICBpbnB1dExlbmd0aCAtPSBzaWRCbG9jay5ibG9ja0xlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHNpZEJsb2NrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdE9mZnNldDtcclxuICAgIH1cclxuICAgIHRvQkVSKHNpemVPbmx5LCB3cml0ZXIpIHtcclxuICAgICAgICBjb25zdCByZXRCdWZmZXJzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQnVmID0gdGhpcy52YWx1ZVtpXS50b0JFUihzaXplT25seSk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUJ1Zi5ieXRlTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gdGhpcy52YWx1ZVtpXS5lcnJvcjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWV9CVUZGRVI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0QnVmZmVycy5wdXNoKHZhbHVlQnVmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmNhdChyZXRCdWZmZXJzKTtcclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xyXG4gICAgICAgIGxldCBwb3MxID0gMDtcclxuICAgICAgICBsZXQgcG9zMiA9IDA7XHJcbiAgICAgICAgbGV0IHNpZCA9IFwiXCI7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBwb3MyID0gc3RyaW5nLmluZGV4T2YoXCIuXCIsIHBvczEpO1xyXG4gICAgICAgICAgICBpZiAocG9zMiA9PT0gLTEpXHJcbiAgICAgICAgICAgICAgICBzaWQgPSBzdHJpbmcuc3Vic3RyaW5nKHBvczEpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBzaWQgPSBzdHJpbmcuc3Vic3RyaW5nKHBvczEsIHBvczIpO1xyXG4gICAgICAgICAgICBwb3MxID0gcG9zMiArIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpZEJsb2NrID0gbmV3IExvY2FsUmVsYXRpdmVTaWRWYWx1ZUJsb2NrKCk7XHJcbiAgICAgICAgICAgIHNpZEJsb2NrLnZhbHVlRGVjID0gcGFyc2VJbnQoc2lkLCAxMCk7XHJcbiAgICAgICAgICAgIGlmIChpc05hTihzaWRCbG9jay52YWx1ZURlYykpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHNpZEJsb2NrKTtcclxuICAgICAgICB9IHdoaWxlIChwb3MyICE9PSAtMSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICB0b1N0cmluZygpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICBsZXQgaXNIZXhPbmx5ID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlzSGV4T25seSA9IHRoaXMudmFsdWVbaV0uaXNIZXhPbmx5O1xyXG4gICAgICAgICAgICBsZXQgc2lkU3RyID0gdGhpcy52YWx1ZVtpXS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBpZiAoaSAhPT0gMClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGAke3Jlc3VsdH0uYDtcclxuICAgICAgICAgICAgaWYgKGlzSGV4T25seSkge1xyXG4gICAgICAgICAgICAgICAgc2lkU3RyID0gYHske3NpZFN0cn19YDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzaWRTdHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNpZFN0cjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBvYmplY3QgPSB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50b1N0cmluZygpLFxyXG4gICAgICAgICAgICBzaWRBcnJheTogW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIG9iamVjdC5zaWRBcnJheS5wdXNoKHRoaXMudmFsdWVbaV0udG9KU09OKCkpO1xyXG4gICAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICB9XHJcbn1cclxuTG9jYWxSZWxhdGl2ZU9iamVjdElkZW50aWZpZXJWYWx1ZUJsb2NrLk5BTUUgPSBcIlJlbGF0aXZlT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2tcIjtcblxudmFyIF9hJGw7XHJcbmNsYXNzIFJlbGF0aXZlT2JqZWN0SWRlbnRpZmllciBleHRlbmRzIEJhc2VCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzLCBMb2NhbFJlbGF0aXZlT2JqZWN0SWRlbnRpZmllclZhbHVlQmxvY2spO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDEzO1xyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVCbG9jay50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgc2V0VmFsdWUodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2suZnJvbVN0cmluZyh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3RoaXMudmFsdWVCbG9jay50b1N0cmluZygpIHx8IFwiZW1wdHlcIn1gO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRWYWx1ZSgpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuX2EkbCA9IFJlbGF0aXZlT2JqZWN0SWRlbnRpZmllcjtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5SZWxhdGl2ZU9iamVjdElkZW50aWZpZXIgPSBfYSRsO1xyXG59KSgpO1xyXG5SZWxhdGl2ZU9iamVjdElkZW50aWZpZXIuTkFNRSA9IFwiUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyXCI7XG5cbnZhciBfYSRrO1xyXG5jbGFzcyBTZXF1ZW5jZSBleHRlbmRzIENvbnN0cnVjdGVkIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDE2O1xyXG4gICAgfVxyXG59XHJcbl9hJGsgPSBTZXF1ZW5jZTtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5TZXF1ZW5jZSA9IF9hJGs7XHJcbn0pKCk7XHJcblNlcXVlbmNlLk5BTUUgPSBcIlNFUVVFTkNFXCI7XG5cbnZhciBfYSRqO1xyXG5jbGFzcyBTZXQgZXh0ZW5kcyBDb25zdHJ1Y3RlZCB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAxNztcclxuICAgIH1cclxufVxyXG5fYSRqID0gU2V0O1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlNldCA9IF9hJGo7XHJcbn0pKCk7XHJcblNldC5OQU1FID0gXCJTRVRcIjtcblxuY2xhc3MgTG9jYWxTdHJpbmdWYWx1ZUJsb2NrIGV4dGVuZHMgSGV4QmxvY2soVmFsdWVCbG9jaykge1xyXG4gICAgY29uc3RydWN0b3IoeyAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaXNIZXhPbmx5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnZhbHVlID0gRU1QVFlfU1RSSU5HO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbkxvY2FsU3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJTdHJpbmdWYWx1ZUJsb2NrXCI7XG5cbmNsYXNzIExvY2FsU2ltcGxlU3RyaW5nVmFsdWVCbG9jayBleHRlbmRzIExvY2FsU3RyaW5nVmFsdWVCbG9jayB7XHJcbn1cclxuTG9jYWxTaW1wbGVTdHJpbmdWYWx1ZUJsb2NrLk5BTUUgPSBcIlNpbXBsZVN0cmluZ1ZhbHVlQmxvY2tcIjtcblxuY2xhc3MgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayBleHRlbmRzIEJhc2VTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IC4uLnBhcmFtZXRlcnMgfSA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycywgTG9jYWxTaW1wbGVTdHJpbmdWYWx1ZUJsb2NrKTtcclxuICAgIH1cclxuICAgIGZyb21CdWZmZXIoaW5wdXRCdWZmZXIpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKSk7XHJcbiAgICB9XHJcbiAgICBmcm9tU3RyaW5nKGlucHV0U3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgc3RyTGVuID0gaW5wdXRTdHJpbmcubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoc3RyTGVuKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ckxlbjsgaSsrKVxyXG4gICAgICAgICAgICB2aWV3W2ldID0gaW5wdXRTdHJpbmcuY2hhckNvZGVBdChpKTtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBpbnB1dFN0cmluZztcclxuICAgIH1cclxufVxyXG5Mb2NhbFNpbXBsZVN0cmluZ0Jsb2NrLk5BTUUgPSBcIlNJTVBMRSBTVFJJTkdcIjtcblxuY2xhc3MgTG9jYWxVdGY4U3RyaW5nVmFsdWVCbG9jayBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgZnJvbUJ1ZmZlcihpbnB1dEJ1ZmZlcikge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcik7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gcHZ0c3V0aWxzLkNvbnZlcnQuVG9VdGY4U3RyaW5nKGlucHV0QnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChgRXJyb3IgZHVyaW5nIFwiZGVjb2RlVVJJQ29tcG9uZW50XCI6ICR7ZXh9LCB1c2luZyByYXcgc3RyaW5nYCk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IHB2dHN1dGlscy5Db252ZXJ0LlRvQmluYXJ5KGlucHV0QnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmcm9tU3RyaW5nKGlucHV0U3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHB2dHN1dGlscy5Db252ZXJ0LkZyb21VdGY4U3RyaW5nKGlucHV0U3RyaW5nKSk7XHJcbiAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlID0gaW5wdXRTdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuTG9jYWxVdGY4U3RyaW5nVmFsdWVCbG9jay5OQU1FID0gXCJVdGY4U3RyaW5nVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkaTtcclxuY2xhc3MgVXRmOFN0cmluZyBleHRlbmRzIExvY2FsVXRmOFN0cmluZ1ZhbHVlQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTI7XHJcbiAgICB9XHJcbn1cclxuX2EkaSA9IFV0ZjhTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuVXRmOFN0cmluZyA9IF9hJGk7XHJcbn0pKCk7XHJcblV0ZjhTdHJpbmcuTkFNRSA9IFwiVVRGOFN0cmluZ1wiO1xuXG5jbGFzcyBMb2NhbEJtcFN0cmluZ1ZhbHVlQmxvY2sgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGZyb21CdWZmZXIoaW5wdXRCdWZmZXIpIHtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBwdnRzdXRpbHMuQ29udmVydC5Ub1V0ZjE2U3RyaW5nKGlucHV0QnVmZmVyKTtcclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpO1xyXG4gICAgfVxyXG4gICAgZnJvbVN0cmluZyhpbnB1dFN0cmluZykge1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IGlucHV0U3RyaW5nO1xyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheShwdnRzdXRpbHMuQ29udmVydC5Gcm9tVXRmMTZTdHJpbmcoaW5wdXRTdHJpbmcpKTtcclxuICAgIH1cclxufVxyXG5Mb2NhbEJtcFN0cmluZ1ZhbHVlQmxvY2suTkFNRSA9IFwiQm1wU3RyaW5nVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkaDtcclxuY2xhc3MgQm1wU3RyaW5nIGV4dGVuZHMgTG9jYWxCbXBTdHJpbmdWYWx1ZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAzMDtcclxuICAgIH1cclxufVxyXG5fYSRoID0gQm1wU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkJtcFN0cmluZyA9IF9hJGg7XHJcbn0pKCk7XHJcbkJtcFN0cmluZy5OQU1FID0gXCJCTVBTdHJpbmdcIjtcblxuY2xhc3MgTG9jYWxVbml2ZXJzYWxTdHJpbmdWYWx1ZUJsb2NrIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBmcm9tQnVmZmVyKGlucHV0QnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgY29weUJ1ZmZlciA9IEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dEJ1ZmZlcikgPyBpbnB1dEJ1ZmZlci5zbGljZSgpLmJ1ZmZlciA6IGlucHV0QnVmZmVyLnNsaWNlKDApO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlVmlldyA9IG5ldyBVaW50OEFycmF5KGNvcHlCdWZmZXIpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVWaWV3Lmxlbmd0aDsgaSArPSA0KSB7XHJcbiAgICAgICAgICAgIHZhbHVlVmlld1tpXSA9IHZhbHVlVmlld1tpICsgM107XHJcbiAgICAgICAgICAgIHZhbHVlVmlld1tpICsgMV0gPSB2YWx1ZVZpZXdbaSArIDJdO1xyXG4gICAgICAgICAgICB2YWx1ZVZpZXdbaSArIDJdID0gMHgwMDtcclxuICAgICAgICAgICAgdmFsdWVWaWV3W2kgKyAzXSA9IDB4MDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQzMkFycmF5KGNvcHlCdWZmZXIpKTtcclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoaW5wdXRTdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBzdHJMZW5ndGggPSBpbnB1dFN0cmluZy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgdmFsdWVIZXhWaWV3ID0gdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHN0ckxlbmd0aCAqIDQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29kZUJ1ZiA9IHB2dXRpbHMudXRpbFRvQmFzZShpbnB1dFN0cmluZy5jaGFyQ29kZUF0KGkpLCA4KTtcclxuICAgICAgICAgICAgY29uc3QgY29kZVZpZXcgPSBuZXcgVWludDhBcnJheShjb2RlQnVmKTtcclxuICAgICAgICAgICAgaWYgKGNvZGVWaWV3Lmxlbmd0aCA+IDQpXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgZGlmID0gNCAtIGNvZGVWaWV3Lmxlbmd0aDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IChjb2RlVmlldy5sZW5ndGggLSAxKTsgaiA+PSAwOyBqLS0pXHJcbiAgICAgICAgICAgICAgICB2YWx1ZUhleFZpZXdbaSAqIDQgKyBqICsgZGlmXSA9IGNvZGVWaWV3W2pdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWUgPSBpbnB1dFN0cmluZztcclxuICAgIH1cclxufVxyXG5Mb2NhbFVuaXZlcnNhbFN0cmluZ1ZhbHVlQmxvY2suTkFNRSA9IFwiVW5pdmVyc2FsU3RyaW5nVmFsdWVCbG9ja1wiO1xuXG52YXIgX2EkZztcclxuY2xhc3MgVW5pdmVyc2FsU3RyaW5nIGV4dGVuZHMgTG9jYWxVbml2ZXJzYWxTdHJpbmdWYWx1ZUJsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgLi4ucGFyYW1ldGVycyB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyODtcclxuICAgIH1cclxufVxyXG5fYSRnID0gVW5pdmVyc2FsU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlVuaXZlcnNhbFN0cmluZyA9IF9hJGc7XHJcbn0pKCk7XHJcblVuaXZlcnNhbFN0cmluZy5OQU1FID0gXCJVbml2ZXJzYWxTdHJpbmdcIjtcblxudmFyIF9hJGY7XHJcbmNsYXNzIE51bWVyaWNTdHJpbmcgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDE4O1xyXG4gICAgfVxyXG59XHJcbl9hJGYgPSBOdW1lcmljU3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLk51bWVyaWNTdHJpbmcgPSBfYSRmO1xyXG59KSgpO1xyXG5OdW1lcmljU3RyaW5nLk5BTUUgPSBcIk51bWVyaWNTdHJpbmdcIjtcblxudmFyIF9hJGU7XHJcbmNsYXNzIFByaW50YWJsZVN0cmluZyBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMTk7XHJcbiAgICB9XHJcbn1cclxuX2EkZSA9IFByaW50YWJsZVN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5QcmludGFibGVTdHJpbmcgPSBfYSRlO1xyXG59KSgpO1xyXG5QcmludGFibGVTdHJpbmcuTkFNRSA9IFwiUHJpbnRhYmxlU3RyaW5nXCI7XG5cbnZhciBfYSRkO1xyXG5jbGFzcyBUZWxldGV4U3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyMDtcclxuICAgIH1cclxufVxyXG5fYSRkID0gVGVsZXRleFN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5UZWxldGV4U3RyaW5nID0gX2EkZDtcclxufSkoKTtcclxuVGVsZXRleFN0cmluZy5OQU1FID0gXCJUZWxldGV4U3RyaW5nXCI7XG5cbnZhciBfYSRjO1xyXG5jbGFzcyBWaWRlb3RleFN0cmluZyBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMjE7XHJcbiAgICB9XHJcbn1cclxuX2EkYyA9IFZpZGVvdGV4U3RyaW5nO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLlZpZGVvdGV4U3RyaW5nID0gX2EkYztcclxufSkoKTtcclxuVmlkZW90ZXhTdHJpbmcuTkFNRSA9IFwiVmlkZW90ZXhTdHJpbmdcIjtcblxudmFyIF9hJGI7XHJcbmNsYXNzIElBNVN0cmluZyBleHRlbmRzIExvY2FsU2ltcGxlU3RyaW5nQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMjI7XHJcbiAgICB9XHJcbn1cclxuX2EkYiA9IElBNVN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5JQTVTdHJpbmcgPSBfYSRiO1xyXG59KSgpO1xyXG5JQTVTdHJpbmcuTkFNRSA9IFwiSUE1U3RyaW5nXCI7XG5cbnZhciBfYSRhO1xyXG5jbGFzcyBHcmFwaGljU3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyNTtcclxuICAgIH1cclxufVxyXG5fYSRhID0gR3JhcGhpY1N0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5HcmFwaGljU3RyaW5nID0gX2EkYTtcclxufSkoKTtcclxuR3JhcGhpY1N0cmluZy5OQU1FID0gXCJHcmFwaGljU3RyaW5nXCI7XG5cbnZhciBfYSQ5O1xyXG5jbGFzcyBWaXNpYmxlU3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyNjtcclxuICAgIH1cclxufVxyXG5fYSQ5ID0gVmlzaWJsZVN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5WaXNpYmxlU3RyaW5nID0gX2EkOTtcclxufSkoKTtcclxuVmlzaWJsZVN0cmluZy5OQU1FID0gXCJWaXNpYmxlU3RyaW5nXCI7XG5cbnZhciBfYSQ4O1xyXG5jbGFzcyBHZW5lcmFsU3RyaW5nIGV4dGVuZHMgTG9jYWxTaW1wbGVTdHJpbmdCbG9jayB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyNztcclxuICAgIH1cclxufVxyXG5fYSQ4ID0gR2VuZXJhbFN0cmluZztcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5HZW5lcmFsU3RyaW5nID0gX2EkODtcclxufSkoKTtcclxuR2VuZXJhbFN0cmluZy5OQU1FID0gXCJHZW5lcmFsU3RyaW5nXCI7XG5cbnZhciBfYSQ3O1xyXG5jbGFzcyBDaGFyYWN0ZXJTdHJpbmcgZXh0ZW5kcyBMb2NhbFNpbXBsZVN0cmluZ0Jsb2NrIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI5O1xyXG4gICAgfVxyXG59XHJcbl9hJDcgPSBDaGFyYWN0ZXJTdHJpbmc7XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuQ2hhcmFjdGVyU3RyaW5nID0gX2EkNztcclxufSkoKTtcclxuQ2hhcmFjdGVyU3RyaW5nLk5BTUUgPSBcIkNoYXJhY3RlclN0cmluZ1wiO1xuXG52YXIgX2EkNjtcclxuY2xhc3MgVVRDVGltZSBleHRlbmRzIFZpc2libGVTdHJpbmcge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSwgdmFsdWVEYXRlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMueWVhciA9IDA7XHJcbiAgICAgICAgdGhpcy5tb250aCA9IDA7XHJcbiAgICAgICAgdGhpcy5kYXkgPSAwO1xyXG4gICAgICAgIHRoaXMuaG91ciA9IDA7XHJcbiAgICAgICAgdGhpcy5taW51dGUgPSAwO1xyXG4gICAgICAgIHRoaXMuc2Vjb25kID0gMDtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyA9IG5ldyBVaW50OEFycmF5KHZhbHVlLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3W2ldID0gdmFsdWUuY2hhckNvZGVBdChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZyb21EYXRlKHZhbHVlRGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVCbG9jay52YWx1ZUhleFZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLnRvQnVmZmVyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAyMztcclxuICAgIH1cclxuICAgIGZyb21CdWZmZXIoaW5wdXRCdWZmZXIpIHtcclxuICAgICAgICB0aGlzLmZyb21TdHJpbmcoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShpbnB1dEJ1ZmZlcikpKTtcclxuICAgIH1cclxuICAgIHRvQnVmZmVyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMudG9TdHJpbmcoKTtcclxuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICByZXR1cm4gYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgZnJvbURhdGUoaW5wdXREYXRlKSB7XHJcbiAgICAgICAgdGhpcy55ZWFyID0gaW5wdXREYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XHJcbiAgICAgICAgdGhpcy5tb250aCA9IGlucHV0RGF0ZS5nZXRVVENNb250aCgpICsgMTtcclxuICAgICAgICB0aGlzLmRheSA9IGlucHV0RGF0ZS5nZXRVVENEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5ob3VyID0gaW5wdXREYXRlLmdldFVUQ0hvdXJzKCk7XHJcbiAgICAgICAgdGhpcy5taW51dGUgPSBpbnB1dERhdGUuZ2V0VVRDTWludXRlcygpO1xyXG4gICAgICAgIHRoaXMuc2Vjb25kID0gaW5wdXREYXRlLmdldFVUQ1NlY29uZHMoKTtcclxuICAgIH1cclxuICAgIHRvRGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gKG5ldyBEYXRlKERhdGUuVVRDKHRoaXMueWVhciwgdGhpcy5tb250aCAtIDEsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCkpKTtcclxuICAgIH1cclxuICAgIGZyb21TdHJpbmcoaW5wdXRTdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBwYXJzZXIgPSAvKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pWi9pZztcclxuICAgICAgICBjb25zdCBwYXJzZXJBcnJheSA9IHBhcnNlci5leGVjKGlucHV0U3RyaW5nKTtcclxuICAgICAgICBpZiAocGFyc2VyQXJyYXkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCI7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeWVhciA9IHBhcnNlSW50KHBhcnNlckFycmF5WzFdLCAxMCk7XHJcbiAgICAgICAgaWYgKHllYXIgPj0gNTApXHJcbiAgICAgICAgICAgIHRoaXMueWVhciA9IDE5MDAgKyB5ZWFyO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy55ZWFyID0gMjAwMCArIHllYXI7XHJcbiAgICAgICAgdGhpcy5tb250aCA9IHBhcnNlSW50KHBhcnNlckFycmF5WzJdLCAxMCk7XHJcbiAgICAgICAgdGhpcy5kYXkgPSBwYXJzZUludChwYXJzZXJBcnJheVszXSwgMTApO1xyXG4gICAgICAgIHRoaXMuaG91ciA9IHBhcnNlSW50KHBhcnNlckFycmF5WzRdLCAxMCk7XHJcbiAgICAgICAgdGhpcy5taW51dGUgPSBwYXJzZUludChwYXJzZXJBcnJheVs1XSwgMTApO1xyXG4gICAgICAgIHRoaXMuc2Vjb25kID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbNl0sIDEwKTtcclxuICAgIH1cclxuICAgIHRvU3RyaW5nKGVuY29kaW5nID0gXCJpc29cIikge1xyXG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gXCJpc29cIikge1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRBcnJheSA9IG5ldyBBcnJheSg3KTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXlbMF0gPSBwdnV0aWxzLnBhZE51bWJlcigoKHRoaXMueWVhciA8IDIwMDApID8gKHRoaXMueWVhciAtIDE5MDApIDogKHRoaXMueWVhciAtIDIwMDApKSwgMik7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5WzFdID0gcHZ1dGlscy5wYWROdW1iZXIodGhpcy5tb250aCwgMik7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5WzJdID0gcHZ1dGlscy5wYWROdW1iZXIodGhpcy5kYXksIDIpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheVszXSA9IHB2dXRpbHMucGFkTnVtYmVyKHRoaXMuaG91ciwgMik7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5WzRdID0gcHZ1dGlscy5wYWROdW1iZXIodGhpcy5taW51dGUsIDIpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheVs1XSA9IHB2dXRpbHMucGFkTnVtYmVyKHRoaXMuc2Vjb25kLCAyKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXlbNl0gPSBcIlpcIjtcclxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dEFycmF5LmpvaW4oXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZyhlbmNvZGluZyk7XHJcbiAgICB9XHJcbiAgICBvbkFzY2lpRW5jb2RpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRX0gOiAke3RoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKX1gO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnN1cGVyLnRvSlNPTigpLFxyXG4gICAgICAgICAgICB5ZWFyOiB0aGlzLnllYXIsXHJcbiAgICAgICAgICAgIG1vbnRoOiB0aGlzLm1vbnRoLFxyXG4gICAgICAgICAgICBkYXk6IHRoaXMuZGF5LFxyXG4gICAgICAgICAgICBob3VyOiB0aGlzLmhvdXIsXHJcbiAgICAgICAgICAgIG1pbnV0ZTogdGhpcy5taW51dGUsXHJcbiAgICAgICAgICAgIHNlY29uZDogdGhpcy5zZWNvbmQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5fYSQ2ID0gVVRDVGltZTtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5VVENUaW1lID0gX2EkNjtcclxufSkoKTtcclxuVVRDVGltZS5OQU1FID0gXCJVVENUaW1lXCI7XG5cbnZhciBfYSQ1O1xyXG5jbGFzcyBHZW5lcmFsaXplZFRpbWUgZXh0ZW5kcyBVVENUaW1lIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHZhciBfYjtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICAoX2IgPSB0aGlzLm1pbGxpc2Vjb25kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAodGhpcy5taWxsaXNlY29uZCA9IDApO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDI0O1xyXG4gICAgfVxyXG4gICAgZnJvbURhdGUoaW5wdXREYXRlKSB7XHJcbiAgICAgICAgc3VwZXIuZnJvbURhdGUoaW5wdXREYXRlKTtcclxuICAgICAgICB0aGlzLm1pbGxpc2Vjb25kID0gaW5wdXREYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xyXG4gICAgfVxyXG4gICAgdG9EYXRlKCkge1xyXG4gICAgICAgIHJldHVybiAobmV3IERhdGUoRGF0ZS5VVEModGhpcy55ZWFyLCB0aGlzLm1vbnRoIC0gMSwgdGhpcy5kYXksIHRoaXMuaG91ciwgdGhpcy5taW51dGUsIHRoaXMuc2Vjb25kLCB0aGlzLm1pbGxpc2Vjb25kKSkpO1xyXG4gICAgfVxyXG4gICAgZnJvbVN0cmluZyhpbnB1dFN0cmluZykge1xyXG4gICAgICAgIGxldCBpc1VUQyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB0aW1lU3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgZGF0ZVRpbWVTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBmcmFjdGlvblBhcnQgPSAwO1xyXG4gICAgICAgIGxldCBwYXJzZXI7XHJcbiAgICAgICAgbGV0IGhvdXJEaWZmZXJlbmNlID0gMDtcclxuICAgICAgICBsZXQgbWludXRlRGlmZmVyZW5jZSA9IDA7XHJcbiAgICAgICAgaWYgKGlucHV0U3RyaW5nW2lucHV0U3RyaW5nLmxlbmd0aCAtIDFdID09PSBcIlpcIikge1xyXG4gICAgICAgICAgICB0aW1lU3RyaW5nID0gaW5wdXRTdHJpbmcuc3Vic3RyaW5nKDAsIGlucHV0U3RyaW5nLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICBpc1VUQyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBudW1iZXIgPSBuZXcgTnVtYmVyKGlucHV0U3RyaW5nW2lucHV0U3RyaW5nLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKG51bWJlci52YWx1ZU9mKCkpKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgICAgICB0aW1lU3RyaW5nID0gaW5wdXRTdHJpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc1VUQykge1xyXG4gICAgICAgICAgICBpZiAodGltZVN0cmluZy5pbmRleE9mKFwiK1wiKSAhPT0gLTEpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgIGlmICh0aW1lU3RyaW5nLmluZGV4T2YoXCItXCIpICE9PSAtMSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBtdWx0aXBsaWVyID0gMTtcclxuICAgICAgICAgICAgbGV0IGRpZmZlcmVuY2VQb3NpdGlvbiA9IHRpbWVTdHJpbmcuaW5kZXhPZihcIitcIik7XHJcbiAgICAgICAgICAgIGxldCBkaWZmZXJlbmNlU3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2VQb3NpdGlvbiA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VQb3NpdGlvbiA9IHRpbWVTdHJpbmcuaW5kZXhPZihcIi1cIik7XHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2VQb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VTdHJpbmcgPSB0aW1lU3RyaW5nLnN1YnN0cmluZyhkaWZmZXJlbmNlUG9zaXRpb24gKyAxKTtcclxuICAgICAgICAgICAgICAgIHRpbWVTdHJpbmcgPSB0aW1lU3RyaW5nLnN1YnN0cmluZygwLCBkaWZmZXJlbmNlUG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKChkaWZmZXJlbmNlU3RyaW5nLmxlbmd0aCAhPT0gMikgJiYgKGRpZmZlcmVuY2VTdHJpbmcubGVuZ3RoICE9PSA0KSlcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyID0gcGFyc2VJbnQoZGlmZmVyZW5jZVN0cmluZy5zdWJzdHJpbmcoMCwgMiksIDEwKTtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hTihudW1iZXIudmFsdWVPZigpKSlcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgICAgICBob3VyRGlmZmVyZW5jZSA9IG11bHRpcGxpZXIgKiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZmVyZW5jZVN0cmluZy5sZW5ndGggPT09IDQpIHtcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChkaWZmZXJlbmNlU3RyaW5nLnN1YnN0cmluZygyLCA0KSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihudW1iZXIudmFsdWVPZigpKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbnV0ZURpZmZlcmVuY2UgPSBtdWx0aXBsaWVyICogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmcmFjdGlvblBvaW50UG9zaXRpb24gPSB0aW1lU3RyaW5nLmluZGV4T2YoXCIuXCIpO1xyXG4gICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gPT09IC0xKVxyXG4gICAgICAgICAgICBmcmFjdGlvblBvaW50UG9zaXRpb24gPSB0aW1lU3RyaW5nLmluZGV4T2YoXCIsXCIpO1xyXG4gICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyYWN0aW9uUGFydENoZWNrID0gbmV3IE51bWJlcihgMCR7dGltZVN0cmluZy5zdWJzdHJpbmcoZnJhY3Rpb25Qb2ludFBvc2l0aW9uKX1gKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKGZyYWN0aW9uUGFydENoZWNrLnZhbHVlT2YoKSkpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgIGZyYWN0aW9uUGFydCA9IGZyYWN0aW9uUGFydENoZWNrLnZhbHVlT2YoKTtcclxuICAgICAgICAgICAgZGF0ZVRpbWVTdHJpbmcgPSB0aW1lU3RyaW5nLnN1YnN0cmluZygwLCBmcmFjdGlvblBvaW50UG9zaXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGRhdGVUaW1lU3RyaW5nID0gdGltZVN0cmluZztcclxuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcclxuICAgICAgICAgICAgY2FzZSAoZGF0ZVRpbWVTdHJpbmcubGVuZ3RoID09PSA4KTpcclxuICAgICAgICAgICAgICAgIHBhcnNlciA9IC8oXFxkezR9KShcXGR7Mn0pKFxcZHsyfSkvaWc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnJhY3Rpb25Qb2ludFBvc2l0aW9uICE9PSAtMSlcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBpbnB1dCBzdHJpbmcgZm9yIGNvbnZlcnNpb25cIik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoZGF0ZVRpbWVTdHJpbmcubGVuZ3RoID09PSAxMCk6XHJcbiAgICAgICAgICAgICAgICBwYXJzZXIgPSAvKFxcZHs0fSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkvaWc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnJhY3Rpb25Qb2ludFBvc2l0aW9uICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmcmFjdGlvblJlc3VsdCA9IDYwICogZnJhY3Rpb25QYXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWludXRlID0gTWF0aC5mbG9vcihmcmFjdGlvblJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25SZXN1bHQgPSA2MCAqIChmcmFjdGlvblJlc3VsdCAtIHRoaXMubWludXRlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY29uZCA9IE1hdGguZmxvb3IoZnJhY3Rpb25SZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uUmVzdWx0ID0gMTAwMCAqIChmcmFjdGlvblJlc3VsdCAtIHRoaXMuc2Vjb25kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbGxpc2Vjb25kID0gTWF0aC5mbG9vcihmcmFjdGlvblJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoZGF0ZVRpbWVTdHJpbmcubGVuZ3RoID09PSAxMik6XHJcbiAgICAgICAgICAgICAgICBwYXJzZXIgPSAvKFxcZHs0fSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS9pZztcclxuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYWN0aW9uUmVzdWx0ID0gNjAgKiBmcmFjdGlvblBhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSBNYXRoLmZsb29yKGZyYWN0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBmcmFjdGlvblJlc3VsdCA9IDEwMDAgKiAoZnJhY3Rpb25SZXN1bHQgLSB0aGlzLnNlY29uZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZCA9IE1hdGguZmxvb3IoZnJhY3Rpb25SZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKGRhdGVUaW1lU3RyaW5nLmxlbmd0aCA9PT0gMTQpOlxyXG4gICAgICAgICAgICAgICAgcGFyc2VyID0gLyhcXGR7NH0pKFxcZHsyfSkoXFxkezJ9KShcXGR7Mn0pKFxcZHsyfSkoXFxkezJ9KS9pZztcclxuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvblBvaW50UG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJhY3Rpb25SZXN1bHQgPSAxMDAwICogZnJhY3Rpb25QYXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmQgPSBNYXRoLmZsb29yKGZyYWN0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJzZXJBcnJheSA9IHBhcnNlci5leGVjKGRhdGVUaW1lU3RyaW5nKTtcclxuICAgICAgICBpZiAocGFyc2VyQXJyYXkgPT09IG51bGwpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGlucHV0IHN0cmluZyBmb3IgY29udmVyc2lvblwiKTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHBhcnNlckFycmF5Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoaikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhciA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXkgPSBwYXJzZUludChwYXJzZXJBcnJheVtqXSwgMTApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG91ciA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCkgKyBob3VyRGlmZmVyZW5jZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZSA9IHBhcnNlSW50KHBhcnNlckFycmF5W2pdLCAxMCkgKyBtaW51dGVEaWZmZXJlbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kID0gcGFyc2VJbnQocGFyc2VyQXJyYXlbal0sIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgaW5wdXQgc3RyaW5nIGZvciBjb252ZXJzaW9uXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc1VUQyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVtcERhdGUgPSBuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIHRoaXMuZGF5LCB0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgdGhpcy5taWxsaXNlY29uZCk7XHJcbiAgICAgICAgICAgIHRoaXMueWVhciA9IHRlbXBEYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgIHRoaXMubW9udGggPSB0ZW1wRGF0ZS5nZXRVVENNb250aCgpO1xyXG4gICAgICAgICAgICB0aGlzLmRheSA9IHRlbXBEYXRlLmdldFVUQ0RheSgpO1xyXG4gICAgICAgICAgICB0aGlzLmhvdXIgPSB0ZW1wRGF0ZS5nZXRVVENIb3VycygpO1xyXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZSA9IHRlbXBEYXRlLmdldFVUQ01pbnV0ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSB0ZW1wRGF0ZS5nZXRVVENTZWNvbmRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMubWlsbGlzZWNvbmQgPSB0ZW1wRGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0b1N0cmluZyhlbmNvZGluZyA9IFwiaXNvXCIpIHtcclxuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IFwiaXNvXCIpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0QXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLnllYXIsIDQpKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLm1vbnRoLCAyKSk7XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2gocHZ1dGlscy5wYWROdW1iZXIodGhpcy5kYXksIDIpKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLmhvdXIsIDIpKTtcclxuICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaChwdnV0aWxzLnBhZE51bWJlcih0aGlzLm1pbnV0ZSwgMikpO1xyXG4gICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKHB2dXRpbHMucGFkTnVtYmVyKHRoaXMuc2Vjb25kLCAyKSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1pbGxpc2Vjb25kICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKFwiLlwiKTtcclxuICAgICAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2gocHZ1dGlscy5wYWROdW1iZXIodGhpcy5taWxsaXNlY29uZCwgMykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2goXCJaXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0QXJyYXkuam9pbihcIlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKGVuY29kaW5nKTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdXBlci50b0pTT04oKSxcclxuICAgICAgICAgICAgbWlsbGlzZWNvbmQ6IHRoaXMubWlsbGlzZWNvbmQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5fYSQ1ID0gR2VuZXJhbGl6ZWRUaW1lO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkdlbmVyYWxpemVkVGltZSA9IF9hJDU7XHJcbn0pKCk7XHJcbkdlbmVyYWxpemVkVGltZS5OQU1FID0gXCJHZW5lcmFsaXplZFRpbWVcIjtcblxudmFyIF9hJDQ7XHJcbmNsYXNzIERBVEUgZXh0ZW5kcyBVdGY4U3RyaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDMxO1xyXG4gICAgfVxyXG59XHJcbl9hJDQgPSBEQVRFO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkRBVEUgPSBfYSQ0O1xyXG59KSgpO1xyXG5EQVRFLk5BTUUgPSBcIkRBVEVcIjtcblxudmFyIF9hJDM7XHJcbmNsYXNzIFRpbWVPZkRheSBleHRlbmRzIFV0ZjhTdHJpbmcge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMzI7XHJcbiAgICB9XHJcbn1cclxuX2EkMyA9IFRpbWVPZkRheTtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5UaW1lT2ZEYXkgPSBfYSQzO1xyXG59KSgpO1xyXG5UaW1lT2ZEYXkuTkFNRSA9IFwiVGltZU9mRGF5XCI7XG5cbnZhciBfYSQyO1xyXG5jbGFzcyBEYXRlVGltZSBleHRlbmRzIFV0ZjhTdHJpbmcge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XHJcbiAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ0NsYXNzID0gMTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnTnVtYmVyID0gMzM7XHJcbiAgICB9XHJcbn1cclxuX2EkMiA9IERhdGVUaW1lO1xyXG4oKCkgPT4ge1xyXG4gICAgdHlwZVN0b3JlLkRhdGVUaW1lID0gX2EkMjtcclxufSkoKTtcclxuRGF0ZVRpbWUuTkFNRSA9IFwiRGF0ZVRpbWVcIjtcblxudmFyIF9hJDE7XHJcbmNsYXNzIER1cmF0aW9uIGV4dGVuZHMgVXRmOFN0cmluZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcclxuICAgICAgICBzdXBlcihwYXJhbWV0ZXJzKTtcclxuICAgICAgICB0aGlzLmlkQmxvY2sudGFnQ2xhc3MgPSAxO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdOdW1iZXIgPSAzNDtcclxuICAgIH1cclxufVxyXG5fYSQxID0gRHVyYXRpb247XHJcbigoKSA9PiB7XHJcbiAgICB0eXBlU3RvcmUuRHVyYXRpb24gPSBfYSQxO1xyXG59KSgpO1xyXG5EdXJhdGlvbi5OQU1FID0gXCJEdXJhdGlvblwiO1xuXG52YXIgX2E7XHJcbmNsYXNzIFRJTUUgZXh0ZW5kcyBVdGY4U3RyaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMuaWRCbG9jay50YWdDbGFzcyA9IDE7XHJcbiAgICAgICAgdGhpcy5pZEJsb2NrLnRhZ051bWJlciA9IDE0O1xyXG4gICAgfVxyXG59XHJcbl9hID0gVElNRTtcclxuKCgpID0+IHtcclxuICAgIHR5cGVTdG9yZS5USU1FID0gX2E7XHJcbn0pKCk7XHJcblRJTUUuTkFNRSA9IFwiVElNRVwiO1xuXG5jbGFzcyBBbnkge1xyXG4gICAgY29uc3RydWN0b3IoeyBuYW1lID0gRU1QVFlfU1RSSU5HLCBvcHRpb25hbCA9IGZhbHNlLCB9ID0ge30pIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDtcclxuICAgIH1cclxufVxuXG5jbGFzcyBDaG9pY2UgZXh0ZW5kcyBBbnkge1xyXG4gICAgY29uc3RydWN0b3IoeyB2YWx1ZSA9IFtdLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBSZXBlYXRlZCBleHRlbmRzIEFueSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IHZhbHVlID0gbmV3IEFueSgpLCBsb2NhbCA9IGZhbHNlLCAuLi5wYXJhbWV0ZXJzIH0gPSB7fSkge1xyXG4gICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWw7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUmF3RGF0YSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih7IGRhdGEgPSBFTVBUWV9WSUVXIH0gPSB7fSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVZpZXcgPSBwdnRzdXRpbHMuQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShkYXRhKTtcclxuICAgIH1cclxuICAgIGdldCBkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFWaWV3LnNsaWNlKCkuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc2V0IGRhdGEodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZnJvbUJFUihpbnB1dEJ1ZmZlciwgaW5wdXRPZmZzZXQsIGlucHV0TGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgZW5kTGVuZ3RoID0gaW5wdXRPZmZzZXQgKyBpbnB1dExlbmd0aDtcclxuICAgICAgICB0aGlzLmRhdGFWaWV3ID0gcHZ0c3V0aWxzLkJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoaW5wdXRCdWZmZXIpLnN1YmFycmF5KGlucHV0T2Zmc2V0LCBlbmRMZW5ndGgpO1xyXG4gICAgICAgIHJldHVybiBlbmRMZW5ndGg7XHJcbiAgICB9XHJcbiAgICB0b0JFUihzaXplT25seSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFWaWV3LnNsaWNlKCkuYnVmZmVyO1xyXG4gICAgfVxyXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVTY2hlbWEocm9vdCwgaW5wdXREYXRhLCBpbnB1dFNjaGVtYSkge1xyXG4gICAgaWYgKGlucHV0U2NoZW1hIGluc3RhbmNlb2YgQ2hvaWNlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbnB1dFNjaGVtYS52YWx1ZS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJlU2NoZW1hKHJvb3QsIGlucHV0RGF0YSwgaW5wdXRTY2hlbWEudmFsdWVbal0pO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnZlcmlmaWVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnN0IF9yZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogXCJXcm9uZyB2YWx1ZXMgZm9yIENob2ljZSB0eXBlXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5oYXNPd25Qcm9wZXJ0eShOQU1FKSlcclxuICAgICAgICAgICAgICAgIF9yZXN1bHQubmFtZSA9IGlucHV0U2NoZW1hLm5hbWU7XHJcbiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYSBpbnN0YW5jZW9mIEFueSkge1xyXG4gICAgICAgIGlmIChpbnB1dFNjaGVtYS5oYXNPd25Qcm9wZXJ0eShOQU1FKSlcclxuICAgICAgICAgICAgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXSA9IGlucHV0RGF0YTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgocm9vdCBpbnN0YW5jZW9mIE9iamVjdCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3Jvbmcgcm9vdCBvYmplY3RcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgoaW5wdXREYXRhIGluc3RhbmNlb2YgT2JqZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBkYXRhXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoKGlucHV0U2NoZW1hIGluc3RhbmNlb2YgT2JqZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgoSURfQkxPQ0sgaW4gaW5wdXRTY2hlbWEpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKChGUk9NX0JFUiBpbiBpbnB1dFNjaGVtYS5pZEJsb2NrKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICgoVE9fQkVSIGluIGlucHV0U2NoZW1hLmlkQmxvY2spID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZW5jb2RlZElkID0gaW5wdXRTY2hlbWEuaWRCbG9jay50b0JFUihmYWxzZSk7XHJcbiAgICBpZiAoZW5jb2RlZElkLmJ5dGVMZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJFcnJvciBlbmNvZGluZyBpZEJsb2NrIGZvciBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGRlY29kZWRPZmZzZXQgPSBpbnB1dFNjaGVtYS5pZEJsb2NrLmZyb21CRVIoZW5jb2RlZElkLCAwLCBlbmNvZGVkSWQuYnl0ZUxlbmd0aCk7XHJcbiAgICBpZiAoZGVjb2RlZE9mZnNldCA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJFcnJvciBkZWNvZGluZyBpZEJsb2NrIGZvciBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLmhhc093blByb3BlcnR5KFRBR19DTEFTUykgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEuaWRCbG9jay50YWdDbGFzcyAhPT0gaW5wdXREYXRhLmlkQmxvY2sudGFnQ2xhc3MpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEuaWRCbG9jay5oYXNPd25Qcm9wZXJ0eShUQUdfTlVNQkVSKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDogeyBlcnJvcjogXCJXcm9uZyBBU04uMSBzY2hlbWFcIiB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLnRhZ051bWJlciAhPT0gaW5wdXREYXRhLmlkQmxvY2sudGFnTnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0U2NoZW1hLmlkQmxvY2suaGFzT3duUHJvcGVydHkoSVNfQ09OU1RSVUNURUQpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYVwiIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGlucHV0U2NoZW1hLmlkQmxvY2suaXNDb25zdHJ1Y3RlZCAhPT0gaW5wdXREYXRhLmlkQmxvY2suaXNDb25zdHJ1Y3RlZCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICghKElTX0hFWF9PTkxZIGluIGlucHV0U2NoZW1hLmlkQmxvY2spKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEuaWRCbG9jay5pc0hleE9ubHkgIT09IGlucHV0RGF0YS5pZEJsb2NrLmlzSGV4T25seSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmIChpbnB1dFNjaGVtYS5pZEJsb2NrLmlzSGV4T25seSkge1xyXG4gICAgICAgIGlmICgoVkFMVUVfSEVYX1ZJRVcgaW4gaW5wdXRTY2hlbWEuaWRCbG9jaykgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHsgZXJyb3I6IFwiV3JvbmcgQVNOLjEgc2NoZW1hXCIgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzY2hlbWFWaWV3ID0gaW5wdXRTY2hlbWEuaWRCbG9jay52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgY29uc3QgYXNuMVZpZXcgPSBpbnB1dERhdGEuaWRCbG9jay52YWx1ZUhleFZpZXc7XHJcbiAgICAgICAgaWYgKHNjaGVtYVZpZXcubGVuZ3RoICE9PSBhc24xVmlldy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYVZpZXcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYVZpZXdbaV0gIT09IGFzbjFWaWV3WzFdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgIGlucHV0U2NoZW1hLm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csIEVNUFRZX1NUUklORyk7XHJcbiAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpXHJcbiAgICAgICAgICAgIHJvb3RbaW5wdXRTY2hlbWEubmFtZV0gPSBpbnB1dERhdGE7XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEgaW5zdGFuY2VvZiB0eXBlU3RvcmUuQ29uc3RydWN0ZWQpIHtcclxuICAgICAgICBsZXQgYWRtaXNzaW9uID0gMDtcclxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlc3VsdDoge1xyXG4gICAgICAgICAgICAgICAgZXJyb3I6IFwiVW5rbm93biBlcnJvclwiLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKG1heExlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0gaW5zdGFuY2VvZiBSZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoID0gaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoID09PSAwKSAmJlxyXG4gICAgICAgICAgICAoaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZS5sZW5ndGggIT09IDApKSB7XHJcbiAgICAgICAgICAgIGxldCBfb3B0aW9uYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICBfb3B0aW9uYWwgPSBfb3B0aW9uYWwgJiYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbaV0ub3B0aW9uYWwgfHwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAoX29wdGlvbmFsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRTY2hlbWEubmFtZSA9IGlucHV0U2NoZW1hLm5hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgRU1QVFlfU1RSSU5HKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb290W2lucHV0U2NoZW1hLm5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJvb3QuZXJyb3IgPSBcIkluY29uc2lzdGVudCBvYmplY3QgbGVuZ3RoXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoKGkgLSBhZG1pc3Npb24pID49IGlucHV0RGF0YS52YWx1ZUJsb2NrLnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbaV0ub3B0aW9uYWwgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3Jlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJvb3RcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZXJyb3IgPSBcIkluY29uc2lzdGVudCBsZW5ndGggYmV0d2VlbiBBU04uMSBkYXRhIGFuZCBzY2hlbWFcIjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvb3RbaW5wdXRTY2hlbWEubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0Lm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0gaW5zdGFuY2VvZiBSZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVTY2hlbWEocm9vdCwgaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWVbaV0sIGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0udmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmVyaWZpZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm9wdGlvbmFsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaXNzaW9uKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChOQU1FIGluIGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0pICYmIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm5hbWUubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5Um9vdCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKExPQ0FMIGluIGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbMF0pICYmIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLmxvY2FsKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Um9vdCA9IGlucHV0RGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlSb290ID0gcm9vdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcnJheVJvb3RbaW5wdXRTY2hlbWEudmFsdWVCbG9jay52YWx1ZVswXS5uYW1lXSA9PT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Um9vdFtpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm5hbWVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Um9vdFtpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlWzBdLm5hbWVdLnB1c2goaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWVbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVTY2hlbWEocm9vdCwgaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWVbaSAtIGFkbWlzc2lvbl0sIGlucHV0U2NoZW1hLnZhbHVlQmxvY2sudmFsdWVbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmVyaWZpZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlW2ldLm9wdGlvbmFsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaXNzaW9uKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC52ZXJpZmllZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgX3Jlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAoaW5wdXRTY2hlbWEubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRTY2hlbWEubmFtZSA9IGlucHV0U2NoZW1hLm5hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgRU1QVFlfU1RSSU5HKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvb3RbaW5wdXRTY2hlbWEubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5uYW1lID0gaW5wdXRTY2hlbWEubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gX3Jlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDogcm9vdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoaW5wdXRTY2hlbWEucHJpbWl0aXZlU2NoZW1hICYmXHJcbiAgICAgICAgKFZBTFVFX0hFWF9WSUVXIGluIGlucHV0RGF0YS52YWx1ZUJsb2NrKSkge1xyXG4gICAgICAgIGNvbnN0IGFzbjEgPSBsb2NhbEZyb21CRVIoaW5wdXREYXRhLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3KTtcclxuICAgICAgICBpZiAoYXNuMS5vZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IF9yZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGFzbjEucmVzdWx0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChpbnB1dFNjaGVtYS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dFNjaGVtYS5uYW1lID0gaW5wdXRTY2hlbWEubmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCBFTVBUWV9TVFJJTkcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0U2NoZW1hLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm9vdFtpbnB1dFNjaGVtYS5uYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0Lm5hbWUgPSBpbnB1dFNjaGVtYS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBfcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tcGFyZVNjaGVtYShyb290LCBhc24xLnJlc3VsdCwgaW5wdXRTY2hlbWEucHJpbWl0aXZlU2NoZW1hKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdmVyaWZpZWQ6IHRydWUsXHJcbiAgICAgICAgcmVzdWx0OiByb290XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIHZlcmlmeVNjaGVtYShpbnB1dEJ1ZmZlciwgaW5wdXRTY2hlbWEpIHtcclxuICAgIGlmICgoaW5wdXRTY2hlbWEgaW5zdGFuY2VvZiBPYmplY3QpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVzdWx0OiB7IGVycm9yOiBcIldyb25nIEFTTi4xIHNjaGVtYSB0eXBlXCIgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBhc24xID0gbG9jYWxGcm9tQkVSKHB2dHN1dGlscy5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGlucHV0QnVmZmVyKSk7XHJcbiAgICBpZiAoYXNuMS5vZmZzZXQgPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGFzbjEucmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb21wYXJlU2NoZW1hKGFzbjEucmVzdWx0LCBhc24xLnJlc3VsdCwgaW5wdXRTY2hlbWEpO1xyXG59XG5cbmV4cG9ydCB7IEFueSwgQmFzZUJsb2NrLCBCYXNlU3RyaW5nQmxvY2ssIEJpdFN0cmluZywgQm1wU3RyaW5nLCBCb29sZWFuLCBDaGFyYWN0ZXJTdHJpbmcsIENob2ljZSwgQ29uc3RydWN0ZWQsIERBVEUsIERhdGVUaW1lLCBEdXJhdGlvbiwgRW5kT2ZDb250ZW50LCBFbnVtZXJhdGVkLCBHZW5lcmFsU3RyaW5nLCBHZW5lcmFsaXplZFRpbWUsIEdyYXBoaWNTdHJpbmcsIEhleEJsb2NrLCBJQTVTdHJpbmcsIEludGVnZXIsIE51bGwsIE51bWVyaWNTdHJpbmcsIE9iamVjdElkZW50aWZpZXIsIE9jdGV0U3RyaW5nLCBQcmltaXRpdmUsIFByaW50YWJsZVN0cmluZywgUmF3RGF0YSwgUmVsYXRpdmVPYmplY3RJZGVudGlmaWVyLCBSZXBlYXRlZCwgU2VxdWVuY2UsIFNldCwgVElNRSwgVGVsZXRleFN0cmluZywgVGltZU9mRGF5LCBVVENUaW1lLCBVbml2ZXJzYWxTdHJpbmcsIFV0ZjhTdHJpbmcsIFZhbHVlQmxvY2ssIFZpZGVvdGV4U3RyaW5nLCBWaWV3V3JpdGVyLCBWaXNpYmxlU3RyaW5nLCBjb21wYXJlU2NoZW1hLCBmcm9tQkVSLCB2ZXJpZnlTY2hlbWEgfTtcbiIsICJleHBvcnQgdmFyIEFzblR5cGVUeXBlcztcbihmdW5jdGlvbiAoQXNuVHlwZVR5cGVzKSB7XG4gICAgQXNuVHlwZVR5cGVzW0FzblR5cGVUeXBlc1tcIlNlcXVlbmNlXCJdID0gMF0gPSBcIlNlcXVlbmNlXCI7XG4gICAgQXNuVHlwZVR5cGVzW0FzblR5cGVUeXBlc1tcIlNldFwiXSA9IDFdID0gXCJTZXRcIjtcbiAgICBBc25UeXBlVHlwZXNbQXNuVHlwZVR5cGVzW1wiQ2hvaWNlXCJdID0gMl0gPSBcIkNob2ljZVwiO1xufSkoQXNuVHlwZVR5cGVzIHx8IChBc25UeXBlVHlwZXMgPSB7fSkpO1xuZXhwb3J0IHZhciBBc25Qcm9wVHlwZXM7XG4oZnVuY3Rpb24gKEFzblByb3BUeXBlcykge1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJBbnlcIl0gPSAxXSA9IFwiQW55XCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkJvb2xlYW5cIl0gPSAyXSA9IFwiQm9vbGVhblwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJPY3RldFN0cmluZ1wiXSA9IDNdID0gXCJPY3RldFN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJCaXRTdHJpbmdcIl0gPSA0XSA9IFwiQml0U3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkludGVnZXJcIl0gPSA1XSA9IFwiSW50ZWdlclwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJFbnVtZXJhdGVkXCJdID0gNl0gPSBcIkVudW1lcmF0ZWRcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiT2JqZWN0SWRlbnRpZmllclwiXSA9IDddID0gXCJPYmplY3RJZGVudGlmaWVyXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIlV0ZjhTdHJpbmdcIl0gPSA4XSA9IFwiVXRmOFN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJCbXBTdHJpbmdcIl0gPSA5XSA9IFwiQm1wU3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIlVuaXZlcnNhbFN0cmluZ1wiXSA9IDEwXSA9IFwiVW5pdmVyc2FsU3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIk51bWVyaWNTdHJpbmdcIl0gPSAxMV0gPSBcIk51bWVyaWNTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiUHJpbnRhYmxlU3RyaW5nXCJdID0gMTJdID0gXCJQcmludGFibGVTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVGVsZXRleFN0cmluZ1wiXSA9IDEzXSA9IFwiVGVsZXRleFN0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJWaWRlb3RleFN0cmluZ1wiXSA9IDE0XSA9IFwiVmlkZW90ZXhTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiSUE1U3RyaW5nXCJdID0gMTVdID0gXCJJQTVTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiR3JhcGhpY1N0cmluZ1wiXSA9IDE2XSA9IFwiR3JhcGhpY1N0cmluZ1wiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJWaXNpYmxlU3RyaW5nXCJdID0gMTddID0gXCJWaXNpYmxlU3RyaW5nXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkdlbmVyYWxTdHJpbmdcIl0gPSAxOF0gPSBcIkdlbmVyYWxTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiQ2hhcmFjdGVyU3RyaW5nXCJdID0gMTldID0gXCJDaGFyYWN0ZXJTdHJpbmdcIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVVRDVGltZVwiXSA9IDIwXSA9IFwiVVRDVGltZVwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJHZW5lcmFsaXplZFRpbWVcIl0gPSAyMV0gPSBcIkdlbmVyYWxpemVkVGltZVwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJEQVRFXCJdID0gMjJdID0gXCJEQVRFXCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIlRpbWVPZkRheVwiXSA9IDIzXSA9IFwiVGltZU9mRGF5XCI7XG4gICAgQXNuUHJvcFR5cGVzW0FzblByb3BUeXBlc1tcIkRhdGVUaW1lXCJdID0gMjRdID0gXCJEYXRlVGltZVwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJEdXJhdGlvblwiXSA9IDI1XSA9IFwiRHVyYXRpb25cIjtcbiAgICBBc25Qcm9wVHlwZXNbQXNuUHJvcFR5cGVzW1wiVElNRVwiXSA9IDI2XSA9IFwiVElNRVwiO1xuICAgIEFzblByb3BUeXBlc1tBc25Qcm9wVHlwZXNbXCJOdWxsXCJdID0gMjddID0gXCJOdWxsXCI7XG59KShBc25Qcm9wVHlwZXMgfHwgKEFzblByb3BUeXBlcyA9IHt9KSk7XG4iLCAiaW1wb3J0ICogYXMgYXNuMWpzIGZyb20gXCJhc24xanNcIjtcbmltcG9ydCB7IEFzblByb3BUeXBlcyB9IGZyb20gXCIuL2VudW1zXCI7XG5leHBvcnQgY29uc3QgQXNuQW55Q29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBhc24xanMuTnVsbCA/IG51bGwgOiB2YWx1ZS52YWx1ZUJlZm9yZURlY29kZVZpZXcsXG4gICAgdG9BU046ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgYXNuMWpzLk51bGwoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2hlbWEgPSBhc24xanMuZnJvbUJFUih2YWx1ZSk7XG4gICAgICAgIGlmIChzY2hlbWEucmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2NoZW1hLnJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjaGVtYS5yZXN1bHQ7XG4gICAgfSxcbn07XG5leHBvcnQgY29uc3QgQXNuSW50ZWdlckNvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3LmJ5dGVMZW5ndGggPj0gNFxuICAgICAgICA/IHZhbHVlLnZhbHVlQmxvY2sudG9TdHJpbmcoKVxuICAgICAgICA6IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVEZWMsXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5JbnRlZ2VyKHsgdmFsdWU6ICt2YWx1ZSB9KSxcbn07XG5leHBvcnQgY29uc3QgQXNuRW51bWVyYXRlZENvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVEZWMsXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IGFzbjFqcy5FbnVtZXJhdGVkKHsgdmFsdWUgfSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3LFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuSW50ZWdlcih7IHZhbHVlSGV4OiB2YWx1ZSB9KSxcbn07XG5leHBvcnQgY29uc3QgQXNuSW50ZWdlckJpZ0ludENvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnRvQmlnSW50KCksXG4gICAgdG9BU046ICh2YWx1ZSkgPT4gYXNuMWpzLkludGVnZXIuZnJvbUJpZ0ludCh2YWx1ZSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbkJpdFN0cmluZ0NvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXhWaWV3LFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuQml0U3RyaW5nKHsgdmFsdWVIZXg6IHZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25PYmplY3RJZGVudGlmaWVyQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay50b1N0cmluZygpLFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuT2JqZWN0SWRlbnRpZmllcih7IHZhbHVlIH0pLFxufTtcbmV4cG9ydCBjb25zdCBBc25Cb29sZWFuQ29udmVydGVyID0ge1xuICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZSxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgYXNuMWpzLkJvb2xlYW4oeyB2YWx1ZSB9KSxcbn07XG5leHBvcnQgY29uc3QgQXNuT2N0ZXRTdHJpbmdDb252ZXJ0ZXIgPSB7XG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB2YWx1ZS52YWx1ZUJsb2NrLnZhbHVlSGV4VmlldyxcbiAgICB0b0FTTjogKHZhbHVlKSA9PiBuZXcgYXNuMWpzLk9jdGV0U3RyaW5nKHsgdmFsdWVIZXg6IHZhbHVlIH0pLFxufTtcbmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihBc24xVHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZyb21BU046ICh2YWx1ZSkgPT4gdmFsdWUudmFsdWVCbG9jay52YWx1ZSxcbiAgICAgICAgdG9BU046ICh2YWx1ZSkgPT4gbmV3IEFzbjFUeXBlKHsgdmFsdWUgfSksXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBBc25VdGY4U3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5VdGY4U3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25CbXBTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLkJtcFN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuVW5pdmVyc2FsU3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5Vbml2ZXJzYWxTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzbk51bWVyaWNTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLk51bWVyaWNTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzblByaW50YWJsZVN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuUHJpbnRhYmxlU3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25UZWxldGV4U3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5UZWxldGV4U3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25WaWRlb3RleFN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuVmlkZW90ZXhTdHJpbmcpO1xuZXhwb3J0IGNvbnN0IEFzbklBNVN0cmluZ0NvbnZlcnRlciA9IGNyZWF0ZVN0cmluZ0NvbnZlcnRlcihhc24xanMuSUE1U3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25HcmFwaGljU3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5HcmFwaGljU3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25WaXNpYmxlU3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5WaXNpYmxlU3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25HZW5lcmFsU3RyaW5nQ29udmVydGVyID0gY3JlYXRlU3RyaW5nQ29udmVydGVyKGFzbjFqcy5HZW5lcmFsU3RyaW5nKTtcbmV4cG9ydCBjb25zdCBBc25DaGFyYWN0ZXJTdHJpbmdDb252ZXJ0ZXIgPSBjcmVhdGVTdHJpbmdDb252ZXJ0ZXIoYXNuMWpzLkNoYXJhY3RlclN0cmluZyk7XG5leHBvcnQgY29uc3QgQXNuVVRDVGltZUNvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnRvRGF0ZSgpLFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuVVRDVGltZSh7IHZhbHVlRGF0ZTogdmFsdWUgfSksXG59O1xuZXhwb3J0IGNvbnN0IEFzbkdlbmVyYWxpemVkVGltZUNvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHZhbHVlLnRvRGF0ZSgpLFxuICAgIHRvQVNOOiAodmFsdWUpID0+IG5ldyBhc24xanMuR2VuZXJhbGl6ZWRUaW1lKHsgdmFsdWVEYXRlOiB2YWx1ZSB9KSxcbn07XG5leHBvcnQgY29uc3QgQXNuTnVsbENvbnZlcnRlciA9IHtcbiAgICBmcm9tQVNOOiAoKSA9PiBudWxsLFxuICAgIHRvQVNOOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgYXNuMWpzLk51bGwoKTtcbiAgICB9LFxufTtcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Q29udmVydGVyKHR5cGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuQW55OlxuICAgICAgICAgICAgcmV0dXJuIEFzbkFueUNvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuQml0U3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkJpdFN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuQm1wU3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkJtcFN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuQm9vbGVhbjpcbiAgICAgICAgICAgIHJldHVybiBBc25Cb29sZWFuQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5DaGFyYWN0ZXJTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuQ2hhcmFjdGVyU3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5FbnVtZXJhdGVkOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkVudW1lcmF0ZWRDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLkdlbmVyYWxTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuR2VuZXJhbFN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuR2VuZXJhbGl6ZWRUaW1lOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkdlbmVyYWxpemVkVGltZUNvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuR3JhcGhpY1N0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25HcmFwaGljU3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5JQTVTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuSUE1U3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5JbnRlZ2VyOlxuICAgICAgICAgICAgcmV0dXJuIEFzbkludGVnZXJDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLk51bGw6XG4gICAgICAgICAgICByZXR1cm4gQXNuTnVsbENvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuTnVtZXJpY1N0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25OdW1lcmljU3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5PYmplY3RJZGVudGlmaWVyOlxuICAgICAgICAgICAgcmV0dXJuIEFzbk9iamVjdElkZW50aWZpZXJDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLk9jdGV0U3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzbk9jdGV0U3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5QcmludGFibGVTdHJpbmc6XG4gICAgICAgICAgICByZXR1cm4gQXNuUHJpbnRhYmxlU3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5UZWxldGV4U3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzblRlbGV0ZXhTdHJpbmdDb252ZXJ0ZXI7XG4gICAgICAgIGNhc2UgQXNuUHJvcFR5cGVzLlVUQ1RpbWU6XG4gICAgICAgICAgICByZXR1cm4gQXNuVVRDVGltZUNvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuVW5pdmVyc2FsU3RyaW5nOlxuICAgICAgICAgICAgcmV0dXJuIEFzblVuaXZlcnNhbFN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuVXRmOFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25VdGY4U3RyaW5nQ29udmVydGVyO1xuICAgICAgICBjYXNlIEFzblByb3BUeXBlcy5WaWRlb3RleFN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25WaWRlb3RleFN0cmluZ0NvbnZlcnRlcjtcbiAgICAgICAgY2FzZSBBc25Qcm9wVHlwZXMuVmlzaWJsZVN0cmluZzpcbiAgICAgICAgICAgIHJldHVybiBBc25WaXNpYmxlU3RyaW5nQ29udmVydGVyO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCAqIGFzIGFzbjFqcyBmcm9tIFwiYXNuMWpzXCI7XG5pbXBvcnQgeyBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIgfSBmcm9tIFwicHZ0c3V0aWxzXCI7XG5leHBvcnQgY2xhc3MgQml0U3RyaW5nIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMsIHVudXNlZEJpdHMgPSAwKSB7XG4gICAgICAgIHRoaXMudW51c2VkQml0cyA9IDA7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tTnVtYmVyKHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChCdWZmZXJTb3VyY2VDb252ZXJ0ZXIuaXNCdWZmZXJTb3VyY2UocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW51c2VkQml0cyA9IHVudXNlZEJpdHM7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCJVbnN1cHBvcnRlZCB0eXBlIG9mICdwYXJhbXMnIGFyZ3VtZW50IGZvciBCaXRTdHJpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnJvbUFTTihhc24pIHtcbiAgICAgICAgaWYgKCEoYXNuIGluc3RhbmNlb2YgYXNuMWpzLkJpdFN0cmluZykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCAnYXNuJyBpcyBub3QgaW5zdGFuY2Ugb2YgQVNOLjEgQml0U3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudW51c2VkQml0cyA9IGFzbi52YWx1ZUJsb2NrLnVudXNlZEJpdHM7XG4gICAgICAgIHRoaXMudmFsdWUgPSBhc24udmFsdWVCbG9jay52YWx1ZUhleDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvQVNOKCkge1xuICAgICAgICByZXR1cm4gbmV3IGFzbjFqcy5CaXRTdHJpbmcoeyB1bnVzZWRCaXRzOiB0aGlzLnVudXNlZEJpdHMsIHZhbHVlSGV4OiB0aGlzLnZhbHVlIH0pO1xuICAgIH1cbiAgICB0b1NjaGVtYShuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgYXNuMWpzLkJpdFN0cmluZyh7IG5hbWUgfSk7XG4gICAgfVxuICAgIHRvTnVtYmVyKCkge1xuICAgICAgICBsZXQgcmVzID0gXCJcIjtcbiAgICAgICAgY29uc3QgdWludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy52YWx1ZSk7XG4gICAgICAgIGZvciAoY29uc3Qgb2N0ZXQgb2YgdWludEFycmF5KSB7XG4gICAgICAgICAgICByZXMgKz0gb2N0ZXQudG9TdHJpbmcoMikucGFkU3RhcnQoOCwgXCIwXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IHJlcy5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKTtcbiAgICAgICAgaWYgKHRoaXMudW51c2VkQml0cykge1xuICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKHRoaXMudW51c2VkQml0cykucGFkU3RhcnQodGhpcy51bnVzZWRCaXRzLCBcIjBcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHJlcywgMik7XG4gICAgfVxuICAgIGZyb21OdW1iZXIodmFsdWUpIHtcbiAgICAgICAgbGV0IGJpdHMgPSB2YWx1ZS50b1N0cmluZygyKTtcbiAgICAgICAgY29uc3Qgb2N0ZXRTaXplID0gKGJpdHMubGVuZ3RoICsgNykgPj4gMztcbiAgICAgICAgdGhpcy51bnVzZWRCaXRzID0gKG9jdGV0U2l6ZSA8PCAzKSAtIGJpdHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBvY3RldHMgPSBuZXcgVWludDhBcnJheShvY3RldFNpemUpO1xuICAgICAgICBiaXRzID0gYml0cy5wYWRTdGFydChvY3RldFNpemUgPDwgMywgXCIwXCIpLnNwbGl0KFwiXCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBvY3RldFNpemUpIHtcbiAgICAgICAgICAgIG9jdGV0c1tpbmRleF0gPSBwYXJzZUludChiaXRzLnNsaWNlKGluZGV4IDw8IDMsIChpbmRleCA8PCAzKSArIDgpLCAyKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IG9jdGV0cy5idWZmZXI7XG4gICAgfVxufVxuIiwgImltcG9ydCAqIGFzIGFzbjFqcyBmcm9tIFwiYXNuMWpzXCI7XG5pbXBvcnQgeyBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIgfSBmcm9tIFwicHZ0c3V0aWxzXCI7XG5leHBvcnQgY2xhc3MgT2N0ZXRTdHJpbmcge1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHBhcmFtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChCdWZmZXJTb3VyY2VDb252ZXJ0ZXIuaXNCdWZmZXJTb3VyY2UocGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihwYXJhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhcmFtKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkocGFyYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGJ5dGVMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgYnl0ZU9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGZyb21BU04oYXNuKSB7XG4gICAgICAgIGlmICghKGFzbiBpbnN0YW5jZW9mIGFzbjFqcy5PY3RldFN0cmluZykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCAnYXNuJyBpcyBub3QgaW5zdGFuY2Ugb2YgQVNOLjEgT2N0ZXRTdHJpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXIgPSBhc24udmFsdWVCbG9jay52YWx1ZUhleDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvQVNOKCkge1xuICAgICAgICByZXR1cm4gbmV3IGFzbjFqcy5PY3RldFN0cmluZyh7IHZhbHVlSGV4OiB0aGlzLmJ1ZmZlciB9KTtcbiAgICB9XG4gICAgdG9TY2hlbWEobmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IGFzbjFqcy5PY3RldFN0cmluZyh7IG5hbWUgfSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCAqIGZyb20gXCIuL2JpdF9zdHJpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29jdGV0X3N0cmluZ1wiO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBpc0NvbnZlcnRpYmxlKHRhcmdldCkge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICBpZiAodGFyZ2V0LnByb3RvdHlwZS50b0FTTiAmJiB0YXJnZXQucHJvdG90eXBlLmZyb21BU04pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzQ29udmVydGlibGUodGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAhISh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIiAmJiBcInRvQVNOXCIgaW4gdGFyZ2V0ICYmIFwiZnJvbUFTTlwiIGluIHRhcmdldCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZU9mQXJyYXkodGFyZ2V0KSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KTtcbiAgICAgICAgaWYgKCgoX2EgPSBwcm90byA9PT0gbnVsbCB8fCBwcm90byA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvdG8ucHJvdG90eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29uc3RydWN0b3IpID09PSBBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVHlwZU9mQXJyYXkocHJvdG8pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUVxdWFsKGJ5dGVzMSwgYnl0ZXMyKSB7XG4gICAgaWYgKCEoYnl0ZXMxICYmIGJ5dGVzMikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYnl0ZXMxLmJ5dGVMZW5ndGggIT09IGJ5dGVzMi5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYjEgPSBuZXcgVWludDhBcnJheShieXRlczEpO1xuICAgIGNvbnN0IGIyID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzMS5ieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGIxW2ldICE9PSBiMltpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCAqIGFzIGFzbjFqcyBmcm9tIFwiYXNuMWpzXCI7XG5pbXBvcnQgeyBBc25Qcm9wVHlwZXMsIEFzblR5cGVUeXBlcyB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBpc0NvbnZlcnRpYmxlIH0gZnJvbSBcIi4vaGVscGVyXCI7XG5leHBvcnQgY2xhc3MgQXNuU2NoZW1hU3RvcmFnZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBuZXcgV2Vha01hcCgpO1xuICAgIH1cbiAgICBoYXModGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmhhcyh0YXJnZXQpO1xuICAgIH1cbiAgICBnZXQodGFyZ2V0LCBjaGVja1NjaGVtYSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuaXRlbXMuZ2V0KHRhcmdldCk7XG4gICAgICAgIGlmICghc2NoZW1hKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBnZXQgc2NoZW1hIGZvciAnJHt0YXJnZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWV9JyB0YXJnZXRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tTY2hlbWEgJiYgIXNjaGVtYS5zY2hlbWEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZW1hICcke3RhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZX0nIGRvZXNuJ3QgY29udGFpbiBBU04uMSBzY2hlbWEuIENhbGwgJ0FzblNjaGVtYVN0b3JhZ2UuY2FjaGUnLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxuICAgIGNhY2hlKHRhcmdldCkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmdldCh0YXJnZXQpO1xuICAgICAgICBpZiAoIXNjaGVtYS5zY2hlbWEpIHtcbiAgICAgICAgICAgIHNjaGVtYS5zY2hlbWEgPSB0aGlzLmNyZWF0ZSh0YXJnZXQsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZURlZmF1bHQodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgICAgICAgIHR5cGU6IEFzblR5cGVUeXBlcy5TZXF1ZW5jZSxcbiAgICAgICAgICAgIGl0ZW1zOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFyZW50U2NoZW1hID0gdGhpcy5maW5kUGFyZW50U2NoZW1hKHRhcmdldCk7XG4gICAgICAgIGlmIChwYXJlbnRTY2hlbWEpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2NoZW1hLCBwYXJlbnRTY2hlbWEpO1xuICAgICAgICAgICAgc2NoZW1hLml0ZW1zID0gT2JqZWN0LmFzc2lnbih7fSwgc2NoZW1hLml0ZW1zLCBwYXJlbnRTY2hlbWEuaXRlbXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxuICAgIGNyZWF0ZSh0YXJnZXQsIHVzZU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuaXRlbXMuZ2V0KHRhcmdldCkgfHwgdGhpcy5jcmVhdGVEZWZhdWx0KHRhcmdldCk7XG4gICAgICAgIGNvbnN0IGFzbjFWYWx1ZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzY2hlbWEuaXRlbXNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB1c2VOYW1lcyA/IGtleSA6IFwiXCI7XG4gICAgICAgICAgICBsZXQgYXNuMUl0ZW07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChpdGVtLnR5cGUpID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgQXNuMVR5cGVOYW1lID0gQXNuUHJvcFR5cGVzW2l0ZW0udHlwZV07XG4gICAgICAgICAgICAgICAgY29uc3QgQXNuMVR5cGUgPSBhc24xanNbQXNuMVR5cGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIUFzbjFUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCBBU04xIGNsYXNzIGJ5IG5hbWUgJyR7QXNuMVR5cGVOYW1lfSdgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSBuZXcgQXNuMVR5cGUoeyBuYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNDb252ZXJ0aWJsZShpdGVtLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgaXRlbS50eXBlKCk7XG4gICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSBpbnN0YW5jZS50b1NjaGVtYShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtU2NoZW1hID0gdGhpcy5nZXQoaXRlbS50eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVNjaGVtYS50eXBlID09PSBBc25UeXBlVHlwZXMuQ2hvaWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzbjFJdGVtID0gbmV3IGFzbjFqcy5BbnkoeyBuYW1lIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSB0aGlzLmNyZWF0ZShpdGVtLnR5cGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXNuMUl0ZW0ubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSBuZXcgYXNuMWpzLkFueSh7IG5hbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcHRpb25hbCA9ICEhaXRlbS5vcHRpb25hbCB8fCBpdGVtLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGl0ZW0ucmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICBhc24xSXRlbS5uYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBDb250YWluZXIgPSBpdGVtLnJlcGVhdGVkID09PSBcInNldFwiXG4gICAgICAgICAgICAgICAgICAgID8gYXNuMWpzLlNldFxuICAgICAgICAgICAgICAgICAgICA6IGFzbjFqcy5TZXF1ZW5jZTtcbiAgICAgICAgICAgICAgICBhc24xSXRlbSA9IG5ldyBDb250YWluZXIoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGFzbjFqcy5SZXBlYXRlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYXNuMUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdGVtLmNvbnRleHQgIT09IG51bGwgJiYgaXRlbS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbXBsaWNpdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0udHlwZSA9PT0gXCJudW1iZXJcIiB8fCBpc0NvbnZlcnRpYmxlKGl0ZW0udHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lciA9IGl0ZW0ucmVwZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFzbjFqcy5Db25zdHJ1Y3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXNuMWpzLlByaW1pdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZS5wdXNoKG5ldyBDb250YWluZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzczogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyOiBpdGVtLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUoaXRlbS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVwZWF0ZWQgPSAhIWl0ZW0ucmVwZWF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSAhaXNSZXBlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5nZXQoaXRlbS50eXBlLCB0cnVlKS5zY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFzbjFJdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBcInZhbHVlQmxvY2tcIiBpbiB2YWx1ZSA/IHZhbHVlLnZhbHVlQmxvY2sudmFsdWUgOiB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZS5wdXNoKG5ldyBhc24xanMuQ29uc3RydWN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICFpc1JlcGVhdGVkID8gbmFtZSA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzczogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyOiBpdGVtLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZS5wdXNoKG5ldyBhc24xanMuQ29uc3RydWN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZEJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2xhc3M6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyOiBpdGVtLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFthc24xSXRlbV0sXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc24xSXRlbS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgICAgICAgICAgIGFzbjFWYWx1ZS5wdXNoKGFzbjFJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHNjaGVtYS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEFzblR5cGVUeXBlcy5TZXF1ZW5jZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGFzbjFqcy5TZXF1ZW5jZSh7IHZhbHVlOiBhc24xVmFsdWUsIG5hbWU6IFwiXCIgfSk7XG4gICAgICAgICAgICBjYXNlIEFzblR5cGVUeXBlcy5TZXQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBhc24xanMuU2V0KHsgdmFsdWU6IGFzbjFWYWx1ZSwgbmFtZTogXCJcIiB9KTtcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLkNob2ljZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGFzbjFqcy5DaG9pY2UoeyB2YWx1ZTogYXNuMVZhbHVlLCBuYW1lOiBcIlwiIH0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEFTTjEgdHlwZSBpbiB1c2VgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXQodGFyZ2V0LCBzY2hlbWEpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQodGFyZ2V0LCBzY2hlbWEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZmluZFBhcmVudFNjaGVtYSh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGFyZ2V0Ll9fcHJvdG9fXztcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5pdGVtcy5nZXQocGFyZW50KTtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEgfHwgdGhpcy5maW5kUGFyZW50U2NoZW1hKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEFzblNjaGVtYVN0b3JhZ2UgfSBmcm9tIFwiLi9zY2hlbWFcIjtcbmV4cG9ydCBjb25zdCBzY2hlbWFTdG9yYWdlID0gbmV3IEFzblNjaGVtYVN0b3JhZ2UoKTtcbiIsICJpbXBvcnQgKiBhcyBjb252ZXJ0ZXJzIGZyb20gXCIuL2NvbnZlcnRlcnNcIjtcbmltcG9ydCB7IEFzblR5cGVUeXBlcyB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgeyBzY2hlbWFTdG9yYWdlIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuZXhwb3J0IGNvbnN0IEFzblR5cGUgPSAob3B0aW9ucykgPT4gKHRhcmdldCkgPT4ge1xuICAgIGxldCBzY2hlbWE7XG4gICAgaWYgKCFzY2hlbWFTdG9yYWdlLmhhcyh0YXJnZXQpKSB7XG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuY3JlYXRlRGVmYXVsdCh0YXJnZXQpO1xuICAgICAgICBzY2hlbWFTdG9yYWdlLnNldCh0YXJnZXQsIHNjaGVtYSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmdldCh0YXJnZXQpO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwgb3B0aW9ucyk7XG59O1xuZXhwb3J0IGNvbnN0IEFzbkNob2ljZVR5cGUgPSAoKSA9PiBBc25UeXBlKHsgdHlwZTogQXNuVHlwZVR5cGVzLkNob2ljZSB9KTtcbmV4cG9ydCBjb25zdCBBc25TZXRUeXBlID0gKG9wdGlvbnMpID0+IEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuU2V0LCAuLi5vcHRpb25zIH0pO1xuZXhwb3J0IGNvbnN0IEFzblNlcXVlbmNlVHlwZSA9IChvcHRpb25zKSA9PiBBc25UeXBlKHsgdHlwZTogQXNuVHlwZVR5cGVzLlNlcXVlbmNlLCAuLi5vcHRpb25zIH0pO1xuZXhwb3J0IGNvbnN0IEFzblByb3AgPSAob3B0aW9ucykgPT4gKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICBsZXQgc2NoZW1hO1xuICAgIGlmICghc2NoZW1hU3RvcmFnZS5oYXModGFyZ2V0LmNvbnN0cnVjdG9yKSkge1xuICAgICAgICBzY2hlbWEgPSBzY2hlbWFTdG9yYWdlLmNyZWF0ZURlZmF1bHQodGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICAgICAgc2NoZW1hU3RvcmFnZS5zZXQodGFyZ2V0LmNvbnN0cnVjdG9yLCBzY2hlbWEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5nZXQodGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICB9XG4gICAgY29uc3QgY29weU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICBpZiAodHlwZW9mIGNvcHlPcHRpb25zLnR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWNvcHlPcHRpb25zLmNvbnZlcnRlcikge1xuICAgICAgICBjb25zdCBkZWZhdWx0Q29udmVydGVyID0gY29udmVydGVycy5kZWZhdWx0Q29udmVydGVyKG9wdGlvbnMudHlwZSk7XG4gICAgICAgIGlmICghZGVmYXVsdENvbnZlcnRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IGRlZmF1bHQgY29udmVydGVyIGZvciBwcm9wZXJ0eSAnJHtwcm9wZXJ0eUtleX0nIG9mICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29weU9wdGlvbnMuY29udmVydGVyID0gZGVmYXVsdENvbnZlcnRlcjtcbiAgICB9XG4gICAgc2NoZW1hLml0ZW1zW3Byb3BlcnR5S2V5XSA9IGNvcHlPcHRpb25zO1xufTtcbiIsICJleHBvcnQgY2xhc3MgQXNuU2NoZW1hVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnNjaGVtYXMgPSBbXTtcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hX3ZhbGlkYXRpb25cIjtcbiIsICJpbXBvcnQgKiBhcyBhc24xanMgZnJvbSBcImFzbjFqc1wiO1xuaW1wb3J0IHsgQXNuUHJvcFR5cGVzLCBBc25UeXBlVHlwZXMgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0ICogYXMgY29udmVydGVycyBmcm9tIFwiLi9jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgeyBBc25TY2hlbWFWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IGlzQ29udmVydGlibGUsIGlzVHlwZU9mQXJyYXkgfSBmcm9tIFwiLi9oZWxwZXJcIjtcbmltcG9ydCB7IHNjaGVtYVN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5leHBvcnQgY2xhc3MgQXNuUGFyc2VyIHtcbiAgICBzdGF0aWMgcGFyc2UoZGF0YSwgdGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IGFzbjFQYXJzZWQgPSBhc24xanMuZnJvbUJFUihkYXRhKTtcbiAgICAgICAgaWYgKGFzbjFQYXJzZWQucmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYXNuMVBhcnNlZC5yZXN1bHQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuZnJvbUFTTihhc24xUGFyc2VkLnJlc3VsdCwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgc3RhdGljIGZyb21BU04oYXNuMVNjaGVtYSwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0NvbnZlcnRpYmxlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyB0YXJnZXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZnJvbUFTTihhc24xU2NoZW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICBzY2hlbWFTdG9yYWdlLmNhY2hlKHRhcmdldCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0U2NoZW1hID0gc2NoZW1hLnNjaGVtYTtcbiAgICAgICAgICAgIGlmIChhc24xU2NoZW1hLmNvbnN0cnVjdG9yID09PSBhc24xanMuQ29uc3RydWN0ZWQgJiYgc2NoZW1hLnR5cGUgIT09IEFzblR5cGVUeXBlcy5DaG9pY2UpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRTY2hlbWEgPSBuZXcgYXNuMWpzLkNvbnN0cnVjdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2xhc3M6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IGFzbjFTY2hlbWEuaWRCbG9jay50YWdOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzY2hlbWEuc2NoZW1hLnZhbHVlQmxvY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhc24xU2NoZW1hW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXNuMUNvbXBhcmVkU2NoZW1hID0gYXNuMWpzLmNvbXBhcmVTY2hlbWEoe30sIGFzbjFTY2hlbWEsIHRhcmdldFNjaGVtYSk7XG4gICAgICAgICAgICBpZiAoIWFzbjFDb21wYXJlZFNjaGVtYS52ZXJpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc25TY2hlbWFWYWxpZGF0aW9uRXJyb3IoYERhdGEgZG9lcyBub3QgbWF0Y2ggdG8gJHt0YXJnZXQubmFtZX0gQVNOMSBzY2hlbWEuICR7YXNuMUNvbXBhcmVkU2NoZW1hLnJlc3VsdC5lcnJvcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyB0YXJnZXQoKTtcbiAgICAgICAgICAgIGlmIChpc1R5cGVPZkFycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShcInZhbHVlXCIgaW4gYXNuMVNjaGVtYS52YWx1ZUJsb2NrICYmIEFycmF5LmlzQXJyYXkoYXNuMVNjaGVtYS52YWx1ZUJsb2NrLnZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IGl0ZW1zIGZyb20gdGhlIEFTTi4xIHBhcnNlZCB2YWx1ZS4gQVNOLjEgb2JqZWN0IGlzIG5vdCBjb25zdHJ1Y3RlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVR5cGUgPSBzY2hlbWEuaXRlbVR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBjb252ZXJ0ZXJzLmRlZmF1bHRDb252ZXJ0ZXIoaXRlbVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IGRlZmF1bHQgY29udmVydGVyIGZvciBhcnJheSBpdGVtIG9mICR7dGFyZ2V0Lm5hbWV9IEFTTjEgc2NoZW1hYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5mcm9tKGFzbjFTY2hlbWEudmFsdWVCbG9jay52YWx1ZSwgKGVsZW1lbnQpID0+IGNvbnZlcnRlci5mcm9tQVNOKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZnJvbShhc24xU2NoZW1hLnZhbHVlQmxvY2sudmFsdWUsIChlbGVtZW50KSA9PiB0aGlzLmZyb21BU04oZWxlbWVudCwgaXRlbVR5cGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhc24xU2NoZW1hVmFsdWUgPSBhc24xQ29tcGFyZWRTY2hlbWEucmVzdWx0W2tleV07XG4gICAgICAgICAgICAgICAgaWYgKCFhc24xU2NoZW1hVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYUl0ZW0gPSBzY2hlbWEuaXRlbXNba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFJdGVtVHlwZSA9IHNjaGVtYUl0ZW0udHlwZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW1UeXBlID09PSBcIm51bWJlclwiIHx8IGlzQ29udmVydGlibGUoc2NoZW1hSXRlbVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IChfYSA9IHNjaGVtYUl0ZW0uY29udmVydGVyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoaXNDb252ZXJ0aWJsZShzY2hlbWFJdGVtVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IHNjaGVtYUl0ZW1UeXBlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb252ZXJ0ZXIgaXMgZW1wdHlcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYUl0ZW0ucmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLmltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyID0gc2NoZW1hSXRlbS5yZXBlYXRlZCA9PT0gXCJzZXF1ZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXNuMWpzLlNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXNuMWpzLlNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdJdGVtID0gbmV3IENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0udmFsdWVCbG9jayA9IGFzbjFTY2hlbWFWYWx1ZS52YWx1ZUJsb2NrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW1Bc24gPSBhc24xanMuZnJvbUJFUihuZXdJdGVtLnRvQkVSKGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW1Bc24ub2Zmc2V0ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgY2hpbGQgaXRlbS4gJHtuZXdJdGVtQXNuLnJlc3VsdC5lcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoXCJ2YWx1ZVwiIGluIG5ld0l0ZW1Bc24ucmVzdWx0LnZhbHVlQmxvY2sgJiYgQXJyYXkuaXNBcnJheShuZXdJdGVtQXNuLnJlc3VsdC52YWx1ZUJsb2NrLnZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGdldCBpdGVtcyBmcm9tIHRoZSBBU04uMSBwYXJzZWQgdmFsdWUuIEFTTi4xIG9iamVjdCBpcyBub3QgY29uc3RydWN0ZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ld0l0ZW1Bc24ucmVzdWx0LnZhbHVlQmxvY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBBcnJheS5mcm9tKHZhbHVlLCAoZWxlbWVudCkgPT4gY29udmVydGVyLmZyb21BU04oZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBBcnJheS5mcm9tKGFzbjFTY2hlbWFWYWx1ZSwgKGVsZW1lbnQpID0+IGNvbnZlcnRlci5mcm9tQVNOKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGFzbjFTY2hlbWFWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLmltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0l0ZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29udmVydGlibGUoc2NoZW1hSXRlbVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSBuZXcgc2NoZW1hSXRlbVR5cGUoKS50b1NjaGVtYShcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFzbjFUeXBlTmFtZSA9IEFzblByb3BUeXBlc1tzY2hlbWFJdGVtVHlwZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFzbjFUeXBlID0gYXNuMWpzW0FzbjFUeXBlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXNuMVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCAnJHtBc24xVHlwZU5hbWV9JyBjbGFzcyBmcm9tIGFzbjFqcyBtb2R1bGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3IEFzbjFUeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0udmFsdWVCbG9jayA9IHZhbHVlLnZhbHVlQmxvY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhc24xanMuZnJvbUJFUihuZXdJdGVtLnRvQkVSKGZhbHNlKSkucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBjb252ZXJ0ZXIuZnJvbUFTTih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFJdGVtLnJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXNuMVNjaGVtYVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBnZXQgbGlzdCBvZiBpdGVtcyBmcm9tIHRoZSBBU04uMSBwYXJzZWQgdmFsdWUuIEFTTi4xIHZhbHVlIHNob3VsZCBiZSBpdGVyYWJsZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IEFycmF5LmZyb20oYXNuMVNjaGVtYVZhbHVlLCAoZWxlbWVudCkgPT4gdGhpcy5mcm9tQVNOKGVsZW1lbnQsIHNjaGVtYUl0ZW1UeXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IHRoaXMuZnJvbUFTTihhc24xU2NoZW1hVmFsdWUsIHNjaGVtYUl0ZW1UeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBc25TY2hlbWFWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5zY2hlbWFzLnB1c2godGFyZ2V0Lm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0ICogYXMgYXNuMWpzIGZyb20gXCJhc24xanNcIjtcbmltcG9ydCAqIGFzIGNvbnZlcnRlcnMgZnJvbSBcIi4vY29udmVydGVyc1wiO1xuaW1wb3J0IHsgQXNuUHJvcFR5cGVzLCBBc25UeXBlVHlwZXMgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHsgaXNDb252ZXJ0aWJsZSwgaXNBcnJheUVxdWFsIH0gZnJvbSBcIi4vaGVscGVyXCI7XG5pbXBvcnQgeyBzY2hlbWFTdG9yYWdlIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuZXhwb3J0IGNsYXNzIEFzblNlcmlhbGl6ZXIge1xuICAgIHN0YXRpYyBzZXJpYWxpemUob2JqKSB7XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBhc24xanMuQmFzZUJsb2NrKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLnRvQkVSKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50b0FTTihvYmopLnRvQkVSKGZhbHNlKTtcbiAgICB9XG4gICAgc3RhdGljIHRvQVNOKG9iaikge1xuICAgICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgaXNDb252ZXJ0aWJsZShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLnRvQVNOKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEob2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyIDEgc2hvdWxkIGJlIHR5cGUgb2YgT2JqZWN0LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSBvYmouY29uc3RydWN0b3I7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuZ2V0KHRhcmdldCk7XG4gICAgICAgIHNjaGVtYVN0b3JhZ2UuY2FjaGUodGFyZ2V0KTtcbiAgICAgICAgbGV0IGFzbjFWYWx1ZSA9IFtdO1xuICAgICAgICBpZiAoc2NoZW1hLml0ZW1UeXBlKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQYXJhbWV0ZXIgMSBzaG91bGQgYmUgdHlwZSBvZiBBcnJheS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5pdGVtVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IGNvbnZlcnRlcnMuZGVmYXVsdENvbnZlcnRlcihzY2hlbWEuaXRlbVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICghY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGdldCBkZWZhdWx0IGNvbnZlcnRlciBmb3IgYXJyYXkgaXRlbSBvZiAke3RhcmdldC5uYW1lfSBBU04xIHNjaGVtYWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc24xVmFsdWUgPSBvYmoubWFwKChvKSA9PiBjb252ZXJ0ZXIudG9BU04obykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNuMVZhbHVlID0gb2JqLm1hcCgobykgPT4gdGhpcy50b0Fzbkl0ZW0oeyB0eXBlOiBzY2hlbWEuaXRlbVR5cGUgfSwgXCJbXVwiLCB0YXJnZXQsIG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5pdGVtcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYUl0ZW0gPSBzY2hlbWEuaXRlbXNba2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpQcm9wID0gb2JqW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKG9ialByb3AgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICB8fCBzY2hlbWFJdGVtLmRlZmF1bHRWYWx1ZSA9PT0gb2JqUHJvcFxuICAgICAgICAgICAgICAgICAgICB8fCAodHlwZW9mIHNjaGVtYUl0ZW0uZGVmYXVsdFZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmpQcm9wID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0FycmF5RXF1YWwodGhpcy5zZXJpYWxpemUoc2NoZW1hSXRlbS5kZWZhdWx0VmFsdWUpLCB0aGlzLnNlcmlhbGl6ZShvYmpQcm9wKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBhc24xSXRlbSA9IEFzblNlcmlhbGl6ZXIudG9Bc25JdGVtKHNjaGVtYUl0ZW0sIGtleSwgdGFyZ2V0LCBvYmpQcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW0uY29udGV4dCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hSXRlbS5pbXBsaWNpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFJdGVtLnJlcGVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBzY2hlbWFJdGVtLnR5cGUgPT09IFwibnVtYmVyXCIgfHwgaXNDb252ZXJ0aWJsZShzY2hlbWFJdGVtLnR5cGUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWVIZXggPSBhc24xSXRlbSBpbnN0YW5jZW9mIGFzbjFqcy5OdWxsID8gYXNuMUl0ZW0udmFsdWVCZWZvcmVEZWNvZGVWaWV3IDogYXNuMUl0ZW0udmFsdWVCbG9jay50b0JFUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZS5wdXNoKG5ldyBhc24xanMuUHJpbWl0aXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6IHNjaGVtYUl0ZW0ub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQmxvY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXNzOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyOiBzY2hlbWFJdGVtLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZS5wdXNoKG5ldyBhc24xanMuQ29uc3RydWN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogc2NoZW1hSXRlbS5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQ2xhc3M6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOdW1iZXI6IHNjaGVtYUl0ZW0uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFzbjFJdGVtLnZhbHVlQmxvY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2gobmV3IGFzbjFqcy5Db25zdHJ1Y3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6IHNjaGVtYUl0ZW0ub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRCbG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdDbGFzczogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTnVtYmVyOiBzY2hlbWFJdGVtLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW2FzbjFJdGVtXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFJdGVtLnJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzbjFWYWx1ZSA9IGFzbjFWYWx1ZS5jb25jYXQoYXNuMUl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXNuMVZhbHVlLnB1c2goYXNuMUl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYXNuU2NoZW1hO1xuICAgICAgICBzd2l0Y2ggKHNjaGVtYS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEFzblR5cGVUeXBlcy5TZXF1ZW5jZTpcbiAgICAgICAgICAgICAgICBhc25TY2hlbWEgPSBuZXcgYXNuMWpzLlNlcXVlbmNlKHsgdmFsdWU6IGFzbjFWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQXNuVHlwZVR5cGVzLlNldDpcbiAgICAgICAgICAgICAgICBhc25TY2hlbWEgPSBuZXcgYXNuMWpzLlNldCh7IHZhbHVlOiBhc24xVmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFzblR5cGVUeXBlcy5DaG9pY2U6XG4gICAgICAgICAgICAgICAgaWYgKCFhc24xVmFsdWVbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlbWEgJyR7dGFyZ2V0Lm5hbWV9JyBoYXMgd3JvbmcgZGF0YS4gQ2hvaWNlIGNhbm5vdCBiZSBlbXB0eS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNuU2NoZW1hID0gYXNuMVZhbHVlWzBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc25TY2hlbWE7XG4gICAgfVxuICAgIHN0YXRpYyB0b0Fzbkl0ZW0oc2NoZW1hSXRlbSwga2V5LCB0YXJnZXQsIG9ialByb3ApIHtcbiAgICAgICAgbGV0IGFzbjFJdGVtO1xuICAgICAgICBpZiAodHlwZW9mIChzY2hlbWFJdGVtLnR5cGUpID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBzY2hlbWFJdGVtLmNvbnZlcnRlcjtcbiAgICAgICAgICAgIGlmICghY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAnJHtrZXl9JyBkb2Vzbid0IGhhdmUgY29udmVydGVyIGZvciB0eXBlICR7QXNuUHJvcFR5cGVzW3NjaGVtYUl0ZW0udHlwZV19IGluIHNjaGVtYSAnJHt0YXJnZXQubmFtZX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2NoZW1hSXRlbS5yZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvYmpQcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyICdvYmpQcm9wJyBzaG91bGQgYmUgdHlwZSBvZiBBcnJheS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShvYmpQcm9wLCAoZWxlbWVudCkgPT4gY29udmVydGVyLnRvQVNOKGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBDb250YWluZXIgPSBzY2hlbWFJdGVtLnJlcGVhdGVkID09PSBcInNlcXVlbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBhc24xanMuU2VxdWVuY2VcbiAgICAgICAgICAgICAgICAgICAgOiBhc24xanMuU2V0O1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtID0gbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzbjFJdGVtID0gY29udmVydGVyLnRvQVNOKG9ialByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNjaGVtYUl0ZW0ucmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqUHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAnb2JqUHJvcCcgc2hvdWxkIGJlIHR5cGUgb2YgQXJyYXkuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20ob2JqUHJvcCwgKGVsZW1lbnQpID0+IHRoaXMudG9BU04oZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lciA9IHNjaGVtYUl0ZW0ucmVwZWF0ZWQgPT09IFwic2VxdWVuY2VcIlxuICAgICAgICAgICAgICAgICAgICA/IGFzbjFqcy5TZXF1ZW5jZVxuICAgICAgICAgICAgICAgICAgICA6IGFzbjFqcy5TZXQ7XG4gICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSBuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1zLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNuMUl0ZW0gPSB0aGlzLnRvQVNOKG9ialByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc24xSXRlbTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIEFzbkFycmF5IGV4dGVuZHMgQXJyYXkge1xuICAgIGNvbnN0cnVjdG9yKGl0ZW1zID0gW10pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtcyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgc3VwZXIoaXRlbXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBhc24xanMgZnJvbSBcImFzbjFqc1wiO1xuaW1wb3J0IHsgQnVmZmVyU291cmNlQ29udmVydGVyIH0gZnJvbSBcInB2dHN1dGlsc1wiO1xuaW1wb3J0IHsgQXNuUGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyXCI7XG5pbXBvcnQgeyBBc25TZXJpYWxpemVyIH0gZnJvbSBcIi4vc2VyaWFsaXplclwiO1xuZXhwb3J0IGNsYXNzIEFzbkNvbnZlcnQge1xuICAgIHN0YXRpYyBzZXJpYWxpemUob2JqKSB7XG4gICAgICAgIHJldHVybiBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShvYmopO1xuICAgIH1cbiAgICBzdGF0aWMgcGFyc2UoZGF0YSwgdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBBc25QYXJzZXIucGFyc2UoZGF0YSwgdGFyZ2V0KTtcbiAgICB9XG4gICAgc3RhdGljIHRvU3RyaW5nKGRhdGEpIHtcbiAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyU291cmNlQ29udmVydGVyLmlzQnVmZmVyU291cmNlKGRhdGEpXG4gICAgICAgICAgICA/IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGRhdGEpXG4gICAgICAgICAgICA6IEFzbkNvbnZlcnQuc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICBjb25zdCBhc24gPSBhc24xanMuZnJvbUJFUihidWYpO1xuICAgICAgICBpZiAoYXNuLm9mZnNldCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRlY29kZSBBU04uMSBkYXRhLiAke2Fzbi5yZXN1bHQuZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzbi5yZXN1bHQudG9TdHJpbmcoKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vY29udmVydGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMvaW5kZXhcIjtcbmV4cG9ydCB7IEFzblByb3AsIEFzblR5cGUsIEFzbkNob2ljZVR5cGUsIEFzblNlcXVlbmNlVHlwZSwgQXNuU2V0VHlwZSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCB7IEFzblR5cGVUeXBlcywgQXNuUHJvcFR5cGVzIH0gZnJvbSBcIi4vZW51bXNcIjtcbmV4cG9ydCB7IEFzblBhcnNlciB9IGZyb20gXCIuL3BhcnNlclwiO1xuZXhwb3J0IHsgQXNuU2VyaWFsaXplciB9IGZyb20gXCIuL3NlcmlhbGl6ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udmVydFwiO1xuIiwgIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgZ2xvYmFsLCBkZWZpbmUsIFN5c3RlbSwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG52YXIgX19leHRlbmRzO1xyXG52YXIgX19hc3NpZ247XHJcbnZhciBfX3Jlc3Q7XHJcbnZhciBfX2RlY29yYXRlO1xyXG52YXIgX19wYXJhbTtcclxudmFyIF9fbWV0YWRhdGE7XHJcbnZhciBfX2F3YWl0ZXI7XHJcbnZhciBfX2dlbmVyYXRvcjtcclxudmFyIF9fZXhwb3J0U3RhcjtcclxudmFyIF9fdmFsdWVzO1xyXG52YXIgX19yZWFkO1xyXG52YXIgX19zcHJlYWQ7XHJcbnZhciBfX3NwcmVhZEFycmF5cztcclxudmFyIF9fc3ByZWFkQXJyYXk7XHJcbnZhciBfX2F3YWl0O1xyXG52YXIgX19hc3luY0dlbmVyYXRvcjtcclxudmFyIF9fYXN5bmNEZWxlZ2F0b3I7XHJcbnZhciBfX2FzeW5jVmFsdWVzO1xyXG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3Q7XHJcbnZhciBfX2ltcG9ydFN0YXI7XHJcbnZhciBfX2ltcG9ydERlZmF1bHQ7XHJcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0O1xyXG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZFNldDtcclxudmFyIF9fY2xhc3NQcml2YXRlRmllbGRJbjtcclxudmFyIF9fY3JlYXRlQmluZGluZztcclxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XHJcbiAgICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0eXBlb2YgdGhpcyA9PT0gXCJvYmplY3RcIiA/IHRoaXMgOiB7fTtcclxuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xyXG4gICAgICAgIGRlZmluZShcInRzbGliXCIsIFtcImV4cG9ydHNcIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7IGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCwgY3JlYXRlRXhwb3J0ZXIoZXhwb3J0cykpKTsgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCwgY3JlYXRlRXhwb3J0ZXIobW9kdWxlLmV4cG9ydHMpKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBmYWN0b3J5KGNyZWF0ZUV4cG9ydGVyKHJvb3QpKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUV4cG9ydGVyKGV4cG9ydHMsIHByZXZpb3VzKSB7XHJcbiAgICAgICAgaWYgKGV4cG9ydHMgIT09IHJvb3QpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpZCwgdikgeyByZXR1cm4gZXhwb3J0c1tpZF0gPSBwcmV2aW91cyA/IHByZXZpb3VzKGlkLCB2KSA6IHY7IH07XHJcbiAgICB9XHJcbn0pXHJcbihmdW5jdGlvbiAoZXhwb3J0ZXIpIHtcclxuICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcblxyXG4gICAgX19leHRlbmRzID0gZnVuY3Rpb24gKGQsIGIpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH07XHJcblxyXG4gICAgX19yZXN0ID0gZnVuY3Rpb24gKHMsIGUpIHtcclxuICAgICAgICB2YXIgdCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgICAgICB0W3BdID0gc1twXTtcclxuICAgICAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2RlY29yYXRlID0gZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxuICAgIH07XHJcblxyXG4gICAgX19wYXJhbSA9IGZ1bmN0aW9uIChwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxuICAgIH07XHJcblxyXG4gICAgX19tZXRhZGF0YSA9IGZ1bmN0aW9uIChtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXdhaXRlciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XHJcbiAgICAgICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgICAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZXhwb3J0U3RhciA9IGZ1bmN0aW9uKG0sIG8pIHtcclxuICAgICAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgICAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgICAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG4gICAgfSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgICAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgICAgIG9bazJdID0gbVtrXTtcclxuICAgIH0pO1xyXG5cclxuICAgIF9fdmFsdWVzID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3JlYWQgPSBmdW5jdGlvbiAobywgbikge1xyXG4gICAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgICAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCAqL1xyXG4gICAgX19zcHJlYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCAqL1xyXG4gICAgX19zcHJlYWRBcnJheXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICAgICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgICAgIHJldHVybiByO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3NwcmVhZEFycmF5ID0gZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICAgICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hd2FpdCA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNHZW5lcmF0b3IgPSBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyAgfVxyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICAgICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgaSwgcDtcclxuICAgICAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxuICAgIH07XHJcblxyXG4gICAgX19hc3luY1ZhbHVlcyA9IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICAgICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdCA9IGZ1bmN0aW9uIChjb29rZWQsIHJhdykge1xyXG4gICAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICAgICAgcmV0dXJuIGNvb2tlZDtcclxuICAgIH07XHJcblxyXG4gICAgdmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxuICAgIH0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxuICAgIH07XHJcblxyXG4gICAgX19pbXBvcnRTdGFyID0gZnVuY3Rpb24gKG1vZCkge1xyXG4gICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgICAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9faW1wb3J0RGVmYXVsdCA9IGZ1bmN0aW9uIChtb2QpIHtcclxuICAgICAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcclxuICAgIH07XHJcblxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCA9IGZ1bmN0aW9uIChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICAgICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxuICAgIH07XHJcblxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCA9IGZ1bmN0aW9uIChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4gPSBmdW5jdGlvbiAoc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICAgICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0ZXIoXCJfX2V4dGVuZHNcIiwgX19leHRlbmRzKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3NpZ25cIiwgX19hc3NpZ24pO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3Jlc3RcIiwgX19yZXN0KTtcclxuICAgIGV4cG9ydGVyKFwiX19kZWNvcmF0ZVwiLCBfX2RlY29yYXRlKTtcclxuICAgIGV4cG9ydGVyKFwiX19wYXJhbVwiLCBfX3BhcmFtKTtcclxuICAgIGV4cG9ydGVyKFwiX19tZXRhZGF0YVwiLCBfX21ldGFkYXRhKTtcclxuICAgIGV4cG9ydGVyKFwiX19hd2FpdGVyXCIsIF9fYXdhaXRlcik7XHJcbiAgICBleHBvcnRlcihcIl9fZ2VuZXJhdG9yXCIsIF9fZ2VuZXJhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19leHBvcnRTdGFyXCIsIF9fZXhwb3J0U3Rhcik7XHJcbiAgICBleHBvcnRlcihcIl9fY3JlYXRlQmluZGluZ1wiLCBfX2NyZWF0ZUJpbmRpbmcpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3ZhbHVlc1wiLCBfX3ZhbHVlcyk7XHJcbiAgICBleHBvcnRlcihcIl9fcmVhZFwiLCBfX3JlYWQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3NwcmVhZFwiLCBfX3NwcmVhZCk7XHJcbiAgICBleHBvcnRlcihcIl9fc3ByZWFkQXJyYXlzXCIsIF9fc3ByZWFkQXJyYXlzKTtcclxuICAgIGV4cG9ydGVyKFwiX19zcHJlYWRBcnJheVwiLCBfX3NwcmVhZEFycmF5KTtcclxuICAgIGV4cG9ydGVyKFwiX19hd2FpdFwiLCBfX2F3YWl0KTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY0dlbmVyYXRvclwiLCBfX2FzeW5jR2VuZXJhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY0RlbGVnYXRvclwiLCBfX2FzeW5jRGVsZWdhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY1ZhbHVlc1wiLCBfX2FzeW5jVmFsdWVzKTtcclxuICAgIGV4cG9ydGVyKFwiX19tYWtlVGVtcGxhdGVPYmplY3RcIiwgX19tYWtlVGVtcGxhdGVPYmplY3QpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2ltcG9ydFN0YXJcIiwgX19pbXBvcnRTdGFyKTtcclxuICAgIGV4cG9ydGVyKFwiX19pbXBvcnREZWZhdWx0XCIsIF9faW1wb3J0RGVmYXVsdCk7XHJcbiAgICBleHBvcnRlcihcIl9fY2xhc3NQcml2YXRlRmllbGRHZXRcIiwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCk7XHJcbiAgICBleHBvcnRlcihcIl9fY2xhc3NQcml2YXRlRmllbGRTZXRcIiwgX19jbGFzc1ByaXZhdGVGaWVsZFNldCk7XHJcbiAgICBleHBvcnRlcihcIl9fY2xhc3NQcml2YXRlRmllbGRJblwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4pO1xyXG59KTtcclxuIiwgImltcG9ydCB0c2xpYiBmcm9tICcuLi90c2xpYi5qcyc7XHJcbmNvbnN0IHtcclxuICAgIF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduLFxyXG4gICAgX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW0sXHJcbiAgICBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3IsXHJcbiAgICBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZCxcclxuICAgIF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbn0gPSB0c2xpYjtcclxuZXhwb3J0IHtcclxuICAgIF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduLFxyXG4gICAgX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW0sXHJcbiAgICBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3IsXHJcbiAgICBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZCxcclxuICAgIF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbn07XHJcbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMCwgUGVjdWxpYXIgVmVudHVyZXMsIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKi9cblxuY2xhc3MgSnNvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgaW5uZXJFcnJvcikge1xyXG4gICAgICAgIHN1cGVyKGlubmVyRXJyb3JcclxuICAgICAgICAgICAgPyBgJHttZXNzYWdlfS4gU2VlIHRoZSBpbm5lciBleGNlcHRpb24gZm9yIG1vcmUgZGV0YWlscy5gXHJcbiAgICAgICAgICAgIDogbWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcclxuICAgICAgICB0aGlzLmlubmVyRXJyb3IgPSBpbm5lckVycm9yO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFRyYW5zZm9ybUVycm9yIGV4dGVuZHMgSnNvbkVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSwgbWVzc2FnZSwgaW5uZXJFcnJvcikge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGlubmVyRXJyb3IpO1xyXG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFBhcnNlckVycm9yIGV4dGVuZHMgVHJhbnNmb3JtRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBtZXNzYWdlLCBpbm5lckVycm9yKSB7XHJcbiAgICAgICAgc3VwZXIoc2NoZW1hLCBgSlNPTiBkb2Vzbid0IG1hdGNoIHRvICcke3NjaGVtYS50YXJnZXQubmFtZX0nIHNjaGVtYS4gJHttZXNzYWdlfWAsIGlubmVyRXJyb3IpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEpzb25FcnJvciB7XHJcbn1cblxuY2xhc3MgU2VyaWFsaXplckVycm9yIGV4dGVuZHMgSnNvbkVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHNjaGVtYU5hbWUsIG1lc3NhZ2UsIGlubmVyRXJyb3IpIHtcclxuICAgICAgICBzdXBlcihgQ2Fubm90IHNlcmlhbGl6ZSBieSAnJHtzY2hlbWFOYW1lfScgc2NoZW1hLiAke21lc3NhZ2V9YCwgaW5uZXJFcnJvcik7XHJcbiAgICAgICAgdGhpcy5zY2hlbWFOYW1lID0gc2NoZW1hTmFtZTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBLZXlFcnJvciBleHRlbmRzIFBhcnNlckVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSwga2V5cywgZXJyb3JzID0ge30pIHtcclxuICAgICAgICBzdXBlcihzY2hlbWEsIFwiU29tZSBrZXlzIGRvZXNuJ3QgbWF0Y2ggdG8gc2NoZW1hXCIpO1xyXG4gICAgICAgIHRoaXMua2V5cyA9IGtleXM7XHJcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XHJcbiAgICB9XHJcbn1cblxudmFyIEpzb25Qcm9wVHlwZXM7XHJcbihmdW5jdGlvbiAoSnNvblByb3BUeXBlcykge1xyXG4gICAgSnNvblByb3BUeXBlc1tKc29uUHJvcFR5cGVzW1wiQW55XCJdID0gMF0gPSBcIkFueVwiO1xyXG4gICAgSnNvblByb3BUeXBlc1tKc29uUHJvcFR5cGVzW1wiQm9vbGVhblwiXSA9IDFdID0gXCJCb29sZWFuXCI7XHJcbiAgICBKc29uUHJvcFR5cGVzW0pzb25Qcm9wVHlwZXNbXCJOdW1iZXJcIl0gPSAyXSA9IFwiTnVtYmVyXCI7XHJcbiAgICBKc29uUHJvcFR5cGVzW0pzb25Qcm9wVHlwZXNbXCJTdHJpbmdcIl0gPSAzXSA9IFwiU3RyaW5nXCI7XHJcbn0pKEpzb25Qcm9wVHlwZXMgfHwgKEpzb25Qcm9wVHlwZXMgPSB7fSkpO1xuXG5mdW5jdGlvbiBjaGVja1R5cGUodmFsdWUsIHR5cGUpIHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgIGNhc2UgSnNvblByb3BUeXBlcy5Cb29sZWFuOlxyXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIjtcclxuICAgICAgICBjYXNlIEpzb25Qcm9wVHlwZXMuTnVtYmVyOlxyXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiO1xyXG4gICAgICAgIGNhc2UgSnNvblByb3BUeXBlcy5TdHJpbmc6XHJcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5mdW5jdGlvbiB0aHJvd0lmVHlwZUlzV3JvbmcodmFsdWUsIHR5cGUpIHtcclxuICAgIGlmICghY2hlY2tUeXBlKHZhbHVlLCB0eXBlKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFZhbHVlIG11c3QgYmUgJHtKc29uUHJvcFR5cGVzW3R5cGVdfWApO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGlzQ29udmVydGlibGUodGFyZ2V0KSB7XHJcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5wcm90b3R5cGUpIHtcclxuICAgICAgICBpZiAodGFyZ2V0LnByb3RvdHlwZS50b0pTT04gJiYgdGFyZ2V0LnByb3RvdHlwZS5mcm9tSlNPTikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpc0NvbnZlcnRpYmxlKHRhcmdldC5wcm90b3R5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAhISh0YXJnZXQgJiYgdGFyZ2V0LnRvSlNPTiAmJiB0YXJnZXQuZnJvbUpTT04pO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEpzb25TY2hlbWFTdG9yYWdlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuaXRlbXMgPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcbiAgICBoYXModGFyZ2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuaGFzKHRhcmdldCkgfHwgISF0aGlzLmZpbmRQYXJlbnRTY2hlbWEodGFyZ2V0KTtcclxuICAgIH1cclxuICAgIGdldCh0YXJnZXQpIHtcclxuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLml0ZW1zLmdldCh0YXJnZXQpIHx8IHRoaXMuZmluZFBhcmVudFNjaGVtYSh0YXJnZXQpO1xyXG4gICAgICAgIGlmICghc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBnZXQgc2NoZW1hIGZvciBjdXJyZW50IHRhcmdldFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcclxuICAgIH1cclxuICAgIGNyZWF0ZSh0YXJnZXQpIHtcclxuICAgICAgICBjb25zdCBzY2hlbWEgPSB7IG5hbWVzOiB7fSB9O1xyXG4gICAgICAgIGNvbnN0IHBhcmVudFNjaGVtYSA9IHRoaXMuZmluZFBhcmVudFNjaGVtYSh0YXJnZXQpO1xyXG4gICAgICAgIGlmIChwYXJlbnRTY2hlbWEpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzY2hlbWEsIHBhcmVudFNjaGVtYSk7XHJcbiAgICAgICAgICAgIHNjaGVtYS5uYW1lcyA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcGFyZW50U2NoZW1hLm5hbWVzKSB7XHJcbiAgICAgICAgICAgICAgICBzY2hlbWEubmFtZXNbbmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBwYXJlbnRTY2hlbWEubmFtZXNbbmFtZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNjaGVtYS50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcclxuICAgIH1cclxuICAgIHNldCh0YXJnZXQsIHNjaGVtYSkge1xyXG4gICAgICAgIHRoaXMuaXRlbXMuc2V0KHRhcmdldCwgc2NoZW1hKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIGZpbmRQYXJlbnRTY2hlbWEodGFyZ2V0KSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGFyZ2V0Ll9fcHJvdG9fXztcclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuaXRlbXMuZ2V0KHBhcmVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEgfHwgdGhpcy5maW5kUGFyZW50U2NoZW1hKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XG5cbmNvbnN0IERFRkFVTFRfU0NIRU1BID0gXCJkZWZhdWx0XCI7XHJcbmNvbnN0IHNjaGVtYVN0b3JhZ2UgPSBuZXcgSnNvblNjaGVtYVN0b3JhZ2UoKTtcblxuY2xhc3MgUGF0dGVyblZhbGlkYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IocGF0dGVybikge1xyXG4gICAgICAgIHRoaXMucGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVybik7XHJcbiAgICB9XHJcbiAgICB2YWxpZGF0ZSh2YWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHRoaXMucGF0dGVybi5zb3VyY2UsIHRoaXMucGF0dGVybi5mbGFncyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSW5jb21pbmcgdmFsdWUgbXVzdCBiZSBzdHJpbmdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcGF0dGVybi5leGVjKHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBkb2Vzbid0IG1hdGNoIHRvIHBhdHRlcm4gJyR7cGF0dGVybi50b1N0cmluZygpfSdgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgSW5jbHVzaXZlVmFsaWRhdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihtaW4gPSBOdW1iZXIuTUlOX1ZBTFVFLCBtYXggPSBOdW1iZXIuTUFYX1ZBTFVFKSB7XHJcbiAgICAgICAgdGhpcy5taW4gPSBtaW47XHJcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XHJcbiAgICB9XHJcbiAgICB2YWxpZGF0ZSh2YWx1ZSkge1xyXG4gICAgICAgIHRocm93SWZUeXBlSXNXcm9uZyh2YWx1ZSwgSnNvblByb3BUeXBlcy5OdW1iZXIpO1xyXG4gICAgICAgIGlmICghKHRoaXMubWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IHRoaXMubWF4KSkge1xyXG4gICAgICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbiA9PT0gTnVtYmVyLk1JTl9WQUxVRSA/IFwiTUlOXCIgOiB0aGlzLm1pbjtcclxuICAgICAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXggPT09IE51bWJlci5NQVhfVkFMVUUgPyBcIk1BWFwiIDogdGhpcy5tYXg7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFZhbHVlIGRvZXNuJ3QgbWF0Y2ggdG8gZGlhcGFzb24gWyR7bWlufSwke21heH1dYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEV4Y2x1c2l2ZVZhbGlkYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IobWluID0gTnVtYmVyLk1JTl9WQUxVRSwgbWF4ID0gTnVtYmVyLk1BWF9WQUxVRSkge1xyXG4gICAgICAgIHRoaXMubWluID0gbWluO1xyXG4gICAgICAgIHRoaXMubWF4ID0gbWF4O1xyXG4gICAgfVxyXG4gICAgdmFsaWRhdGUodmFsdWUpIHtcclxuICAgICAgICB0aHJvd0lmVHlwZUlzV3JvbmcodmFsdWUsIEpzb25Qcm9wVHlwZXMuTnVtYmVyKTtcclxuICAgICAgICBpZiAoISh0aGlzLm1pbiA8IHZhbHVlICYmIHZhbHVlIDwgdGhpcy5tYXgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluID09PSBOdW1iZXIuTUlOX1ZBTFVFID8gXCJNSU5cIiA6IHRoaXMubWluO1xyXG4gICAgICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heCA9PT0gTnVtYmVyLk1BWF9WQUxVRSA/IFwiTUFYXCIgOiB0aGlzLm1heDtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVmFsdWUgZG9lc24ndCBtYXRjaCB0byBkaWFwYXNvbiAoJHttaW59LCR7bWF4fSlgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgTGVuZ3RoVmFsaWRhdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgsIG1pbkxlbmd0aCwgbWF4TGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XHJcbiAgICAgICAgdGhpcy5taW5MZW5ndGggPSBtaW5MZW5ndGg7XHJcbiAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7XHJcbiAgICB9XHJcbiAgICB2YWxpZGF0ZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IHRoaXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBsZW5ndGggbXVzdCBiZSBleGFjdGx5ICR7dGhpcy5sZW5ndGh9LmApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWluTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBsZW5ndGggbXVzdCBiZSBtb3JlIHRoYW4gJHt0aGlzLm1pbkxlbmd0aH0uYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBWYWx1ZSBsZW5ndGggbXVzdCBiZSBsZXNzIHRoYW4gJHt0aGlzLm1heExlbmd0aH0uYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgRW51bWVyYXRpb25WYWxpZGF0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKGVudW1lcmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5lbnVtZXJhdGlvbiA9IGVudW1lcmF0aW9uO1xyXG4gICAgfVxyXG4gICAgdmFsaWRhdGUodmFsdWUpIHtcclxuICAgICAgICB0aHJvd0lmVHlwZUlzV3JvbmcodmFsdWUsIEpzb25Qcm9wVHlwZXMuU3RyaW5nKTtcclxuICAgICAgICBpZiAoIXRoaXMuZW51bWVyYXRpb24uaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFZhbHVlIG11c3QgYmUgb25lIG9mICR7dGhpcy5lbnVtZXJhdGlvbi5tYXAoKHYpID0+IGAnJHt2fSdgKS5qb2luKFwiLCBcIil9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEpzb25UcmFuc2Zvcm0ge1xyXG4gICAgc3RhdGljIGNoZWNrVmFsdWVzKGRhdGEsIHNjaGVtYUl0ZW0pIHtcclxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb24gb2Ygc2NoZW1hSXRlbS52YWxpZGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24gaW5zdGFuY2VvZiBMZW5ndGhWYWxpZGF0aW9uICYmIHNjaGVtYUl0ZW0ucmVwZWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY2hlY2tUeXBlcyh2YWx1ZSwgc2NoZW1hSXRlbSkge1xyXG4gICAgICAgIGlmIChzY2hlbWFJdGVtLnJlcGVhdGVkICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVmFsdWUgbXVzdCBiZSBBcnJheVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtLnR5cGUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgICAgIHRocm93SWZUeXBlSXNXcm9uZyh2LCBzY2hlbWFJdGVtLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGdldFNjaGVtYUJ5TmFtZShzY2hlbWEsIG5hbWUgPSBERUZBVUxUX1NDSEVNQSkge1xyXG4gICAgICAgIHJldHVybiB7IC4uLnNjaGVtYS5uYW1lc1tERUZBVUxUX1NDSEVNQV0sIC4uLnNjaGVtYS5uYW1lc1tuYW1lXSB9O1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEpzb25TZXJpYWxpemVyIGV4dGVuZHMgSnNvblRyYW5zZm9ybSB7XHJcbiAgICBzdGF0aWMgc2VyaWFsaXplKG9iaiwgb3B0aW9ucywgcmVwbGFjZXIsIHNwYWNlKSB7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKG9iaiwgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24sIHJlcGxhY2VyLCBzcGFjZSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgdG9KU09OKG9iaiwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IHJlcztcclxuICAgICAgICBsZXQgdGFyZ2V0U2NoZW1hID0gb3B0aW9ucy50YXJnZXRTY2hlbWE7XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IG9wdGlvbnMuc2NoZW1hTmFtZSB8fCBERUZBVUxUX1NDSEVNQTtcclxuICAgICAgICBpZiAoaXNDb252ZXJ0aWJsZShvYmopKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmoudG9KU09OKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcclxuICAgICAgICAgICAgcmVzID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmopIHtcclxuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMudG9KU09OKGl0ZW0sIG9wdGlvbnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXRTY2hlbWEgJiYgIXNjaGVtYVN0b3JhZ2UuaGFzKHRhcmdldFNjaGVtYSkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc29uRXJyb3IoXCJDYW5ub3QgZ2V0IHNjaGVtYSBmb3IgYHRhcmdldFNjaGVtYWAgcGFyYW1cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGFyZ2V0U2NoZW1hID0gKHRhcmdldFNjaGVtYSB8fCBvYmouY29uc3RydWN0b3IpO1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hU3RvcmFnZS5oYXModGFyZ2V0U2NoZW1hKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5nZXQodGFyZ2V0U2NoZW1hKTtcclxuICAgICAgICAgICAgICAgIHJlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZWRTY2hlbWEgPSB0aGlzLmdldFNjaGVtYUJ5TmFtZShzY2hlbWEsIHNjaGVtYU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmFtZWRTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gbmFtZWRTY2hlbWFba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqSXRlbSA9IG9ialtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS5vcHRpb25hbCAmJiBvYmpJdGVtID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXRlbS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBvYmpJdGVtID09PSBpdGVtLmRlZmF1bHRWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5vcHRpb25hbCAmJiBvYmpJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemVyRXJyb3IodGFyZ2V0U2NoZW1hLm5hbWUsIGBQcm9wZXJ0eSAnJHtrZXl9JyBpcyByZXF1aXJlZC5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0udHlwZSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29udmVydGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ucmVwZWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvYmpJdGVtLm1hcCgoZWwpID0+IGl0ZW0uY29udmVydGVyLnRvSlNPTihlbCwgb2JqKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0ZW0uY29udmVydGVyLnRvSlNPTihvYmpJdGVtLCBvYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gb2JqSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnJlcGVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvYmpJdGVtLm1hcCgoZWwpID0+IHRoaXMudG9KU09OKGVsLCB7IHNjaGVtYU5hbWUgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnRvSlNPTihvYmpJdGVtLCB7IHNjaGVtYU5hbWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1R5cGVzKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZhbHVlcyh2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1tpdGVtLm5hbWUgfHwga2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFNlcmlhbGl6ZXJFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemVyRXJyb3Ioc2NoZW1hLnRhcmdldC5uYW1lLCBgUHJvcGVydHkgJyR7a2V5fScgaXMgd3JvbmcuICR7ZS5tZXNzYWdlfWAsIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzID0ge307XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IHRoaXMudG9KU09OKG9ialtrZXldLCB7IHNjaGVtYU5hbWUgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcyA9IG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxufVxuXG5jbGFzcyBKc29uUGFyc2VyIGV4dGVuZHMgSnNvblRyYW5zZm9ybSB7XHJcbiAgICBzdGF0aWMgcGFyc2UoZGF0YSwgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbUpTT04ob2JqLCBvcHRpb25zKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tSlNPTih0YXJnZXQsIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRTY2hlbWEgPSBvcHRpb25zLnRhcmdldFNjaGVtYTtcclxuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gb3B0aW9ucy5zY2hlbWFOYW1lIHx8IERFRkFVTFRfU0NIRU1BO1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IG5ldyB0YXJnZXRTY2hlbWEoKTtcclxuICAgICAgICBpZiAoaXNDb252ZXJ0aWJsZShvYmopKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmouZnJvbUpTT04odGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5nZXQodGFyZ2V0U2NoZW1hKTtcclxuICAgICAgICBjb25zdCBuYW1lZFNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hQnlOYW1lKHNjaGVtYSwgc2NoZW1hTmFtZSk7XHJcbiAgICAgICAgY29uc3Qga2V5RXJyb3JzID0ge307XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0UHJvcGVydHkgJiYgIUFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xyXG4gICAgICAgICAgICBKc29uUGFyc2VyLmNoZWNrU3RyaWN0UHJvcGVydHkodGFyZ2V0LCBuYW1lZFNjaGVtYSwgc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmFtZWRTY2hlbWEpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuYW1lZFNjaGVtYVtrZXldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGl0ZW0ubmFtZSB8fCBrZXk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtuYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIChpdGVtLm9wdGlvbmFsIHx8IGl0ZW0uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ub3B0aW9uYWwgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZXJFcnJvcihzY2hlbWEsIGBQcm9wZXJ0eSAnJHtuYW1lfScgaXMgcmVxdWlyZWQuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVHlwZXModmFsdWUsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZhbHVlcyh2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChpdGVtLnR5cGUpID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29udmVydGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnJlcGVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlLm1hcCgoZWwpID0+IGl0ZW0uY29udmVydGVyLmZyb21KU09OKGVsLCBvYmopKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gaXRlbS5jb252ZXJ0ZXIuZnJvbUpTT04odmFsdWUsIG9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3T3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2NoZW1hOiBpdGVtLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5yZXBlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlLm1hcCgoZWwpID0+IHRoaXMuZnJvbUpTT04oZWwsIG5ld09wdGlvbnMpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gdGhpcy5mcm9tSlNPTih2YWx1ZSwgbmV3T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgUGFyc2VyRXJyb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZSA9IG5ldyBQYXJzZXJFcnJvcihzY2hlbWEsIGBQcm9wZXJ0eSAnJHtrZXl9JyBpcyB3cm9uZy4gJHtlLm1lc3NhZ2V9YCwgZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdHJpY3RBbGxLZXlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5RXJyb3JzW2tleV0gPSBlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoa2V5RXJyb3JzKTtcclxuICAgICAgICBpZiAoa2V5cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEtleUVycm9yKHNjaGVtYSwga2V5cywga2V5RXJyb3JzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjaGVja1N0cmljdFByb3BlcnR5KHRhcmdldCwgbmFtZWRTY2hlbWEsIHNjaGVtYSkge1xyXG4gICAgICAgIGNvbnN0IGpzb25Qcm9wcyA9IE9iamVjdC5rZXlzKHRhcmdldCk7XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcHMgPSBPYmplY3Qua2V5cyhuYW1lZFNjaGVtYSk7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGpzb25Qcm9wcykge1xyXG4gICAgICAgICAgICBpZiAoc2NoZW1hUHJvcHMuaW5kZXhPZihrZXkpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBLZXlFcnJvcihzY2hlbWEsIGtleXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5mdW5jdGlvbiBnZXRWYWxpZGF0aW9ucyhpdGVtKSB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9ucyA9IFtdO1xyXG4gICAgaWYgKGl0ZW0ucGF0dGVybikge1xyXG4gICAgICAgIHZhbGlkYXRpb25zLnB1c2gobmV3IFBhdHRlcm5WYWxpZGF0aW9uKGl0ZW0ucGF0dGVybikpO1xyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gSnNvblByb3BUeXBlcy5OdW1iZXIgfHwgaXRlbS50eXBlID09PSBKc29uUHJvcFR5cGVzLkFueSkge1xyXG4gICAgICAgIGlmIChpdGVtLm1pbkluY2x1c2l2ZSAhPT0gdW5kZWZpbmVkIHx8IGl0ZW0ubWF4SW5jbHVzaXZlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbnMucHVzaChuZXcgSW5jbHVzaXZlVmFsaWRhdGlvbihpdGVtLm1pbkluY2x1c2l2ZSwgaXRlbS5tYXhJbmNsdXNpdmUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0ubWluRXhjbHVzaXZlICE9PSB1bmRlZmluZWQgfHwgaXRlbS5tYXhFeGNsdXNpdmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKG5ldyBFeGNsdXNpdmVWYWxpZGF0aW9uKGl0ZW0ubWluRXhjbHVzaXZlLCBpdGVtLm1heEV4Y2x1c2l2ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5lbnVtZXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25zLnB1c2gobmV3IEVudW1lcmF0aW9uVmFsaWRhdGlvbihpdGVtLmVudW1lcmF0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gSnNvblByb3BUeXBlcy5TdHJpbmcgfHwgaXRlbS5yZXBlYXRlZCB8fCBpdGVtLnR5cGUgPT09IEpzb25Qcm9wVHlwZXMuQW55KSB7XHJcbiAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoICE9PSB1bmRlZmluZWQgfHwgaXRlbS5taW5MZW5ndGggIT09IHVuZGVmaW5lZCB8fCBpdGVtLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25zLnB1c2gobmV3IExlbmd0aFZhbGlkYXRpb24oaXRlbS5sZW5ndGgsIGl0ZW0ubWluTGVuZ3RoLCBpdGVtLm1heExlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGF0aW9ucztcclxufVxyXG5jb25zdCBKc29uUHJvcCA9IChvcHRpb25zID0ge30pID0+ICh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XHJcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgQ2Fubm90IHNldCB0eXBlIGZvciAke3Byb3BlcnR5S2V5fSBwcm9wZXJ0eSBvZiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfSBzY2hlbWFgO1xyXG4gICAgbGV0IHNjaGVtYTtcclxuICAgIGlmICghc2NoZW1hU3RvcmFnZS5oYXModGFyZ2V0LmNvbnN0cnVjdG9yKSkge1xyXG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuY3JlYXRlKHRhcmdldC5jb25zdHJ1Y3Rvcik7XHJcbiAgICAgICAgc2NoZW1hU3RvcmFnZS5zZXQodGFyZ2V0LmNvbnN0cnVjdG9yLCBzY2hlbWEpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgc2NoZW1hID0gc2NoZW1hU3RvcmFnZS5nZXQodGFyZ2V0LmNvbnN0cnVjdG9yKTtcclxuICAgICAgICBpZiAoc2NoZW1hLnRhcmdldCAhPT0gdGFyZ2V0LmNvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYSA9IHNjaGVtYVN0b3JhZ2UuY3JlYXRlKHRhcmdldC5jb25zdHJ1Y3Rvcik7XHJcbiAgICAgICAgICAgIHNjaGVtYVN0b3JhZ2Uuc2V0KHRhcmdldC5jb25zdHJ1Y3Rvciwgc2NoZW1hKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZWZhdWx0U2NoZW1hID0ge1xyXG4gICAgICAgIHR5cGU6IEpzb25Qcm9wVHlwZXMuQW55LFxyXG4gICAgICAgIHZhbGlkYXRpb25zOiBbXSxcclxuICAgIH07XHJcbiAgICBjb25zdCBjb3B5T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdFNjaGVtYSwgb3B0aW9ucyk7XHJcbiAgICBjb3B5T3B0aW9ucy52YWxpZGF0aW9ucyA9IGdldFZhbGlkYXRpb25zKGNvcHlPcHRpb25zKTtcclxuICAgIGlmICh0eXBlb2YgY29weU9wdGlvbnMudHlwZSAhPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgIGlmICghc2NoZW1hU3RvcmFnZS5oYXMoY29weU9wdGlvbnMudHlwZSkgJiYgIWlzQ29udmVydGlibGUoY29weU9wdGlvbnMudHlwZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTWVzc2FnZX0uIEFzc2lnbmluZyB0eXBlIGRvZXNuJ3QgaGF2ZSBzY2hlbWEuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHNjaGVtYU5hbWVzO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5zY2hlbWEpKSB7XHJcbiAgICAgICAgc2NoZW1hTmFtZXMgPSBvcHRpb25zLnNjaGVtYTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHNjaGVtYU5hbWVzID0gW29wdGlvbnMuc2NoZW1hIHx8IERFRkFVTFRfU0NIRU1BXTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3Qgc2NoZW1hTmFtZSBvZiBzY2hlbWFOYW1lcykge1xyXG4gICAgICAgIGlmICghc2NoZW1hLm5hbWVzW3NjaGVtYU5hbWVdKSB7XHJcbiAgICAgICAgICAgIHNjaGVtYS5uYW1lc1tzY2hlbWFOYW1lXSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuYW1lZFNjaGVtYSA9IHNjaGVtYS5uYW1lc1tzY2hlbWFOYW1lXTtcclxuICAgICAgICBuYW1lZFNjaGVtYVtwcm9wZXJ0eUtleV0gPSBjb3B5T3B0aW9ucztcclxuICAgIH1cclxufTtcblxuZXhwb3J0IHsgSnNvbkVycm9yLCBKc29uUGFyc2VyLCBKc29uUHJvcCwgSnNvblByb3BUeXBlcywgSnNvblNlcmlhbGl6ZXIsIEtleUVycm9yLCBQYXJzZXJFcnJvciwgU2VyaWFsaXplckVycm9yLCBUcmFuc2Zvcm1FcnJvciwgVmFsaWRhdGlvbkVycm9yIH07XG4iLCAiLyohXG4gQ29weXJpZ2h0IChjKSBQZWN1bGlhciBWZW50dXJlcywgTExDXG4qL1xuXG5pbXBvcnQgeyBDb252ZXJ0LCBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIsIGNvbWJpbmUgfSBmcm9tICdwdnRzdXRpbHMnO1xuZXhwb3J0IHsgQnVmZmVyU291cmNlQ29udmVydGVyIH0gZnJvbSAncHZ0c3V0aWxzJztcbmltcG9ydCB7IEFzblByb3AsIEFzblByb3BUeXBlcywgQXNuVHlwZSwgQXNuVHlwZVR5cGVzLCBBc25JbnRlZ2VyQ29udmVydGVyLCBBc25TZXJpYWxpemVyLCBBc25Db252ZXJ0IH0gZnJvbSAnQHBlY3VsaWFyL2FzbjEtc2NoZW1hJztcbmltcG9ydCB7IF9fZGVjb3JhdGUgfSBmcm9tICd0c2xpYic7XG5pbXBvcnQgeyBKc29uUHJvcCwgSnNvblByb3BUeXBlcyB9IGZyb20gJ0BwZWN1bGlhci9qc29uLXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBhc24xIGZyb20gJ2FzbjFqcyc7XG5cbmNsYXNzIENyeXB0b0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG59XG5cbmNsYXNzIEFsZ29yaXRobUVycm9yIGV4dGVuZHMgQ3J5cHRvRXJyb3Ige1xyXG59XG5cbmNsYXNzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihtZXRob2ROYW1lKSB7XHJcbiAgICAgICAgc3VwZXIoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJHttZXRob2ROYW1lID8gYCR7bWV0aG9kTmFtZX1gIDogXCJcIn1gKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBPcGVyYXRpb25FcnJvciBleHRlbmRzIENyeXB0b0Vycm9yIHtcclxufVxuXG5jbGFzcyBSZXF1aXJlZFByb3BlcnR5RXJyb3IgZXh0ZW5kcyBDcnlwdG9FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wTmFtZSkge1xyXG4gICAgICAgIHN1cGVyKGAke3Byb3BOYW1lfTogTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eWApO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFBlbUNvbnZlcnRlciB7XHJcbiAgICBzdGF0aWMgdG9BcnJheUJ1ZmZlcihwZW0pIHtcclxuICAgICAgICBjb25zdCBiYXNlNjQgPSBwZW1cclxuICAgICAgICAgICAgLnJlcGxhY2UoLy17NX0oQkVHSU58RU5EKSAuKi17NX0vZywgXCJcIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoXCJcXHJcIiwgXCJcIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoXCJcXG5cIiwgXCJcIik7XHJcbiAgICAgICAgcmV0dXJuIENvbnZlcnQuRnJvbUJhc2U2NChiYXNlNjQpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHRvVWludDhBcnJheShwZW0pIHtcclxuICAgICAgICBjb25zdCBieXRlcyA9IHRoaXMudG9BcnJheUJ1ZmZlcihwZW0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShieXRlcyk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZnJvbUJ1ZmZlclNvdXJjZShidWZmZXIsIHRhZykge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NCA9IENvbnZlcnQuVG9CYXNlNjQoYnVmZmVyKTtcclxuICAgICAgICBsZXQgc2xpY2VkO1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xyXG4gICAgICAgIGNvbnN0IHJvd3MgPSBbXTtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICBzbGljZWQgPSBiYXNlNjQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgPSBvZmZzZXQgKyA2NCk7XHJcbiAgICAgICAgICAgIGlmIChzbGljZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByb3dzLnB1c2goc2xpY2VkKTtcclxuICAgICAgICAgICAgICAgIGlmIChzbGljZWQubGVuZ3RoIDwgNjQpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVwcGVyQ2FzZVRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiBgLS0tLS1CRUdJTiAke3VwcGVyQ2FzZVRhZ30tLS0tLVxcbiR7cm93cy5qb2luKFwiXFxuXCIpfVxcbi0tLS0tRU5EICR7dXBwZXJDYXNlVGFnfS0tLS0tYDtcclxuICAgIH1cclxuICAgIHN0YXRpYyBpc1BFTShkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIC8tLS0tLUJFR0lOIC4rLS0tLS1bQS1aYS16MC05K1xcL1xcK1xcPVxcc1xcbl0rLS0tLS1FTkQgListLS0tLS9pLnRlc3QoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0VGFnTmFtZShwZW0pIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNQRU0ocGVtKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgcGFyYW1ldGVyLiBJbmNvbWluZyBkYXRhIGlzIG5vdCByaWdodCBQRU1cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlcyA9IC8tLS0tLUJFR0lOICguKyktLS0tLS8uZXhlYyhwZW0pO1xyXG4gICAgICAgIGlmICghcmVzKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBnZXQgdGFnIGZyb20gUEVNXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzWzFdO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGhhc1RhZ05hbWUocGVtLCB0YWdOYW1lKSB7XHJcbiAgICAgICAgY29uc3QgdGFnID0gdGhpcy5nZXRUYWdOYW1lKHBlbSk7XHJcbiAgICAgICAgcmV0dXJuIHRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaXNDZXJ0aWZpY2F0ZShwZW0pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oYXNUYWdOYW1lKHBlbSwgXCJjZXJ0aWZpY2F0ZVwiKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBpc0NlcnRpZmljYXRlUmVxdWVzdChwZW0pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oYXNUYWdOYW1lKHBlbSwgXCJjZXJ0aWZpY2F0ZSByZXF1ZXN0XCIpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzQ1JMKHBlbSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhhc1RhZ05hbWUocGVtLCBcIng1MDkgY3JsXCIpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzUHVibGljS2V5KHBlbSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhhc1RhZ05hbWUocGVtLCBcInB1YmxpYyBrZXlcIik7XHJcbiAgICB9XHJcbn1cblxuZnVuY3Rpb24gaXNKV0soZGF0YSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwia3R5XCIgaW4gZGF0YTtcclxufVxuXG5jbGFzcyBQcm92aWRlckNyeXB0byB7XHJcbiAgICBhc3luYyBkaWdlc3QoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEaWdlc3QuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub25EaWdlc3QuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0RpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EaWdlc3QoYWxnb3JpdGhtLCBkYXRhKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJkaWdlc3RcIik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZW5lcmF0ZUtleSguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0dlbmVyYXRlS2V5LmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uR2VuZXJhdGVLZXkuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0dlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSk7XHJcbiAgICAgICAgaWYgKCEoa2V5VXNhZ2VzICYmIGtleVVzYWdlcy5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVzYWdlcyBjYW5ub3QgYmUgZW1wdHkgd2hlbiBjcmVhdGluZyBhIGtleS5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGFsbG93ZWRVc2FnZXM7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy51c2FnZXMpKSB7XHJcbiAgICAgICAgICAgIGFsbG93ZWRVc2FnZXMgPSB0aGlzLnVzYWdlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGFsbG93ZWRVc2FnZXMgPSB0aGlzLnVzYWdlcy5wcml2YXRlS2V5LmNvbmNhdCh0aGlzLnVzYWdlcy5wdWJsaWNLZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoZWNrS2V5VXNhZ2VzKGtleVVzYWdlcywgYWxsb3dlZFVzYWdlcyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvcihcImdlbmVyYXRlS2V5XCIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc2lnbiguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1NpZ24uYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub25TaWduLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tTaWduKGFsZ29yaXRobSwga2V5LCBkYXRhLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobU5hbWUoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXksIFwic2lnblwiKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uU2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSwgLi4uYXJncykge1xyXG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFwic2lnblwiKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHZlcmlmeSguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1ZlcmlmeS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vblZlcmlmeS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGNoZWNrVmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEsIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGtleSwgXCJ2ZXJpZnlcIik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJ2ZXJpZnlcIik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBlbmNyeXB0KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRW5jcnlwdC5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vbkVuY3J5cHQuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0VuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEsIG9wdGlvbnMgPSB7fSwgLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5LCBvcHRpb25zLmtleVVzYWdlID8gXCJlbmNyeXB0XCIgOiB2b2lkIDApO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJlbmNyeXB0XCIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZGVjcnlwdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0RlY3J5cHQuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub25EZWNyeXB0LmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tEZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhLCBvcHRpb25zID0ge30sIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtTmFtZShhbGdvcml0aG0pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGtleSwgb3B0aW9ucy5rZXlVc2FnZSA/IFwiZGVjcnlwdFwiIDogdm9pZCAwKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSwgLi4uYXJncykge1xyXG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yKFwiZGVjcnlwdFwiKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGRlcml2ZUJpdHMoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEZXJpdmVCaXRzLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uRGVyaXZlQml0cy5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGNoZWNrRGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCwgb3B0aW9ucyA9IHt9LCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobU5hbWUoYWxnb3JpdGhtKTtcclxuICAgICAgICB0aGlzLmNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShiYXNlS2V5LCBvcHRpb25zLmtleVVzYWdlID8gXCJkZXJpdmVCaXRzXCIgOiB2b2lkIDApO1xyXG4gICAgICAgIGlmIChsZW5ndGggJSA4ICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImxlbmd0aDogSXMgbm90IG11bHRpcGxlIG9mIDhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZXJpdmVCaXRzKGFsZ29yaXRobSwgYmFzZUtleSwgbGVuZ3RoLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJkZXJpdmVCaXRzXCIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZXhwb3J0S2V5KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRXhwb3J0S2V5LmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uRXhwb3J0S2V5LmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tFeHBvcnRLZXkoZm9ybWF0LCBrZXksIC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrS2V5Rm9ybWF0KGZvcm1hdCk7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGlmICgha2V5LmV4dHJhY3RhYmxlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBDcnlwdG9FcnJvcihcImtleTogSXMgbm90IGV4dHJhY3RhYmxlXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5LCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJleHBvcnRLZXlcIik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBpbXBvcnRLZXkoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tJbXBvcnRLZXkuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub25JbXBvcnRLZXkuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0ltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tLZXlGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgICB0aGlzLmNoZWNrS2V5RGF0YShmb3JtYXQsIGtleURhdGEpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0ltcG9ydFBhcmFtcyhhbGdvcml0aG0pO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudXNhZ2VzKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrS2V5VXNhZ2VzKGtleVVzYWdlcywgdGhpcy51c2FnZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5hcmdzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IoXCJpbXBvcnRLZXlcIik7XHJcbiAgICB9XHJcbiAgICBjaGVja0FsZ29yaXRobU5hbWUoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5uYW1lLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMubmFtZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBbGdvcml0aG1FcnJvcihcIlVucmVjb2duaXplZCBuYW1lXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgfVxyXG4gICAgY2hlY2tEZXJpdmVkS2V5UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgfVxyXG4gICAgY2hlY2tLZXlVc2FnZXModXNhZ2VzLCBhbGxvd2VkKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB1c2FnZSBvZiB1c2FnZXMpIHtcclxuICAgICAgICAgICAgaWYgKGFsbG93ZWQuaW5kZXhPZih1c2FnZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNyZWF0ZSBhIGtleSB1c2luZyB0aGUgc3BlY2lmaWVkIGtleSB1c2FnZXNcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0FsZ29yaXRobU5hbWUoa2V5LmFsZ29yaXRobSk7XHJcbiAgICAgICAgaWYgKGtleVVzYWdlICYmIGtleS51c2FnZXMuaW5kZXhPZihrZXlVc2FnZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBDcnlwdG9FcnJvcihga2V5IGRvZXMgbm90IG1hdGNoIHRoYXQgb2Ygb3BlcmF0aW9uYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2hlY2tSZXF1aXJlZFByb3BlcnR5KGRhdGEsIHByb3BOYW1lKSB7XHJcbiAgICAgICAgaWYgKCEocHJvcE5hbWUgaW4gZGF0YSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkUHJvcGVydHlFcnJvcihwcm9wTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobSwgaGFzaEFsZ29yaXRobXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaGFzaEFsZ29yaXRobXMpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udG9Mb3dlckNhc2UoKSA9PT0gYWxnb3JpdGhtLm5hbWUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihgaGFzaDogTXVzdCBiZSBvbmUgb2YgJHtoYXNoQWxnb3JpdGhtcy5qb2luKFwiLCBcIil9YCk7XHJcbiAgICB9XHJcbiAgICBjaGVja0ltcG9ydFBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgIH1cclxuICAgIGNoZWNrS2V5Rm9ybWF0KGZvcm1hdCkge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjpcclxuICAgICAgICAgICAgY2FzZSBcInBrY3M4XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJzcGtpXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImZvcm1hdDogSXMgaW52YWxpZCB2YWx1ZS4gTXVzdCBiZSAnandrJywgJ3JhdycsICdzcGtpJywgb3IgJ3BrY3M4J1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0tleURhdGEoZm9ybWF0LCBrZXlEYXRhKSB7XHJcbiAgICAgICAgaWYgKCFrZXlEYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXlEYXRhOiBDYW5ub3QgYmUgZW1wdHkgb24gZW1wdHkgb24ga2V5IGltcG9ydGluZ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJqd2tcIikge1xyXG4gICAgICAgICAgICBpZiAoIWlzSldLKGtleURhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5RGF0YTogSXMgbm90IEpzb25XZWJUb2tlblwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghQnVmZmVyU291cmNlQ29udmVydGVyLmlzQnVmZmVyU291cmNlKGtleURhdGEpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXlEYXRhOiBJcyBub3QgQXJyYXlCdWZmZXJWaWV3IG9yIEFycmF5QnVmZmVyXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByZXBhcmVEYXRhKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoZGF0YSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzUHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlckNyeXB0byB7XHJcbiAgICBjaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJsZW5ndGhcIik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0ubGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBvZiB0eXBlIE51bWJlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMTI4OlxyXG4gICAgICAgICAgICBjYXNlIDE5MjpcclxuICAgICAgICAgICAgY2FzZSAyNTY6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IE11c3QgYmUgMTI4LCAxOTIsIG9yIDI1NlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0Rlcml2ZWRLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzQ2JjUHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUNCQ1wiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIiwgXCJ3cmFwS2V5XCIsIFwidW53cmFwS2V5XCJdO1xyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcIml2XCIpO1xyXG4gICAgICAgIGlmICghKGFsZ29yaXRobS5pdiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhhbGdvcml0aG0uaXYpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXY6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbGdvcml0aG0uaXYuYnl0ZUxlbmd0aCAhPT0gMTYpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIml2OiBNdXN0IGhhdmUgbGVuZ3RoIDE2IGJ5dGVzXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBBZXNDbWFjUHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUNNQUNcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcInNpZ25cIiwgXCJ2ZXJpZnlcIl07XHJcbiAgICB9XHJcbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibGVuZ3RoXCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgYWxnb3JpdGhtLmxlbmd0aCAhPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGVuZ3RoOiBJcyBub3QgYSBOdW1iZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbGdvcml0aG0ubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoXCJsZW5ndGg6IE11c3QgYmUgbW9yZSB0aGFuIDBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEFlc0N0clByb3ZpZGVyIGV4dGVuZHMgQWVzUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkFFUy1DVFJcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCIsIFwid3JhcEtleVwiLCBcInVud3JhcEtleVwiXTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJjb3VudGVyXCIpO1xyXG4gICAgICAgIGlmICghKGFsZ29yaXRobS5jb3VudGVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KGFsZ29yaXRobS5jb3VudGVyKSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNvdW50ZXI6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbGdvcml0aG0uY291bnRlci5ieXRlTGVuZ3RoICE9PSAxNikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXY6IE11c3QgaGF2ZSBsZW5ndGggMTYgYnl0ZXNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJsZW5ndGhcIik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0ubGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBhIE51bWJlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImxlbmd0aDogTXVzdCBiZSBtb3JlIHRoYW4gMFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzRWNiUHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUVDQlwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIiwgXCJ3cmFwS2V5XCIsIFwidW53cmFwS2V5XCJdO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEFlc0djbVByb3ZpZGVyIGV4dGVuZHMgQWVzUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkFFUy1HQ01cIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCIsIFwid3JhcEtleVwiLCBcInVud3JhcEtleVwiXTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJpdlwiKTtcclxuICAgICAgICBpZiAoIShhbGdvcml0aG0uaXYgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYWxnb3JpdGhtLml2KSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIml2OiBJcyBub3Qgb2YgdHlwZSAnKEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyknXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWxnb3JpdGhtLml2LmJ5dGVMZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcIml2OiBNdXN0IGhhdmUgbGVuZ3RoIG1vcmUgdGhhbiAwIGFuZCBsZXNzIHRoYW4gMl42NCAtIDFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKFwidGFnTGVuZ3RoXCIgaW4gYWxnb3JpdGhtKSkge1xyXG4gICAgICAgICAgICBhbGdvcml0aG0udGFnTGVuZ3RoID0gMTI4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS50YWdMZW5ndGgpIHtcclxuICAgICAgICAgICAgY2FzZSAzMjpcclxuICAgICAgICAgICAgY2FzZSA2NDpcclxuICAgICAgICAgICAgY2FzZSA5NjpcclxuICAgICAgICAgICAgY2FzZSAxMDQ6XHJcbiAgICAgICAgICAgIGNhc2UgMTEyOlxyXG4gICAgICAgICAgICBjYXNlIDEyMDpcclxuICAgICAgICAgICAgY2FzZSAxMjg6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcInRhZ0xlbmd0aDogTXVzdCBiZSBvbmUgb2YgMzIsIDY0LCA5NiwgMTA0LCAxMTIsIDEyMCBvciAxMjhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEFlc0t3UHJvdmlkZXIgZXh0ZW5kcyBBZXNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiQUVTLUtXXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXCJ3cmFwS2V5XCIsIFwidW53cmFwS2V5XCJdO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIERlc1Byb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCIsIFwid3JhcEtleVwiLCBcInVud3JhcEtleVwiXTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIGlmICh0aGlzLml2U2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwiaXZcIik7XHJcbiAgICAgICAgICAgIGlmICghKGFsZ29yaXRobS5pdiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhhbGdvcml0aG0uaXYpKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIml2OiBJcyBub3Qgb2YgdHlwZSAnKEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyknXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhbGdvcml0aG0uaXYuYnl0ZUxlbmd0aCAhPT0gdGhpcy5pdlNpemUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGl2OiBNdXN0IGhhdmUgbGVuZ3RoICR7dGhpcy5pdlNpemV9IGJ5dGVzYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJsZW5ndGhcIik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0ubGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5vdCBvZiB0eXBlIE51bWJlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5sZW5ndGggIT09IHRoaXMua2V5U2l6ZUJpdHMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKGBhbGdvcml0aG0ubGVuZ3RoOiBNdXN0IGJlICR7dGhpcy5rZXlTaXplQml0c31gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0Rlcml2ZWRLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhUHJvdmlkZXIgZXh0ZW5kcyBQcm92aWRlckNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMuaGFzaEFsZ29yaXRobXMgPSBbXCJTSEEtMVwiLCBcIlNIQS0yNTZcIiwgXCJTSEEtMzg0XCIsIFwiU0hBLTUxMlwiXTtcclxuICAgIH1cclxuICAgIGNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XHJcbiAgICAgICAgdGhpcy5jaGVja0hhc2hBbGdvcml0aG0oYWxnb3JpdGhtLmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobXMpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJwdWJsaWNFeHBvbmVudFwiKTtcclxuICAgICAgICBpZiAoIShhbGdvcml0aG0ucHVibGljRXhwb25lbnQgJiYgYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50IGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInB1YmxpY0V4cG9uZW50OiBNaXNzaW5nIG9yIG5vdCBhIFVpbnQ4QXJyYXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHB1YmxpY0V4cG9uZW50ID0gQ29udmVydC5Ub0Jhc2U2NChhbGdvcml0aG0ucHVibGljRXhwb25lbnQpO1xyXG4gICAgICAgIGlmICghKHB1YmxpY0V4cG9uZW50ID09PSBcIkF3PT1cIiB8fCBwdWJsaWNFeHBvbmVudCA9PT0gXCJBUUFCXCIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJwdWJsaWNFeHBvbmVudDogTXVzdCBiZSBbM10gb3IgWzEsMCwxXVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcIm1vZHVsdXNMZW5ndGhcIik7XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoICUgOFxyXG4gICAgICAgICAgICB8fCBhbGdvcml0aG0ubW9kdWx1c0xlbmd0aCA8IDI1NlxyXG4gICAgICAgICAgICB8fCBhbGdvcml0aG0ubW9kdWx1c0xlbmd0aCA+IDE2Mzg0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgbW9kdWx1cyBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYml0cyBhbmQgPj0gMjU2IGFuZCA8PSAxNjM4NFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0ltcG9ydFBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwiaGFzaFwiKTtcclxuICAgICAgICB0aGlzLmNoZWNrSGFzaEFsZ29yaXRobShhbGdvcml0aG0uaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtcyk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhU3NhUHJvdmlkZXIgZXh0ZW5kcyBSc2FQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiUlNBU1NBLVBLQ1MxLXYxXzVcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogW1wic2lnblwiXSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBbXCJ2ZXJpZnlcIl0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBSc2FQc3NQcm92aWRlciBleHRlbmRzIFJzYVByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSU0EtUFNTXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcInNpZ25cIl0sXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogW1widmVyaWZ5XCJdLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwic2FsdExlbmd0aFwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIGFsZ29yaXRobS5zYWx0TGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJzYWx0TGVuZ3RoOiBJcyBub3QgYSBOdW1iZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbGdvcml0aG0uc2FsdExlbmd0aCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzYWx0TGVuZ3RoOiBNdXN0IGJlIHBvc2l0aXZlIG51bWJlclwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhT2FlcFByb3ZpZGVyIGV4dGVuZHMgUnNhUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIlJTQS1PQUVQXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcImRlY3J5cHRcIiwgXCJ1bndyYXBLZXlcIl0sXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogW1wiZW5jcnlwdFwiLCBcIndyYXBLZXlcIl0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIGlmIChhbGdvcml0aG0ubGFiZWxcclxuICAgICAgICAgICAgJiYgIShhbGdvcml0aG0ubGFiZWwgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoYWxnb3JpdGhtLmxhYmVsKSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxhYmVsOiBJcyBub3Qgb2YgdHlwZSAnKEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyknXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBFbGxpcHRpY1Byb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY2hlY2tHZW5lcmF0ZUtleVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibmFtZWRDdXJ2ZVwiKTtcclxuICAgICAgICB0aGlzLmNoZWNrTmFtZWRDdXJ2ZShhbGdvcml0aG0ubmFtZWRDdXJ2ZSk7XHJcbiAgICB9XHJcbiAgICBjaGVja05hbWVkQ3VydmUobmFtZWRDdXJ2ZSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLm5hbWVkQ3VydmVzKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnRvTG93ZXJDYXNlKCkgPT09IG5hbWVkQ3VydmUudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihgbmFtZWRDdXJ2ZTogTXVzdCBiZSBvbmUgb2YgJHt0aGlzLm5hbWVkQ3VydmVzLmpvaW4oXCIsIFwiKX1gKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBFY2RzYVByb3ZpZGVyIGV4dGVuZHMgRWxsaXB0aWNQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiRUNEU0FcIjtcclxuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1wiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIl07XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcInNpZ25cIl0sXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogW1widmVyaWZ5XCJdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5uYW1lZEN1cnZlcyA9IFtcIlAtMjU2XCIsIFwiUC0zODRcIiwgXCJQLTUyMVwiLCBcIkstMjU2XCJdO1xyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XHJcbiAgICAgICAgdGhpcy5jaGVja0hhc2hBbGdvcml0aG0oYWxnb3JpdGhtLmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobXMpO1xyXG4gICAgfVxyXG59XG5cbmNvbnN0IEtFWV9UWVBFUyA9IFtcInNlY3JldFwiLCBcInByaXZhdGVcIiwgXCJwdWJsaWNcIl07XHJcbmNsYXNzIENyeXB0b0tleSB7XHJcbiAgICBzdGF0aWMgY3JlYXRlKGFsZ29yaXRobSwgdHlwZSwgZXh0cmFjdGFibGUsIHVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyB0aGlzKCk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcclxuICAgICAgICBrZXkudHlwZSA9IHR5cGU7XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IHVzYWdlcztcclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzS2V5VHlwZShkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEtFWV9UWVBFUy5pbmRleE9mKGRhdGEpICE9PSAtMTtcclxuICAgIH1cclxuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcclxuICAgICAgICByZXR1cm4gXCJDcnlwdG9LZXlcIjtcclxuICAgIH1cclxufVxuXG5jbGFzcyBFY2RoUHJvdmlkZXIgZXh0ZW5kcyBFbGxpcHRpY1Byb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJFQ0RIXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcImRlcml2ZUJpdHNcIiwgXCJkZXJpdmVLZXlcIl0sXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm5hbWVkQ3VydmVzID0gW1wiUC0yNTZcIiwgXCJQLTM4NFwiLCBcIlAtNTIxXCIsIFwiSy0yNTZcIl07XHJcbiAgICB9XHJcbiAgICBjaGVja0FsZ29yaXRobVBhcmFtcyhhbGdvcml0aG0pIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwicHVibGljXCIpO1xyXG4gICAgICAgIGlmICghKGFsZ29yaXRobS5wdWJsaWMgaW5zdGFuY2VvZiBDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJwdWJsaWM6IElzIG5vdCBhIENyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5wdWJsaWMudHlwZSAhPT0gXCJwdWJsaWNcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoXCJwdWJsaWM6IElzIG5vdCBhIHB1YmxpYyBrZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbGdvcml0aG0ucHVibGljLmFsZ29yaXRobS5uYW1lICE9PSB0aGlzLm5hbWUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKGBwdWJsaWM6IElzIG5vdCAke3RoaXMubmFtZX0ga2V5YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVjZGhFc1Byb3ZpZGVyIGV4dGVuZHMgRWNkaFByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJFQ0RILUVTXCI7XHJcbiAgICAgICAgdGhpcy5uYW1lZEN1cnZlcyA9IFtcIlgyNTUxOVwiLCBcIlg0NDhcIl07XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgRWREc2FQcm92aWRlciBleHRlbmRzIEVsbGlwdGljUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkVkRFNBXCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcInNpZ25cIl0sXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogW1widmVyaWZ5XCJdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5uYW1lZEN1cnZlcyA9IFtcIkVkMjU1MTlcIiwgXCJFZDQ0OFwiXTtcclxuICAgIH1cclxufVxuXG5sZXQgT2JqZWN0SWRlbnRpZmllciA9IGNsYXNzIE9iamVjdElkZW50aWZpZXIge1xyXG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLk9iamVjdElkZW50aWZpZXIgfSlcclxuXSwgT2JqZWN0SWRlbnRpZmllci5wcm90b3R5cGUsIFwidmFsdWVcIiwgdm9pZCAwKTtcclxuT2JqZWN0SWRlbnRpZmllciA9IF9fZGVjb3JhdGUoW1xyXG4gICAgQXNuVHlwZSh7IHR5cGU6IEFzblR5cGVUeXBlcy5DaG9pY2UgfSlcclxuXSwgT2JqZWN0SWRlbnRpZmllcik7XG5cbmNsYXNzIEFsZ29yaXRobUlkZW50aWZpZXIge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBwYXJhbXMpO1xyXG4gICAgfVxyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7XHJcbiAgICAgICAgdHlwZTogQXNuUHJvcFR5cGVzLk9iamVjdElkZW50aWZpZXIsXHJcbiAgICB9KVxyXG5dLCBBbGdvcml0aG1JZGVudGlmaWVyLnByb3RvdHlwZSwgXCJhbGdvcml0aG1cIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHtcclxuICAgICAgICB0eXBlOiBBc25Qcm9wVHlwZXMuQW55LFxyXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxyXG4gICAgfSlcclxuXSwgQWxnb3JpdGhtSWRlbnRpZmllci5wcm90b3R5cGUsIFwicGFyYW1ldGVyc1wiLCB2b2lkIDApO1xuXG5jbGFzcyBQcml2YXRlS2V5SW5mbyB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnZlcnNpb24gPSAwO1xyXG4gICAgICAgIHRoaXMucHJpdmF0ZUtleUFsZ29yaXRobSA9IG5ldyBBbGdvcml0aG1JZGVudGlmaWVyKCk7XHJcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgfVxyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyIH0pXHJcbl0sIFByaXZhdGVLZXlJbmZvLnByb3RvdHlwZSwgXCJ2ZXJzaW9uXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFsZ29yaXRobUlkZW50aWZpZXIgfSlcclxuXSwgUHJpdmF0ZUtleUluZm8ucHJvdG90eXBlLCBcInByaXZhdGVLZXlBbGdvcml0aG1cIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLk9jdGV0U3RyaW5nIH0pXHJcbl0sIFByaXZhdGVLZXlJbmZvLnByb3RvdHlwZSwgXCJwcml2YXRlS2V5XCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5BbnksIG9wdGlvbmFsOiB0cnVlIH0pXHJcbl0sIFByaXZhdGVLZXlJbmZvLnByb3RvdHlwZSwgXCJhdHRyaWJ1dGVzXCIsIHZvaWQgMCk7XG5cbmNsYXNzIFB1YmxpY0tleUluZm8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBuZXcgQWxnb3JpdGhtSWRlbnRpZmllcigpO1xyXG4gICAgICAgIHRoaXMucHVibGljS2V5ID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgfVxyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFsZ29yaXRobUlkZW50aWZpZXIgfSlcclxuXSwgUHVibGljS2V5SW5mby5wcm90b3R5cGUsIFwicHVibGljS2V5QWxnb3JpdGhtXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5CaXRTdHJpbmcgfSlcclxuXSwgUHVibGljS2V5SW5mby5wcm90b3R5cGUsIFwicHVibGljS2V5XCIsIHZvaWQgMCk7XG5cbmNvbnN0IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciA9IHtcclxuICAgIGZyb21KU09OOiAodmFsdWUpID0+IENvbnZlcnQuRnJvbUJhc2U2NFVybCh2YWx1ZSksXHJcbiAgICB0b0pTT046ICh2YWx1ZSkgPT4gQ29udmVydC5Ub0Jhc2U2NFVybChuZXcgVWludDhBcnJheSh2YWx1ZSkpLFxyXG59O1xuXG5jb25zdCBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgPSB7XHJcbiAgICBmcm9tQVNOOiAodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZUhleCA9IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXg7XHJcbiAgICAgICAgcmV0dXJuICEobmV3IFVpbnQ4QXJyYXkodmFsdWVIZXgpWzBdKVxyXG4gICAgICAgICAgICA/IHZhbHVlLnZhbHVlQmxvY2sudmFsdWVIZXguc2xpY2UoMSlcclxuICAgICAgICAgICAgOiB2YWx1ZS52YWx1ZUJsb2NrLnZhbHVlSGV4O1xyXG4gICAgfSxcclxuICAgIHRvQVNOOiAodmFsdWUpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZUhleCA9IG5ldyBVaW50OEFycmF5KHZhbHVlKVswXSA+IDEyN1xyXG4gICAgICAgICAgICA/IGNvbWJpbmUobmV3IFVpbnQ4QXJyYXkoWzBdKS5idWZmZXIsIHZhbHVlKVxyXG4gICAgICAgICAgICA6IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBuZXcgYXNuMS5JbnRlZ2VyKHsgdmFsdWVIZXggfSk7XHJcbiAgICB9LFxyXG59O1xuXG52YXIgaW5kZXgkMyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlcixcbiAgQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXJcbn0pO1xuXG5jbGFzcyBSc2FQcml2YXRlS2V5IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IDA7XHJcbiAgICAgICAgdGhpcy5tb2R1bHVzID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgICAgIHRoaXMucHVibGljRXhwb25lbnQgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5wcml2YXRlRXhwb25lbnQgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5wcmltZTEgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5wcmltZTIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5leHBvbmVudDEgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5leHBvbmVudDIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5jb2VmZmljaWVudCA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgIH1cclxufVxyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQ29udmVydGVyIH0pXHJcbl0sIFJzYVByaXZhdGVLZXkucHJvdG90eXBlLCBcInZlcnNpb25cIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyIH0pLFxyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcIm5cIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcclxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwibW9kdWx1c1wiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwiZVwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxyXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJwdWJsaWNFeHBvbmVudFwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwiZFwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxyXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJwcml2YXRlRXhwb25lbnRcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyIH0pLFxyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcInBcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcclxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwicHJpbWUxXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJxXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXHJcbl0sIFJzYVByaXZhdGVLZXkucHJvdG90eXBlLCBcInByaW1lMlwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSksXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwiZHBcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcclxuXSwgUnNhUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwiZXhwb25lbnQxXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJkcVwiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxBcnJheUJ1ZmZlckNvbnZlcnRlciB9KVxyXG5dLCBSc2FQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJleHBvbmVudDJcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyIH0pLFxyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcInFpXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXHJcbl0sIFJzYVByaXZhdGVLZXkucHJvdG90eXBlLCBcImNvZWZmaWNpZW50XCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5BbnksIG9wdGlvbmFsOiB0cnVlIH0pXHJcbl0sIFJzYVByaXZhdGVLZXkucHJvdG90eXBlLCBcIm90aGVyUHJpbWVJbmZvc1wiLCB2b2lkIDApO1xuXG5jbGFzcyBSc2FQdWJsaWNLZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5tb2R1bHVzID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgICAgIHRoaXMucHVibGljRXhwb25lbnQgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICB9XHJcbn1cclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckFycmF5QnVmZmVyQ29udmVydGVyIH0pLFxyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcIm5cIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQXJyYXlCdWZmZXJDb252ZXJ0ZXIgfSlcclxuXSwgUnNhUHVibGljS2V5LnByb3RvdHlwZSwgXCJtb2R1bHVzXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJBcnJheUJ1ZmZlckNvbnZlcnRlciB9KSxcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJlXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXHJcbl0sIFJzYVB1YmxpY0tleS5wcm90b3R5cGUsIFwicHVibGljRXhwb25lbnRcIiwgdm9pZCAwKTtcblxubGV0IEVjUHVibGljS2V5ID0gY2xhc3MgRWNQdWJsaWNLZXkge1xyXG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIGlmIChieXRlc1swXSAhPT0gMHgwNCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3J5cHRvRXJyb3IoXCJXcm9uZyBFQ1BvaW50LiBDdXJyZW50IHZlcnNpb24gc3VwcG9ydHMgb25seSBVbmNvbXByZXNzZWQgKDB4MDQpIHBvaW50XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KHRoaXMudmFsdWUuc2xpY2UoMSkpO1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSBieXRlcy5sZW5ndGggLyAyO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDA7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHtcclxuICAgICAgICAgICAgeDogQ29udmVydC5Ub0Jhc2U2NFVybChieXRlcy5idWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplKSksXHJcbiAgICAgICAgICAgIHk6IENvbnZlcnQuVG9CYXNlNjRVcmwoYnl0ZXMuYnVmZmVyLnNsaWNlKG9mZnNldCArIHNpemUsIG9mZnNldCArIHNpemUgKyBzaXplKSksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4ganNvbjtcclxuICAgIH1cclxuICAgIGZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBpZiAoIShcInhcIiBpbiBqc29uKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ4OiBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIShcInlcIiBpbiBqc29uKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ5OiBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB4ID0gQ29udmVydC5Gcm9tQmFzZTY0VXJsKGpzb24ueCk7XHJcbiAgICAgICAgY29uc3QgeSA9IENvbnZlcnQuRnJvbUJhc2U2NFVybChqc29uLnkpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29tYmluZShuZXcgVWludDhBcnJheShbMHgwNF0pLmJ1ZmZlciwgeCwgeSk7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBVaW50OEFycmF5KHZhbHVlKS5idWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn07XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5PY3RldFN0cmluZyB9KVxyXG5dLCBFY1B1YmxpY0tleS5wcm90b3R5cGUsIFwidmFsdWVcIiwgdm9pZCAwKTtcclxuRWNQdWJsaWNLZXkgPSBfX2RlY29yYXRlKFtcclxuICAgIEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuQ2hvaWNlIH0pXHJcbl0sIEVjUHVibGljS2V5KTtcblxuY2xhc3MgRWNQcml2YXRlS2V5IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IDE7XHJcbiAgICAgICAgdGhpcy5wcml2YXRlS2V5ID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICghKFwiZFwiIGluIGpzb24pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImQ6IE1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJpdmF0ZUtleSA9IENvbnZlcnQuRnJvbUJhc2U2NFVybChqc29uLmQpO1xyXG4gICAgICAgIGlmIChcInhcIiBpbiBqc29uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBFY1B1YmxpY0tleSgpO1xyXG4gICAgICAgICAgICBwdWJsaWNLZXkuZnJvbUpTT04oanNvbik7XHJcbiAgICAgICAgICAgIHRoaXMucHVibGljS2V5ID0gQXNuU2VyaWFsaXplci50b0FTTihwdWJsaWNLZXkpLnZhbHVlQmxvY2sudmFsdWVIZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGp3ayA9IHt9O1xyXG4gICAgICAgIGp3ay5kID0gQ29udmVydC5Ub0Jhc2U2NFVybCh0aGlzLnByaXZhdGVLZXkpO1xyXG4gICAgICAgIGlmICh0aGlzLnB1YmxpY0tleSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGp3aywgbmV3IEVjUHVibGljS2V5KHRoaXMucHVibGljS2V5KS50b0pTT04oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqd2s7XHJcbiAgICB9XHJcbn1cclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkludGVnZXIsIGNvbnZlcnRlcjogQXNuSW50ZWdlckNvbnZlcnRlciB9KVxyXG5dLCBFY1ByaXZhdGVLZXkucHJvdG90eXBlLCBcInZlcnNpb25cIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLk9jdGV0U3RyaW5nIH0pXHJcbl0sIEVjUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwicHJpdmF0ZUtleVwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyBjb250ZXh0OiAwLCB0eXBlOiBBc25Qcm9wVHlwZXMuQW55LCBvcHRpb25hbDogdHJ1ZSB9KVxyXG5dLCBFY1ByaXZhdGVLZXkucHJvdG90eXBlLCBcInBhcmFtZXRlcnNcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgY29udGV4dDogMSwgdHlwZTogQXNuUHJvcFR5cGVzLkJpdFN0cmluZywgb3B0aW9uYWw6IHRydWUgfSlcclxuXSwgRWNQcml2YXRlS2V5LnByb3RvdHlwZSwgXCJwdWJsaWNLZXlcIiwgdm9pZCAwKTtcblxuY29uc3QgQXNuSW50ZWdlcldpdGhvdXRQYWRkaW5nQ29udmVydGVyID0ge1xyXG4gICAgZnJvbUFTTjogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh2YWx1ZS52YWx1ZUJsb2NrLnZhbHVlSGV4KTtcclxuICAgICAgICByZXR1cm4gKGJ5dGVzWzBdID09PSAwKVxyXG4gICAgICAgICAgICA/IGJ5dGVzLmJ1ZmZlci5zbGljZSgxKVxyXG4gICAgICAgICAgICA6IGJ5dGVzLmJ1ZmZlcjtcclxuICAgIH0sXHJcbiAgICB0b0FTTjogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKGJ5dGVzWzBdID4gMTI3KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMubGVuZ3RoICsgMSk7XHJcbiAgICAgICAgICAgIG5ld1ZhbHVlLnNldChieXRlcywgMSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgYXNuMS5JbnRlZ2VyKHsgdmFsdWVIZXg6IG5ld1ZhbHVlLmJ1ZmZlciB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBhc24xLkludGVnZXIoeyB2YWx1ZUhleDogdmFsdWUgfSk7XHJcbiAgICB9LFxyXG59O1xuXG52YXIgaW5kZXgkMiA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBBc25JbnRlZ2VyV2l0aG91dFBhZGRpbmdDb252ZXJ0ZXI6IEFzbkludGVnZXJXaXRob3V0UGFkZGluZ0NvbnZlcnRlclxufSk7XG5cbmNsYXNzIEVjVXRpbHMge1xyXG4gICAgc3RhdGljIGRlY29kZVBvaW50KGRhdGEsIHBvaW50U2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IHZpZXcgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGRhdGEpO1xyXG4gICAgICAgIGlmICgodmlldy5sZW5ndGggPT09IDApIHx8ICh2aWV3WzBdICE9PSA0KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IHVuY29tcHJlc3NlZCBwb2ludCBmb3JtYXQgc3VwcG9ydGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuID0gKHZpZXcubGVuZ3RoIC0gMSkgLyAyO1xyXG4gICAgICAgIGlmIChuICE9PSAoTWF0aC5jZWlsKHBvaW50U2l6ZSAvIDgpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQb2ludCBkb2VzIG5vdCBtYXRjaCBmaWVsZCBzaXplXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB4YiA9IHZpZXcuc2xpY2UoMSwgbiArIDEpO1xyXG4gICAgICAgIGNvbnN0IHliID0gdmlldy5zbGljZShuICsgMSwgbiArIDEgKyBuKTtcclxuICAgICAgICByZXR1cm4geyB4OiB4YiwgeTogeWIgfTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBlbmNvZGVQb2ludChwb2ludCwgcG9pbnRTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IE1hdGguY2VpbChwb2ludFNpemUgLyA4KTtcclxuICAgICAgICBpZiAocG9pbnQueC5ieXRlTGVuZ3RoICE9PSBzaXplIHx8IHBvaW50LnkuYnl0ZUxlbmd0aCAhPT0gc2l6ZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJYLFkgY29vcmRpbmF0ZXMgZG9uJ3QgbWF0Y2ggcG9pbnQgc2l6ZSBjcml0ZXJpYVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeCA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkocG9pbnQueCk7XHJcbiAgICAgICAgY29uc3QgeSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkocG9pbnQueSk7XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIDIgKyAxKTtcclxuICAgICAgICByZXNbMF0gPSA0O1xyXG4gICAgICAgIHJlcy5zZXQoeCwgMSk7XHJcbiAgICAgICAgcmVzLnNldCh5LCBzaXplICsgMSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBnZXRTaXplKHBvaW50U2l6ZSkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwocG9pbnRTaXplIC8gOCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZW5jb2RlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9pbnRTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShwb2ludFNpemUpO1xyXG4gICAgICAgIGNvbnN0IHIgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KHNpZ25hdHVyZS5yKTtcclxuICAgICAgICBjb25zdCBzID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvVWludDhBcnJheShzaWduYXR1cmUucyk7XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIDIpO1xyXG4gICAgICAgIHJlcy5zZXQodGhpcy5wYWRTdGFydChyLCBzaXplKSk7XHJcbiAgICAgICAgcmVzLnNldCh0aGlzLnBhZFN0YXJ0KHMsIHNpemUpLCBzaXplKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGRlY29kZVNpZ25hdHVyZShkYXRhLCBwb2ludFNpemUpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5nZXRTaXplKHBvaW50U2l6ZSk7XHJcbiAgICAgICAgY29uc3QgdmlldyA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b1VpbnQ4QXJyYXkoZGF0YSk7XHJcbiAgICAgICAgaWYgKHZpZXcubGVuZ3RoICE9PSAoc2l6ZSAqIDIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCBzaXplIG9mIHRoZSBzaWduYXR1cmVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHIgPSB2aWV3LnNsaWNlKDAsIHNpemUpO1xyXG4gICAgICAgIGNvbnN0IHMgPSB2aWV3LnNsaWNlKHNpemUpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHI6IHRoaXMudHJpbVN0YXJ0KHIpLFxyXG4gICAgICAgICAgICBzOiB0aGlzLnRyaW1TdGFydChzKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHRyaW1TdGFydChkYXRhKSB7XHJcbiAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgIHdoaWxlICgoaSA8IGRhdGEubGVuZ3RoIC0gMSkgJiYgKGRhdGFbaV0gPT09IDApKSB7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGkgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhLnNsaWNlKGksIGRhdGEubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBwYWRTdGFydChkYXRhLCBzaXplKSB7XHJcbiAgICAgICAgaWYgKHNpemUgPT09IGRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShzaXplKTtcclxuICAgICAgICByZXMuc2V0KGRhdGEsIHNpemUgLSBkYXRhLmxlbmd0aCk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxufVxuXG5jbGFzcyBFY0RzYVNpZ25hdHVyZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgdGhpcy5zID0gbmV3IEFycmF5QnVmZmVyKDApO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21XZWJDcnlwdG9TaWduYXR1cmUodmFsdWUpIHtcclxuICAgICAgICBjb25zdCBwb2ludFNpemUgPSB2YWx1ZS5ieXRlTGVuZ3RoIC8gMjtcclxuICAgICAgICBjb25zdCBwb2ludCA9IEVjVXRpbHMuZGVjb2RlU2lnbmF0dXJlKHZhbHVlLCBwb2ludFNpemUgKiA4KTtcclxuICAgICAgICBjb25zdCBlY1NpZ25hdHVyZSA9IG5ldyBFY0RzYVNpZ25hdHVyZSgpO1xyXG4gICAgICAgIGVjU2lnbmF0dXJlLnIgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihwb2ludC5yKTtcclxuICAgICAgICBlY1NpZ25hdHVyZS5zID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIocG9pbnQucyk7XHJcbiAgICAgICAgcmV0dXJuIGVjU2lnbmF0dXJlO1xyXG4gICAgfVxyXG4gICAgdG9XZWJDcnlwdG9TaWduYXR1cmUocG9pbnRTaXplKSB7XHJcbiAgICAgICAgcG9pbnRTaXplICE9PSBudWxsICYmIHBvaW50U2l6ZSAhPT0gdm9pZCAwID8gcG9pbnRTaXplIDogKHBvaW50U2l6ZSA9IE1hdGgubWF4KHRoaXMuci5ieXRlTGVuZ3RoLCB0aGlzLnMuYnl0ZUxlbmd0aCkgKiA4KTtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBFY1V0aWxzLmVuY29kZVNpZ25hdHVyZSh0aGlzLCBwb2ludFNpemUpO1xyXG4gICAgICAgIHJldHVybiBzaWduYXR1cmUuYnVmZmVyO1xyXG4gICAgfVxyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5JbnRlZ2VyLCBjb252ZXJ0ZXI6IEFzbkludGVnZXJXaXRob3V0UGFkZGluZ0NvbnZlcnRlciB9KVxyXG5dLCBFY0RzYVNpZ25hdHVyZS5wcm90b3R5cGUsIFwiclwiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyB0eXBlOiBBc25Qcm9wVHlwZXMuSW50ZWdlciwgY29udmVydGVyOiBBc25JbnRlZ2VyV2l0aG91dFBhZGRpbmdDb252ZXJ0ZXIgfSlcclxuXSwgRWNEc2FTaWduYXR1cmUucHJvdG90eXBlLCBcInNcIiwgdm9pZCAwKTtcblxuY2xhc3MgT25lQXN5bW1ldHJpY0tleSBleHRlbmRzIFByaXZhdGVLZXlJbmZvIHtcclxufVxyXG5fX2RlY29yYXRlKFtcclxuICAgIEFzblByb3AoeyBjb250ZXh0OiAxLCBpbXBsaWNpdDogdHJ1ZSwgdHlwZTogQXNuUHJvcFR5cGVzLkJpdFN0cmluZywgb3B0aW9uYWw6IHRydWUgfSlcclxuXSwgT25lQXN5bW1ldHJpY0tleS5wcm90b3R5cGUsIFwicHVibGljS2V5XCIsIHZvaWQgMCk7XG5cbmxldCBFZFByaXZhdGVLZXkgPSBjbGFzcyBFZFByaXZhdGVLZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgIH1cclxuICAgIGZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBpZiAoIWpzb24uZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkOiBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZhbHVlID0gQ29udmVydC5Gcm9tQmFzZTY0VXJsKGpzb24uZCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3QgandrID0ge1xyXG4gICAgICAgICAgICBkOiBDb252ZXJ0LlRvQmFzZTY0VXJsKHRoaXMudmFsdWUpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGp3aztcclxuICAgIH1cclxufTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLk9jdGV0U3RyaW5nIH0pXHJcbl0sIEVkUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwidmFsdWVcIiwgdm9pZCAwKTtcclxuRWRQcml2YXRlS2V5ID0gX19kZWNvcmF0ZShbXHJcbiAgICBBc25UeXBlKHsgdHlwZTogQXNuVHlwZVR5cGVzLkNob2ljZSB9KVxyXG5dLCBFZFByaXZhdGVLZXkpO1xuXG5sZXQgRWRQdWJsaWNLZXkgPSBjbGFzcyBFZFB1YmxpY0tleSB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHtcclxuICAgICAgICAgICAgeDogQ29udmVydC5Ub0Jhc2U2NFVybCh0aGlzLnZhbHVlKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBqc29uO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICghKFwieFwiIGluIGpzb24pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIng6IE1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFsdWUgPSBDb252ZXJ0LkZyb21CYXNlNjRVcmwoanNvbi54KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBBc25Qcm9wKHsgdHlwZTogQXNuUHJvcFR5cGVzLkJpdFN0cmluZyB9KVxyXG5dLCBFZFB1YmxpY0tleS5wcm90b3R5cGUsIFwidmFsdWVcIiwgdm9pZCAwKTtcclxuRWRQdWJsaWNLZXkgPSBfX2RlY29yYXRlKFtcclxuICAgIEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuQ2hvaWNlIH0pXHJcbl0sIEVkUHVibGljS2V5KTtcblxubGV0IEN1cnZlUHJpdmF0ZUtleSA9IGNsYXNzIEN1cnZlUHJpdmF0ZUtleSB7XHJcbn07XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgQXNuUHJvcCh7IHR5cGU6IEFzblByb3BUeXBlcy5PY3RldFN0cmluZyB9KSxcclxuICAgIEpzb25Qcm9wKHsgdHlwZTogSnNvblByb3BUeXBlcy5TdHJpbmcsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybEFycmF5QnVmZmVyQ29udmVydGVyIH0pXHJcbl0sIEN1cnZlUHJpdmF0ZUtleS5wcm90b3R5cGUsIFwiZFwiLCB2b2lkIDApO1xyXG5DdXJ2ZVByaXZhdGVLZXkgPSBfX2RlY29yYXRlKFtcclxuICAgIEFzblR5cGUoeyB0eXBlOiBBc25UeXBlVHlwZXMuQ2hvaWNlIH0pXHJcbl0sIEN1cnZlUHJpdmF0ZUtleSk7XG5cbmNvbnN0IGlkU2VjcDI1NnIxID0gXCIxLjIuODQwLjEwMDQ1LjMuMS43XCI7XHJcbmNvbnN0IGlkRWxsaXB0aWNDdXJ2ZSA9IFwiMS4zLjEzMi4wXCI7XHJcbmNvbnN0IGlkU2VjcDM4NHIxID0gYCR7aWRFbGxpcHRpY0N1cnZlfS4zNGA7XHJcbmNvbnN0IGlkU2VjcDUyMXIxID0gYCR7aWRFbGxpcHRpY0N1cnZlfS4zNWA7XHJcbmNvbnN0IGlkU2VjcDI1NmsxID0gYCR7aWRFbGxpcHRpY0N1cnZlfS4xMGA7XHJcbmNvbnN0IGlkVmVyc2lvbk9uZSA9IFwiMS4zLjM2LjMuMy4yLjguMS4xXCI7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDE2MHIxID0gYCR7aWRWZXJzaW9uT25lfS4xYDtcclxuY29uc3QgaWRCcmFpbnBvb2xQMTYwdDEgPSBgJHtpZFZlcnNpb25PbmV9LjJgO1xyXG5jb25zdCBpZEJyYWlucG9vbFAxOTJyMSA9IGAke2lkVmVyc2lvbk9uZX0uM2A7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDE5MnQxID0gYCR7aWRWZXJzaW9uT25lfS40YDtcclxuY29uc3QgaWRCcmFpbnBvb2xQMjI0cjEgPSBgJHtpZFZlcnNpb25PbmV9LjVgO1xyXG5jb25zdCBpZEJyYWlucG9vbFAyMjR0MSA9IGAke2lkVmVyc2lvbk9uZX0uNmA7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDI1NnIxID0gYCR7aWRWZXJzaW9uT25lfS43YDtcclxuY29uc3QgaWRCcmFpbnBvb2xQMjU2dDEgPSBgJHtpZFZlcnNpb25PbmV9LjhgO1xyXG5jb25zdCBpZEJyYWlucG9vbFAzMjByMSA9IGAke2lkVmVyc2lvbk9uZX0uOWA7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDMyMHQxID0gYCR7aWRWZXJzaW9uT25lfS4xMGA7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDM4NHIxID0gYCR7aWRWZXJzaW9uT25lfS4xMWA7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDM4NHQxID0gYCR7aWRWZXJzaW9uT25lfS4xMmA7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDUxMnIxID0gYCR7aWRWZXJzaW9uT25lfS4xM2A7XHJcbmNvbnN0IGlkQnJhaW5wb29sUDUxMnQxID0gYCR7aWRWZXJzaW9uT25lfS4xNGA7XHJcbmNvbnN0IGlkWDI1NTE5ID0gXCIxLjMuMTAxLjExMFwiO1xyXG5jb25zdCBpZFg0NDggPSBcIjEuMy4xMDEuMTExXCI7XHJcbmNvbnN0IGlkRWQyNTUxOSA9IFwiMS4zLjEwMS4xMTJcIjtcclxuY29uc3QgaWRFZDQ0OCA9IFwiMS4zLjEwMS4xMTNcIjtcblxudmFyIGluZGV4JDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgY29udmVydGVyczogaW5kZXgkMixcbiAgZ2V0IE9iamVjdElkZW50aWZpZXIgKCkgeyByZXR1cm4gT2JqZWN0SWRlbnRpZmllcjsgfSxcbiAgQWxnb3JpdGhtSWRlbnRpZmllcjogQWxnb3JpdGhtSWRlbnRpZmllcixcbiAgUHJpdmF0ZUtleUluZm86IFByaXZhdGVLZXlJbmZvLFxuICBQdWJsaWNLZXlJbmZvOiBQdWJsaWNLZXlJbmZvLFxuICBSc2FQcml2YXRlS2V5OiBSc2FQcml2YXRlS2V5LFxuICBSc2FQdWJsaWNLZXk6IFJzYVB1YmxpY0tleSxcbiAgRWNQcml2YXRlS2V5OiBFY1ByaXZhdGVLZXksXG4gIGdldCBFY1B1YmxpY0tleSAoKSB7IHJldHVybiBFY1B1YmxpY0tleTsgfSxcbiAgRWNEc2FTaWduYXR1cmU6IEVjRHNhU2lnbmF0dXJlLFxuICBPbmVBc3ltbWV0cmljS2V5OiBPbmVBc3ltbWV0cmljS2V5LFxuICBnZXQgRWRQcml2YXRlS2V5ICgpIHsgcmV0dXJuIEVkUHJpdmF0ZUtleTsgfSxcbiAgZ2V0IEVkUHVibGljS2V5ICgpIHsgcmV0dXJuIEVkUHVibGljS2V5OyB9LFxuICBnZXQgQ3VydmVQcml2YXRlS2V5ICgpIHsgcmV0dXJuIEN1cnZlUHJpdmF0ZUtleTsgfSxcbiAgaWRTZWNwMjU2cjE6IGlkU2VjcDI1NnIxLFxuICBpZEVsbGlwdGljQ3VydmU6IGlkRWxsaXB0aWNDdXJ2ZSxcbiAgaWRTZWNwMzg0cjE6IGlkU2VjcDM4NHIxLFxuICBpZFNlY3A1MjFyMTogaWRTZWNwNTIxcjEsXG4gIGlkU2VjcDI1NmsxOiBpZFNlY3AyNTZrMSxcbiAgaWRWZXJzaW9uT25lOiBpZFZlcnNpb25PbmUsXG4gIGlkQnJhaW5wb29sUDE2MHIxOiBpZEJyYWlucG9vbFAxNjByMSxcbiAgaWRCcmFpbnBvb2xQMTYwdDE6IGlkQnJhaW5wb29sUDE2MHQxLFxuICBpZEJyYWlucG9vbFAxOTJyMTogaWRCcmFpbnBvb2xQMTkycjEsXG4gIGlkQnJhaW5wb29sUDE5MnQxOiBpZEJyYWlucG9vbFAxOTJ0MSxcbiAgaWRCcmFpbnBvb2xQMjI0cjE6IGlkQnJhaW5wb29sUDIyNHIxLFxuICBpZEJyYWlucG9vbFAyMjR0MTogaWRCcmFpbnBvb2xQMjI0dDEsXG4gIGlkQnJhaW5wb29sUDI1NnIxOiBpZEJyYWlucG9vbFAyNTZyMSxcbiAgaWRCcmFpbnBvb2xQMjU2dDE6IGlkQnJhaW5wb29sUDI1NnQxLFxuICBpZEJyYWlucG9vbFAzMjByMTogaWRCcmFpbnBvb2xQMzIwcjEsXG4gIGlkQnJhaW5wb29sUDMyMHQxOiBpZEJyYWlucG9vbFAzMjB0MSxcbiAgaWRCcmFpbnBvb2xQMzg0cjE6IGlkQnJhaW5wb29sUDM4NHIxLFxuICBpZEJyYWlucG9vbFAzODR0MTogaWRCcmFpbnBvb2xQMzg0dDEsXG4gIGlkQnJhaW5wb29sUDUxMnIxOiBpZEJyYWlucG9vbFA1MTJyMSxcbiAgaWRCcmFpbnBvb2xQNTEydDE6IGlkQnJhaW5wb29sUDUxMnQxLFxuICBpZFgyNTUxOTogaWRYMjU1MTksXG4gIGlkWDQ0ODogaWRYNDQ4LFxuICBpZEVkMjU1MTk6IGlkRWQyNTUxOSxcbiAgaWRFZDQ0ODogaWRFZDQ0OFxufSk7XG5cbmNsYXNzIEVjQ3VydmVzIHtcclxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XHJcbiAgICBzdGF0aWMgcmVnaXN0ZXIoaXRlbSkge1xyXG4gICAgICAgIGNvbnN0IG9pZCA9IG5ldyBPYmplY3RJZGVudGlmaWVyKCk7XHJcbiAgICAgICAgb2lkLnZhbHVlID0gaXRlbS5pZDtcclxuICAgICAgICBjb25zdCByYXcgPSBBc25Db252ZXJ0LnNlcmlhbGl6ZShvaWQpO1xyXG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgIHJhdyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm5hbWVzLnB1c2goaXRlbS5uYW1lKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmaW5kKG5hbWVPcklkKSB7XHJcbiAgICAgICAgbmFtZU9ySWQgPSBuYW1lT3JJZC50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLm5hbWUudG9VcHBlckNhc2UoKSA9PT0gbmFtZU9ySWQgfHwgaXRlbS5pZC50b1VwcGVyQ2FzZSgpID09PSBuYW1lT3JJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0KG5hbWVPcklkKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5maW5kKG5hbWVPcklkKTtcclxuICAgICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEVDIG5hbWVkIGN1cnZlICcke25hbWVPcklkfSdgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxufVxyXG5FY0N1cnZlcy5pdGVtcyA9IFtdO1xyXG5FY0N1cnZlcy5uYW1lcyA9IFtdO1xyXG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiUC0yNTZcIiwgaWQ6IGlkU2VjcDI1NnIxLCBzaXplOiAyNTYgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJQLTM4NFwiLCBpZDogaWRTZWNwMzg0cjEsIHNpemU6IDM4NCB9KTtcclxuRWNDdXJ2ZXMucmVnaXN0ZXIoeyBuYW1lOiBcIlAtNTIxXCIsIGlkOiBpZFNlY3A1MjFyMSwgc2l6ZTogNTIxIH0pO1xyXG5FY0N1cnZlcy5yZWdpc3Rlcih7IG5hbWU6IFwiSy0yNTZcIiwgaWQ6IGlkU2VjcDI1NmsxLCBzaXplOiAyNTYgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMTYwcjFcIiwgaWQ6IGlkQnJhaW5wb29sUDE2MHIxLCBzaXplOiAxNjAgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMTYwdDFcIiwgaWQ6IGlkQnJhaW5wb29sUDE2MHQxLCBzaXplOiAxNjAgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMTkycjFcIiwgaWQ6IGlkQnJhaW5wb29sUDE5MnIxLCBzaXplOiAxOTIgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMTkydDFcIiwgaWQ6IGlkQnJhaW5wb29sUDE5MnQxLCBzaXplOiAxOTIgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMjI0cjFcIiwgaWQ6IGlkQnJhaW5wb29sUDIyNHIxLCBzaXplOiAyMjQgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMjI0dDFcIiwgaWQ6IGlkQnJhaW5wb29sUDIyNHQxLCBzaXplOiAyMjQgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMjU2cjFcIiwgaWQ6IGlkQnJhaW5wb29sUDI1NnIxLCBzaXplOiAyNTYgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMjU2dDFcIiwgaWQ6IGlkQnJhaW5wb29sUDI1NnQxLCBzaXplOiAyNTYgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMzIwcjFcIiwgaWQ6IGlkQnJhaW5wb29sUDMyMHIxLCBzaXplOiAzMjAgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMzIwdDFcIiwgaWQ6IGlkQnJhaW5wb29sUDMyMHQxLCBzaXplOiAzMjAgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMzg0cjFcIiwgaWQ6IGlkQnJhaW5wb29sUDM4NHIxLCBzaXplOiAzODQgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQMzg0dDFcIiwgaWQ6IGlkQnJhaW5wb29sUDM4NHQxLCBzaXplOiAzODQgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQNTEycjFcIiwgaWQ6IGlkQnJhaW5wb29sUDUxMnIxLCBzaXplOiA1MTIgfSk7XHJcbkVjQ3VydmVzLnJlZ2lzdGVyKHsgbmFtZTogXCJicmFpbnBvb2xQNTEydDFcIiwgaWQ6IGlkQnJhaW5wb29sUDUxMnQxLCBzaXplOiA1MTIgfSk7XG5cbmNsYXNzIEhtYWNQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJITUFDXCI7XHJcbiAgICAgICAgdGhpcy5oYXNoQWxnb3JpdGhtcyA9IFtcIlNIQS0xXCIsIFwiU0hBLTI1NlwiLCBcIlNIQS0zODRcIiwgXCJTSEEtNTEyXCJdO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wic2lnblwiLCBcInZlcmlmeVwiXTtcclxuICAgIH1cclxuICAgIGdldERlZmF1bHRMZW5ndGgoYWxnTmFtZSkge1xyXG4gICAgICAgIHN3aXRjaCAoYWxnTmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMVwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTI1NlwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTM4NFwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTUxMlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDUxMjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhbGdvcml0aG0gbmFtZSAnJHthbGdOYW1lfSdgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0dlbmVyYXRlS2V5UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJoYXNoXCIpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG1zKTtcclxuICAgICAgICBpZiAoXCJsZW5ndGhcIiBpbiBhbGdvcml0aG0pIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhbGdvcml0aG0ubGVuZ3RoICE9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGVuZ3RoOiBJcyBub3QgYSBOdW1iZXJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFsZ29yaXRobS5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImxlbmd0aDogTnVtYmVyIGlzIG91dCBvZiByYW5nZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrSW1wb3J0UGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJoYXNoXCIpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG1zKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBQYmtkZjJQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJQQktERjJcIjtcclxuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1wiU0hBLTFcIiwgXCJTSEEtMjU2XCIsIFwiU0hBLTM4NFwiLCBcIlNIQS01MTJcIl07XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXCJkZXJpdmVCaXRzXCIsIFwiZGVyaXZlS2V5XCJdO1xyXG4gICAgfVxyXG4gICAgY2hlY2tBbGdvcml0aG1QYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcImhhc2hcIik7XHJcbiAgICAgICAgdGhpcy5jaGVja0hhc2hBbGdvcml0aG0oYWxnb3JpdGhtLmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobXMpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJzYWx0XCIpO1xyXG4gICAgICAgIGlmICghKGFsZ29yaXRobS5zYWx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KGFsZ29yaXRobS5zYWx0KSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInNhbHQ6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJpdGVyYXRpb25zXCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgYWxnb3JpdGhtLml0ZXJhdGlvbnMgIT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIml0ZXJhdGlvbnM6IElzIG5vdCBhIE51bWJlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5pdGVyYXRpb25zIDwgMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaXRlcmF0aW9uczogSXMgbGVzcyB0aGFuIDFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2hlY2tJbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpIHtcclxuICAgICAgICBzdXBlci5jaGVja0ltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgaWYgKGV4dHJhY3RhYmxlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcImV4dHJhY3RhYmxlOiBNdXN0IGJlICdmYWxzZSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEhrZGZQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJIS0RGXCI7XHJcbiAgICAgICAgdGhpcy5oYXNoQWxnb3JpdGhtcyA9IFtcIlNIQS0xXCIsIFwiU0hBLTI1NlwiLCBcIlNIQS0zODRcIiwgXCJTSEEtNTEyXCJdO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW1wiZGVyaXZlS2V5XCIsIFwiZGVyaXZlQml0c1wiXTtcclxuICAgIH1cclxuICAgIGNoZWNrQWxnb3JpdGhtUGFyYW1zKGFsZ29yaXRobSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJoYXNoXCIpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tIYXNoQWxnb3JpdGhtKGFsZ29yaXRobS5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG1zKTtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwic2FsdFwiKTtcclxuICAgICAgICBpZiAoIUJ1ZmZlclNvdXJjZUNvbnZlcnRlci5pc0J1ZmZlclNvdXJjZShhbGdvcml0aG0uc2FsdCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInNhbHQ6IElzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFByb3BlcnR5KGFsZ29yaXRobSwgXCJpbmZvXCIpO1xyXG4gICAgICAgIGlmICghQnVmZmVyU291cmNlQ29udmVydGVyLmlzQnVmZmVyU291cmNlKGFsZ29yaXRobS5pbmZvKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwic2FsdDogSXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0ltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4uYXJncykge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICBpZiAoZXh0cmFjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiZXh0cmFjdGFibGU6IE11c3QgYmUgJ2ZhbHNlJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2hha2VQcm92aWRlciBleHRlbmRzIFByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmRlZmF1bHRMZW5ndGggPSAwO1xyXG4gICAgfVxyXG4gICAgZGlnZXN0KC4uLmFyZ3MpIHtcclxuICAgICAgICBhcmdzWzBdID0geyBsZW5ndGg6IHRoaXMuZGVmYXVsdExlbmd0aCwgLi4uYXJnc1swXSB9O1xyXG4gICAgICAgIHJldHVybiBzdXBlci5kaWdlc3QuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0RpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICBzdXBlci5jaGVja0RpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGFsZ29yaXRobS5sZW5ndGggfHwgMDtcclxuICAgICAgICBpZiAodHlwZW9mIGxlbmd0aCAhPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGVuZ3RoOiBJcyBub3QgYSBOdW1iZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsZW5ndGggPCAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsZW5ndGg6IElzIG5lZ2F0aXZlXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGFrZTEyOFByb3ZpZGVyIGV4dGVuZHMgU2hha2VQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwic2hha2UxMjhcIjtcclxuICAgICAgICB0aGlzLmRlZmF1bHRMZW5ndGggPSAxNjtcclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGFrZTI1NlByb3ZpZGVyIGV4dGVuZHMgU2hha2VQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwic2hha2UyNTZcIjtcclxuICAgICAgICB0aGlzLmRlZmF1bHRMZW5ndGggPSAzMjtcclxuICAgIH1cclxufVxuXG5jbGFzcyBDcnlwdG8ge1xyXG4gICAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xyXG4gICAgICAgIHJldHVybiBcIkNyeXB0b1wiO1xyXG4gICAgfVxyXG4gICAgcmFuZG9tVVVJRCgpIHtcclxuICAgICAgICBjb25zdCBiID0gdGhpcy5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTtcclxuICAgICAgICBiWzZdID0gKGJbNl0gJiAweDBmKSB8IDB4NDA7XHJcbiAgICAgICAgYls4XSA9IChiWzhdICYgMHgzZikgfCAweDgwO1xyXG4gICAgICAgIGNvbnN0IHV1aWQgPSBDb252ZXJ0LlRvSGV4KGIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIGAke3V1aWQuc3Vic3RyaW5nKDAsIDgpfS0ke3V1aWQuc3Vic3RyaW5nKDgsIDEyKX0tJHt1dWlkLnN1YnN0cmluZygxMiwgMTYpfS0ke3V1aWQuc3Vic3RyaW5nKDE2KX1gO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFByb3ZpZGVyU3RvcmFnZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLml0ZW1zID0ge307XHJcbiAgICB9XHJcbiAgICBnZXQoYWxnb3JpdGhtTmFtZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zW2FsZ29yaXRobU5hbWUudG9Mb3dlckNhc2UoKV0gfHwgbnVsbDtcclxuICAgIH1cclxuICAgIHNldChwcm92aWRlcikge1xyXG4gICAgICAgIHRoaXMuaXRlbXNbcHJvdmlkZXIubmFtZS50b0xvd2VyQ2FzZSgpXSA9IHByb3ZpZGVyO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlQXQoYWxnb3JpdGhtTmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXQoYWxnb3JpdGhtTmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAocHJvdmlkZXIpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaXRlbXNbYWxnb3JpdGhtTmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm92aWRlcjtcclxuICAgIH1cclxuICAgIGhhcyhuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXQobmFtZSk7XHJcbiAgICB9XHJcbiAgICBnZXQgbGVuZ3RoKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLml0ZW1zKS5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBnZXQgYWxnb3JpdGhtcygpIHtcclxuICAgICAgICBjb25zdCBhbGdvcml0aG1zID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuaXRlbXNba2V5XTtcclxuICAgICAgICAgICAgYWxnb3JpdGhtcy5wdXNoKHByb3ZpZGVyLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYWxnb3JpdGhtcy5zb3J0KCk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU3VidGxlQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzID0gbmV3IFByb3ZpZGVyU3RvcmFnZSgpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzSGFzaGVkQWxnb3JpdGhtKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gZGF0YVxyXG4gICAgICAgICAgICAmJiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIlxyXG4gICAgICAgICAgICAmJiBcIm5hbWVcIiBpbiBkYXRhXHJcbiAgICAgICAgICAgICYmIFwiaGFzaFwiIGluIGRhdGFcclxuICAgICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICAgIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiU3VidGxlQ3J5cHRvXCI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBkaWdlc3QoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZEFyZ3VtZW50cyhhcmdzLCAyLCBcImRpZ2VzdFwiKTtcclxuICAgICAgICBjb25zdCBbYWxnb3JpdGhtLCBkYXRhLCAuLi5wYXJhbXNdID0gYXJncztcclxuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGRhdGEpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5kaWdlc3QocHJlcGFyZWRBbGdvcml0aG0sIHByZXBhcmVkRGF0YSwgLi4ucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZ2VuZXJhdGVLZXkoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZEFyZ3VtZW50cyhhcmdzLCAzLCBcImdlbmVyYXRlS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLnBhcmFtc10gPSBhcmdzO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLmdlbmVyYXRlS2V5KHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4ucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc2lnbiguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDMsIFwic2lnblwiKTtcclxuICAgICAgICBjb25zdCBbYWxnb3JpdGhtLCBrZXksIGRhdGEsIC4uLnBhcmFtc10gPSBhcmdzO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGRhdGEpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5zaWduKHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwga2V5LCBwcmVwYXJlZERhdGEsIC4uLnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIGFzeW5jIHZlcmlmeSguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDQsIFwidmVyaWZ5XCIpO1xyXG4gICAgICAgIGNvbnN0IFthbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhLCAuLi5wYXJhbXNdID0gYXJncztcclxuICAgICAgICB0aGlzLmNoZWNrQ3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWRBbGdvcml0aG0gPSB0aGlzLnByZXBhcmVBbGdvcml0aG0oYWxnb3JpdGhtKTtcclxuICAgICAgICBjb25zdCBwcmVwYXJlZERhdGEgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihkYXRhKTtcclxuICAgICAgICBjb25zdCBwcmVwYXJlZFNpZ25hdHVyZSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHNpZ25hdHVyZSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeSh7IC4uLnByZXBhcmVkQWxnb3JpdGhtLCBuYW1lOiBwcm92aWRlci5uYW1lIH0sIGtleSwgcHJlcGFyZWRTaWduYXR1cmUsIHByZXBhcmVkRGF0YSwgLi4ucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZW5jcnlwdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDMsIFwiZW5jcnlwdFwiKTtcclxuICAgICAgICBjb25zdCBbYWxnb3JpdGhtLCBrZXksIGRhdGEsIC4uLnBhcmFtc10gPSBhcmdzO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGRhdGEpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5lbmNyeXB0KHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwga2V5LCBwcmVwYXJlZERhdGEsIHsga2V5VXNhZ2U6IHRydWUgfSwgLi4ucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZGVjcnlwdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDMsIFwiZGVjcnlwdFwiKTtcclxuICAgICAgICBjb25zdCBbYWxnb3JpdGhtLCBrZXksIGRhdGEsIC4uLnBhcmFtc10gPSBhcmdzO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGRhdGEpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5kZWNyeXB0KHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwga2V5LCBwcmVwYXJlZERhdGEsIHsga2V5VXNhZ2U6IHRydWUgfSwgLi4ucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZGVyaXZlQml0cyguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDMsIFwiZGVyaXZlQml0c1wiKTtcclxuICAgICAgICBjb25zdCBbYWxnb3JpdGhtLCBiYXNlS2V5LCBsZW5ndGgsIC4uLnBhcmFtc10gPSBhcmdzO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDcnlwdG9LZXkoYmFzZUtleSk7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWRBbGdvcml0aG0gPSB0aGlzLnByZXBhcmVBbGdvcml0aG0oYWxnb3JpdGhtKTtcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIocHJlcGFyZWRBbGdvcml0aG0ubmFtZSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIuZGVyaXZlQml0cyh7IC4uLnByZXBhcmVkQWxnb3JpdGhtLCBuYW1lOiBwcm92aWRlci5uYW1lIH0sIGJhc2VLZXksIGxlbmd0aCwgeyBrZXlVc2FnZTogdHJ1ZSB9LCAuLi5wYXJhbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBkZXJpdmVLZXkoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZEFyZ3VtZW50cyhhcmdzLCA1LCBcImRlcml2ZUtleVwiKTtcclxuICAgICAgICBjb25zdCBbYWxnb3JpdGhtLCBiYXNlS2V5LCBkZXJpdmVkS2V5VHlwZSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4ucGFyYW1zXSA9IGFyZ3M7XHJcbiAgICAgICAgY29uc3QgcHJlcGFyZWREZXJpdmVkS2V5VHlwZSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShkZXJpdmVkS2V5VHlwZSk7XHJcbiAgICAgICAgY29uc3QgaW1wb3J0UHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkRGVyaXZlZEtleVR5cGUubmFtZSk7XHJcbiAgICAgICAgaW1wb3J0UHJvdmlkZXIuY2hlY2tEZXJpdmVkS2V5UGFyYW1zKHByZXBhcmVkRGVyaXZlZEtleVR5cGUpO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKHByZXBhcmVkQWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIHByb3ZpZGVyLmNoZWNrQ3J5cHRvS2V5KGJhc2VLZXksIFwiZGVyaXZlS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IGRlcml2ZWRCaXRzID0gYXdhaXQgcHJvdmlkZXIuZGVyaXZlQml0cyh7IC4uLnByZXBhcmVkQWxnb3JpdGhtLCBuYW1lOiBwcm92aWRlci5uYW1lIH0sIGJhc2VLZXksIGRlcml2ZWRLZXlUeXBlLmxlbmd0aCB8fCA1MTIsIHsga2V5VXNhZ2U6IGZhbHNlIH0sIC4uLnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0S2V5KFwicmF3XCIsIGRlcml2ZWRCaXRzLCBkZXJpdmVkS2V5VHlwZSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4ucGFyYW1zKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGV4cG9ydEtleSguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIDIsIFwiZXhwb3J0S2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IFtmb3JtYXQsIGtleSwgLi4ucGFyYW1zXSA9IGFyZ3M7XHJcbiAgICAgICAgdGhpcy5jaGVja0NyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihrZXkuYWxnb3JpdGhtLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLmV4cG9ydEtleShmb3JtYXQsIGtleSwgLi4ucGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW1wb3J0S2V5KC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRBcmd1bWVudHMoYXJncywgNSwgXCJpbXBvcnRLZXlcIik7XHJcbiAgICAgICAgY29uc3QgW2Zvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXNdID0gYXJncztcclxuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobShhbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcclxuICAgICAgICBpZiAoW1wicGtjczhcIiwgXCJzcGtpXCIsIFwicmF3XCJdLmluZGV4T2YoZm9ybWF0KSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJlcGFyZWREYXRhID0gQnVmZmVyU291cmNlQ29udmVydGVyLnRvQXJyYXlCdWZmZXIoa2V5RGF0YSk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5pbXBvcnRLZXkoZm9ybWF0LCBwcmVwYXJlZERhdGEsIHsgLi4ucHJlcGFyZWRBbGdvcml0aG0sIG5hbWU6IHByb3ZpZGVyLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4ucGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICgha2V5RGF0YS5rdHkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXlEYXRhOiBJcyBub3QgSlNPTlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvdmlkZXIuaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzLCAuLi5wYXJhbXMpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgd3JhcEtleShmb3JtYXQsIGtleSwgd3JhcHBpbmdLZXksIHdyYXBBbGdvcml0aG0sIC4uLmFyZ3MpIHtcclxuICAgICAgICBsZXQga2V5RGF0YSA9IGF3YWl0IHRoaXMuZXhwb3J0S2V5KGZvcm1hdCwga2V5LCAuLi5hcmdzKTtcclxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImp3a1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShrZXlEYXRhKTtcclxuICAgICAgICAgICAga2V5RGF0YSA9IENvbnZlcnQuRnJvbVV0ZjhTdHJpbmcoanNvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkQWxnb3JpdGhtID0gdGhpcy5wcmVwYXJlQWxnb3JpdGhtKHdyYXBBbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKGtleURhdGEpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcclxuICAgICAgICByZXR1cm4gcHJvdmlkZXIuZW5jcnlwdCh7IC4uLnByZXBhcmVkQWxnb3JpdGhtLCBuYW1lOiBwcm92aWRlci5uYW1lIH0sIHdyYXBwaW5nS2V5LCBwcmVwYXJlZERhdGEsIHsga2V5VXNhZ2U6IGZhbHNlIH0sIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdW53cmFwS2V5KGZvcm1hdCwgd3JhcHBlZEtleSwgdW53cmFwcGluZ0tleSwgdW53cmFwQWxnb3JpdGhtLCB1bndyYXBwZWRLZXlBbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMsIC4uLmFyZ3MpIHtcclxuICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHRoaXMucHJlcGFyZUFsZ29yaXRobSh1bndyYXBBbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHByZXBhcmVkRGF0YSA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHdyYXBwZWRLZXkpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihwcmVwYXJlZEFsZ29yaXRobS5uYW1lKTtcclxuICAgICAgICBsZXQga2V5RGF0YSA9IGF3YWl0IHByb3ZpZGVyLmRlY3J5cHQoeyAuLi5wcmVwYXJlZEFsZ29yaXRobSwgbmFtZTogcHJvdmlkZXIubmFtZSB9LCB1bndyYXBwaW5nS2V5LCBwcmVwYXJlZERhdGEsIHsga2V5VXNhZ2U6IGZhbHNlIH0sIC4uLmFyZ3MpO1xyXG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiandrXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGtleURhdGEgPSBKU09OLnBhcnNlKENvbnZlcnQuVG9VdGY4U3RyaW5nKGtleURhdGEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVHlwZUVycm9yKFwid3JhcHBlZEtleTogSXMgbm90IGEgSlNPTlwiKTtcclxuICAgICAgICAgICAgICAgIGVycm9yLmludGVybmFsID0gZTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHVud3JhcHBlZEtleUFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcywgLi4uYXJncyk7XHJcbiAgICB9XHJcbiAgICBjaGVja1JlcXVpcmVkQXJndW1lbnRzKGFyZ3MsIHNpemUsIG1ldGhvZE5hbWUpIHtcclxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCBzaXplKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBleGVjdXRlICcke21ldGhvZE5hbWV9JyBvbiAnU3VidGxlQ3J5cHRvJzogJHtzaXplfSBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5ICR7YXJncy5sZW5ndGh9IHByZXNlbnRgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcmVwYXJlQWxnb3JpdGhtKGFsZ29yaXRobSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgYWxnb3JpdGhtID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGdvcml0aG0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChTdWJ0bGVDcnlwdG8uaXNIYXNoZWRBbGdvcml0aG0oYWxnb3JpdGhtKSkge1xyXG4gICAgICAgICAgICBjb25zdCBwcmVwYXJlZEFsZ29yaXRobSA9IHsgLi4uYWxnb3JpdGhtIH07XHJcbiAgICAgICAgICAgIHByZXBhcmVkQWxnb3JpdGhtLmhhc2ggPSB0aGlzLnByZXBhcmVBbGdvcml0aG0oYWxnb3JpdGhtLmhhc2gpO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJlcGFyZWRBbGdvcml0aG07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IC4uLmFsZ29yaXRobSB9O1xyXG4gICAgfVxyXG4gICAgZ2V0UHJvdmlkZXIobmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5wcm92aWRlcnMuZ2V0KG5hbWUpO1xyXG4gICAgICAgIGlmICghcHJvdmlkZXIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFsZ29yaXRobUVycm9yKFwiVW5yZWNvZ25pemVkIG5hbWVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm92aWRlcjtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSkge1xyXG4gICAgICAgIGlmICghKGtleSBpbnN0YW5jZW9mIENyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgS2V5IGlzIG5vdCBvZiB0eXBlICdDcnlwdG9LZXknYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbnZhciBpbmRleCA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBjb252ZXJ0ZXJzOiBpbmRleCQzXG59KTtcblxuY29uc3QgUkVRVUlSRURfRklFTERTID0gW1wiY3J2XCIsIFwiZVwiLCBcImtcIiwgXCJrdHlcIiwgXCJuXCIsIFwieFwiLCBcInlcIl07XHJcbmNsYXNzIEp3a1V0aWxzIHtcclxuICAgIHN0YXRpYyBhc3luYyB0aHVtYnByaW50KGhhc2gsIGp3aywgY3J5cHRvKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybWF0KGp3aywgdHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGNyeXB0by5zdWJ0bGUuZGlnZXN0KGhhc2gsIENvbnZlcnQuRnJvbUJpbmFyeShKU09OLnN0cmluZ2lmeShkYXRhKSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZvcm1hdChqd2ssIHJlbW92ZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IHJlcyA9IE9iamVjdC5lbnRyaWVzKGp3ayk7XHJcbiAgICAgICAgaWYgKHJlbW92ZSkge1xyXG4gICAgICAgICAgICByZXMgPSByZXMuZmlsdGVyKG8gPT4gUkVRVUlSRURfRklFTERTLmluY2x1ZGVzKG9bMF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzID0gcmVzLnNvcnQoKFtrZXlBXSwgW2tleUJdKSA9PiBrZXlBID4ga2V5QiA/IDEgOiBrZXlBIDwga2V5QiA/IC0xIDogMCk7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXMpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IEFlc0NiY1Byb3ZpZGVyLCBBZXNDbWFjUHJvdmlkZXIsIEFlc0N0clByb3ZpZGVyLCBBZXNFY2JQcm92aWRlciwgQWVzR2NtUHJvdmlkZXIsIEFlc0t3UHJvdmlkZXIsIEFlc1Byb3ZpZGVyLCBBbGdvcml0aG1FcnJvciwgQ3J5cHRvLCBDcnlwdG9FcnJvciwgQ3J5cHRvS2V5LCBEZXNQcm92aWRlciwgRWNDdXJ2ZXMsIEVjVXRpbHMsIEVjZGhFc1Byb3ZpZGVyLCBFY2RoUHJvdmlkZXIsIEVjZHNhUHJvdmlkZXIsIEVkRHNhUHJvdmlkZXIsIEVsbGlwdGljUHJvdmlkZXIsIEhrZGZQcm92aWRlciwgSG1hY1Byb3ZpZGVyLCBKd2tVdGlscywgT3BlcmF0aW9uRXJyb3IsIFBia2RmMlByb3ZpZGVyLCBQZW1Db252ZXJ0ZXIsIFByb3ZpZGVyQ3J5cHRvLCBQcm92aWRlclN0b3JhZ2UsIFJlcXVpcmVkUHJvcGVydHlFcnJvciwgUnNhT2FlcFByb3ZpZGVyLCBSc2FQcm92aWRlciwgUnNhUHNzUHJvdmlkZXIsIFJzYVNzYVByb3ZpZGVyLCBTaGFrZTEyOFByb3ZpZGVyLCBTaGFrZTI1NlByb3ZpZGVyLCBTaGFrZVByb3ZpZGVyLCBTdWJ0bGVDcnlwdG8sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXJyb3IsIGluZGV4JDEgYXMgYXNuMSwgaXNKV0ssIGluZGV4IGFzIGpzb24gfTtcbiIsICIvKiFcbiBDb3B5cmlnaHQgKGMpIFBlY3VsaWFyIFZlbnR1cmVzLCBMTENcbiovXG5cbmltcG9ydCAqIGFzIGNvcmUgZnJvbSAnd2ViY3J5cHRvLWNvcmUnO1xuaW1wb3J0IHsgQnVmZmVyU291cmNlQ29udmVydGVyIGFzIEJ1ZmZlclNvdXJjZUNvbnZlcnRlciQxIH0gZnJvbSAnd2ViY3J5cHRvLWNvcmUnO1xuZXhwb3J0IHsgQ3J5cHRvS2V5IH0gZnJvbSAnd2ViY3J5cHRvLWNvcmUnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgY3J5cHRvX19kZWZhdWx0IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBwcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IHsgX19kZWNvcmF0ZSB9IGZyb20gJ3RzbGliJztcbmltcG9ydCB7IEpzb25Qcm9wLCBKc29uUHJvcFR5cGVzLCBKc29uU2VyaWFsaXplciwgSnNvblBhcnNlciB9IGZyb20gJ0BwZWN1bGlhci9qc29uLXNjaGVtYSc7XG5pbXBvcnQgeyBDb252ZXJ0LCBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIgfSBmcm9tICdwdnRzdXRpbHMnO1xuaW1wb3J0IHsgQXNuUGFyc2VyLCBBc25TZXJpYWxpemVyIH0gZnJvbSAnQHBlY3VsaWFyL2FzbjEtc2NoZW1hJztcblxuY29uc3QgSnNvbkJhc2U2NFVybENvbnZlcnRlciA9IHtcclxuICAgIGZyb21KU09OOiAodmFsdWUpID0+IEJ1ZmZlci5mcm9tKENvbnZlcnQuRnJvbUJhc2U2NFVybCh2YWx1ZSkpLFxyXG4gICAgdG9KU09OOiAodmFsdWUpID0+IENvbnZlcnQuVG9CYXNlNjRVcmwodmFsdWUpLFxyXG59O1xuXG5jbGFzcyBDcnlwdG9LZXkgZXh0ZW5kcyBjb3JlLkNyeXB0b0tleSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5hbGxvYygwKTtcclxuICAgICAgICB0aGlzLmFsZ29yaXRobSA9IHsgbmFtZTogXCJcIiB9O1xyXG4gICAgICAgIHRoaXMuZXh0cmFjdGFibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnR5cGUgPSBcInNlY3JldFwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XHJcbiAgICAgICAgdGhpcy5rdHkgPSBcIm9jdFwiO1xyXG4gICAgICAgIHRoaXMuYWxnID0gXCJcIjtcclxuICAgIH1cclxufVxyXG5fX2RlY29yYXRlKFtcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJleHRcIiwgdHlwZTogSnNvblByb3BUeXBlcy5Cb29sZWFuLCBvcHRpb25hbDogdHJ1ZSB9KVxyXG5dLCBDcnlwdG9LZXkucHJvdG90eXBlLCBcImV4dHJhY3RhYmxlXCIsIHZvaWQgMCk7XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImtleV9vcHNcIiwgdHlwZTogSnNvblByb3BUeXBlcy5TdHJpbmcsIHJlcGVhdGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KVxyXG5dLCBDcnlwdG9LZXkucHJvdG90eXBlLCBcInVzYWdlc1wiLCB2b2lkIDApO1xyXG5fX2RlY29yYXRlKFtcclxuICAgIEpzb25Qcm9wKHsgdHlwZTogSnNvblByb3BUeXBlcy5TdHJpbmcgfSlcclxuXSwgQ3J5cHRvS2V5LnByb3RvdHlwZSwgXCJrdHlcIiwgdm9pZCAwKTtcclxuX19kZWNvcmF0ZShbXHJcbiAgICBKc29uUHJvcCh7IHR5cGU6IEpzb25Qcm9wVHlwZXMuU3RyaW5nLCBvcHRpb25hbDogdHJ1ZSB9KVxyXG5dLCBDcnlwdG9LZXkucHJvdG90eXBlLCBcImFsZ1wiLCB2b2lkIDApO1xuXG5jbGFzcyBTeW1tZXRyaWNLZXkgZXh0ZW5kcyBDcnlwdG9LZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLmt0eSA9IFwib2N0XCI7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJzZWNyZXRcIjtcclxuICAgIH1cclxufVxuXG5jbGFzcyBBc3ltbWV0cmljS2V5IGV4dGVuZHMgQ3J5cHRvS2V5IHtcclxufVxuXG5jbGFzcyBBZXNDcnlwdG9LZXkgZXh0ZW5kcyBTeW1tZXRyaWNLZXkge1xyXG4gICAgZ2V0IGFsZygpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuYWxnb3JpdGhtLm5hbWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiQUVTLUNCQ1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBJHt0aGlzLmFsZ29yaXRobS5sZW5ndGh9Q0JDYDtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1DVFJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBgQSR7dGhpcy5hbGdvcml0aG0ubGVuZ3RofUNUUmA7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtR0NNXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYEEke3RoaXMuYWxnb3JpdGhtLmxlbmd0aH1HQ01gO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUVTLUtXXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYEEke3RoaXMuYWxnb3JpdGhtLmxlbmd0aH1LV2A7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtQ01BQ1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBJHt0aGlzLmFsZ29yaXRobS5sZW5ndGh9Q01BQ2A7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtRUNCXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYEEke3RoaXMuYWxnb3JpdGhtLmxlbmd0aH1FQ0JgO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuQWxnb3JpdGhtRXJyb3IoXCJVbnN1cHBvcnRlZCBhbGdvcml0aG0gbmFtZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzZXQgYWxnKHZhbHVlKSB7XHJcbiAgICB9XHJcbn1cclxuX19kZWNvcmF0ZShbXHJcbiAgICBKc29uUHJvcCh7IG5hbWU6IFwia1wiLCBjb252ZXJ0ZXI6IEpzb25CYXNlNjRVcmxDb252ZXJ0ZXIgfSlcclxuXSwgQWVzQ3J5cHRvS2V5LnByb3RvdHlwZSwgXCJkYXRhXCIsIHZvaWQgMCk7XG5cbmNvbnN0IGtleVN0b3JhZ2UgPSBuZXcgV2Vha01hcCgpO1xyXG5mdW5jdGlvbiBnZXRDcnlwdG9LZXkoa2V5KSB7XHJcbiAgICBjb25zdCByZXMgPSBrZXlTdG9yYWdlLmdldChrZXkpO1xyXG4gICAgaWYgKCFyZXMpIHtcclxuICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcIkNhbm5vdCBnZXQgQ3J5cHRvS2V5IGZyb20gc2VjdXJlIHN0b3JhZ2VcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59XHJcbmZ1bmN0aW9uIHNldENyeXB0b0tleSh2YWx1ZSkge1xyXG4gICAgY29uc3Qga2V5ID0gY29yZS5DcnlwdG9LZXkuY3JlYXRlKHZhbHVlLmFsZ29yaXRobSwgdmFsdWUudHlwZSwgdmFsdWUuZXh0cmFjdGFibGUsIHZhbHVlLnVzYWdlcyk7XHJcbiAgICBPYmplY3QuZnJlZXplKGtleSk7XHJcbiAgICBrZXlTdG9yYWdlLnNldChrZXksIHZhbHVlKTtcclxuICAgIHJldHVybiBrZXk7XHJcbn1cblxuY2xhc3MgQWVzQ3J5cHRvIHtcclxuICAgIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBuZXcgQWVzQ3J5cHRvS2V5KCk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IGFsZ29yaXRobTtcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgIGtleS5kYXRhID0gY3J5cHRvX19kZWZhdWx0LnJhbmRvbUJ5dGVzKGFsZ29yaXRobS5sZW5ndGggPj4gMyk7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBleHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImtleTogSXMgbm90IEFlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShrZXkuZGF0YSkuYnVmZmVyO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycgb3IgJ3JhdydcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGxldCBrZXk7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGtleURhdGEsIHsgdGFyZ2V0U2NoZW1hOiBBZXNDcnlwdG9LZXkgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInJhd1wiOlxyXG4gICAgICAgICAgICAgICAga2V5ID0gbmV3IEFlc0NyeXB0b0tleSgpO1xyXG4gICAgICAgICAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIuZnJvbShrZXlEYXRhKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycgb3IgJ3JhdydcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAga2V5LmFsZ29yaXRobS5sZW5ndGggPSBrZXkuZGF0YS5sZW5ndGggPDwgMztcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgIHN3aXRjaCAoa2V5LmFsZ29yaXRobS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY2FzZSAxMjg6XHJcbiAgICAgICAgICAgIGNhc2UgMTkyOlxyXG4gICAgICAgICAgICBjYXNlIDI1NjpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJrZXlEYXRhOiBJcyB3cm9uZyBrZXkgbGVuZ3RoXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1DQkNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRBZXNDQkMoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1DVFJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRBZXNDVFIoYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1HQ01cIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHRBZXNHQ00oYWxnb3JpdGhtLCBrZXksIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIkFFUy1LV1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdEFlc0tXKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtRUNCXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0QWVzRUNCKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImtleTogSXMgbm90IEFlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtQ0JDXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0QWVzQ0JDKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtQ1RSXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0QWVzQ1RSKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtR0NNXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0QWVzR0NNKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBRVMtS1dcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRBZXNLVyhhbGdvcml0aG0sIGtleSwgQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUVTLUVDQlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdEFlc0VDQihhbGdvcml0aG0sIGtleSwgQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJhbGdvcml0aG06IElzIG5vdCByZWNvZ25pemVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0QWVzQ0JDKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUNpcGhlcml2KGBhZXMtJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0tY2JjYCwga2V5LmRhdGEsIG5ldyBVaW50OEFycmF5KGFsZ29yaXRobS5pdikpO1xyXG4gICAgICAgIGxldCBlbmMgPSBjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGVuYyA9IEJ1ZmZlci5jb25jYXQoW2VuYywgY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHRBZXNDQkMoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBkZWNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVEZWNpcGhlcml2KGBhZXMtJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0tY2JjYCwga2V5LmRhdGEsIG5ldyBVaW50OEFycmF5KGFsZ29yaXRobS5pdikpO1xyXG4gICAgICAgIGxldCBkZWMgPSBkZWNpcGhlci51cGRhdGUoZGF0YSk7XHJcbiAgICAgICAgZGVjID0gQnVmZmVyLmNvbmNhdChbZGVjLCBkZWNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHRBZXNDVFIoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlQ2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1jdHJgLCBrZXkuZGF0YSwgQnVmZmVyLmZyb20oYWxnb3JpdGhtLmNvdW50ZXIpKTtcclxuICAgICAgICBsZXQgZW5jID0gY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBlbmMgPSBCdWZmZXIuY29uY2F0KFtlbmMsIGNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoZW5jKS5idWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0QWVzQ1RSKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlRGVjaXBoZXJpdihgYWVzLSR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LWN0cmAsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uY291bnRlcikpO1xyXG4gICAgICAgIGxldCBkZWMgPSBkZWNpcGhlci51cGRhdGUoZGF0YSk7XHJcbiAgICAgICAgZGVjID0gQnVmZmVyLmNvbmNhdChbZGVjLCBkZWNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHRBZXNHQ00oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlQ2lwaGVyaXYoYGFlcy0ke2tleS5hbGdvcml0aG0ubGVuZ3RofS1nY21gLCBrZXkuZGF0YSwgQnVmZmVyLmZyb20oYWxnb3JpdGhtLml2KSwge1xyXG4gICAgICAgICAgICBhdXRoVGFnTGVuZ3RoOiAoYWxnb3JpdGhtLnRhZ0xlbmd0aCB8fCAxMjgpID4+IDMsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5hZGRpdGlvbmFsRGF0YSkge1xyXG4gICAgICAgICAgICBjaXBoZXIuc2V0QUFEKEJ1ZmZlci5mcm9tKGFsZ29yaXRobS5hZGRpdGlvbmFsRGF0YSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZW5jID0gY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBlbmMgPSBCdWZmZXIuY29uY2F0KFtlbmMsIGNpcGhlci5maW5hbCgpLCBjaXBoZXIuZ2V0QXV0aFRhZygpXSk7XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoZW5jKS5idWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0QWVzR0NNKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlRGVjaXBoZXJpdihgYWVzLSR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LWdjbWAsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uaXYpKTtcclxuICAgICAgICBjb25zdCB0YWdMZW5ndGggPSAoYWxnb3JpdGhtLnRhZ0xlbmd0aCB8fCAxMjgpID4+IDM7XHJcbiAgICAgICAgY29uc3QgZW5jID0gZGF0YS5zbGljZSgwLCBkYXRhLmxlbmd0aCAtIHRhZ0xlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgdGFnID0gZGF0YS5zbGljZShkYXRhLmxlbmd0aCAtIHRhZ0xlbmd0aCk7XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5hZGRpdGlvbmFsRGF0YSkge1xyXG4gICAgICAgICAgICBkZWNpcGhlci5zZXRBQUQoQnVmZmVyLmZyb20oYWxnb3JpdGhtLmFkZGl0aW9uYWxEYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlY2lwaGVyLnNldEF1dGhUYWcodGFnKTtcclxuICAgICAgICBsZXQgZGVjID0gZGVjaXBoZXIudXBkYXRlKGVuYyk7XHJcbiAgICAgICAgZGVjID0gQnVmZmVyLmNvbmNhdChbZGVjLCBkZWNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHRBZXNLVyhhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVDaXBoZXJpdihgaWQtYWVzJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0td3JhcGAsIGtleS5kYXRhLCB0aGlzLkFFU19LV19JVik7XHJcbiAgICAgICAgbGV0IGVuYyA9IGNpcGhlci51cGRhdGUoZGF0YSk7XHJcbiAgICAgICAgZW5jID0gQnVmZmVyLmNvbmNhdChbZW5jLCBjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0QWVzS1coYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBkZWNpcGhlciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVEZWNpcGhlcml2KGBpZC1hZXMke2tleS5hbGdvcml0aG0ubGVuZ3RofS13cmFwYCwga2V5LmRhdGEsIHRoaXMuQUVTX0tXX0lWKTtcclxuICAgICAgICBsZXQgZGVjID0gZGVjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGRlYyA9IEJ1ZmZlci5jb25jYXQoW2RlYywgZGVjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWMpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0QWVzRUNCKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUNpcGhlcml2KGBhZXMtJHtrZXkuYWxnb3JpdGhtLmxlbmd0aH0tZWNiYCwga2V5LmRhdGEsIG5ldyBVaW50OEFycmF5KDApKTtcclxuICAgICAgICBsZXQgZW5jID0gY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBlbmMgPSBCdWZmZXIuY29uY2F0KFtlbmMsIGNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoZW5jKS5idWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0QWVzRUNCKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlRGVjaXBoZXJpdihgYWVzLSR7a2V5LmFsZ29yaXRobS5sZW5ndGh9LWVjYmAsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheSgwKSk7XHJcbiAgICAgICAgbGV0IGRlYyA9IGRlY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBkZWMgPSBCdWZmZXIuY29uY2F0KFtkZWMsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XHJcbiAgICB9XHJcbn1cclxuQWVzQ3J5cHRvLkFFU19LV19JViA9IEJ1ZmZlci5mcm9tKFwiQTZBNkE2QTZBNkE2QTZBNlwiLCBcImhleFwiKTtcblxuY2xhc3MgQWVzQ2JjUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkFlc0NiY1Byb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgQWVzQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5lbmNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZGVjcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBBZXNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyBuYW1lOiBhbGdvcml0aG0ubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIEFlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY29uc3QgemVybyA9IEJ1ZmZlci5mcm9tKFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSk7XHJcbmNvbnN0IHJiID0gQnVmZmVyLmZyb20oWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEzNV0pO1xyXG5jb25zdCBibG9ja1NpemUgPSAxNjtcclxuZnVuY3Rpb24gYml0U2hpZnRMZWZ0KGJ1ZmZlcikge1xyXG4gICAgY29uc3Qgc2hpZnRlZCA9IEJ1ZmZlci5hbGxvYyhidWZmZXIubGVuZ3RoKTtcclxuICAgIGNvbnN0IGxhc3QgPSBidWZmZXIubGVuZ3RoIC0gMTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsYXN0OyBpbmRleCsrKSB7XHJcbiAgICAgICAgc2hpZnRlZFtpbmRleF0gPSBidWZmZXJbaW5kZXhdIDw8IDE7XHJcbiAgICAgICAgaWYgKGJ1ZmZlcltpbmRleCArIDFdICYgMHg4MCkge1xyXG4gICAgICAgICAgICBzaGlmdGVkW2luZGV4XSArPSAweDAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNoaWZ0ZWRbbGFzdF0gPSBidWZmZXJbbGFzdF0gPDwgMTtcclxuICAgIHJldHVybiBzaGlmdGVkO1xyXG59XHJcbmZ1bmN0aW9uIHhvcihhLCBiKSB7XHJcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xyXG4gICAgY29uc3Qgb3V0cHV0ID0gQnVmZmVyLmFsbG9jKGxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgb3V0cHV0W2luZGV4XSA9IGFbaW5kZXhdIF4gYltpbmRleF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0cHV0O1xyXG59XHJcbmZ1bmN0aW9uIGFlcyhrZXksIG1lc3NhZ2UpIHtcclxuICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdihgYWVzJHtrZXkubGVuZ3RoIDw8IDN9YCwga2V5LCB6ZXJvKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGNpcGhlci51cGRhdGUobWVzc2FnZSk7XHJcbiAgICBjaXBoZXIuZmluYWwoKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuZnVuY3Rpb24gZ2V0TWVzc2FnZUJsb2NrKG1lc3NhZ2UsIGJsb2NrSW5kZXgpIHtcclxuICAgIGNvbnN0IGJsb2NrID0gQnVmZmVyLmFsbG9jKGJsb2NrU2l6ZSk7XHJcbiAgICBjb25zdCBzdGFydCA9IGJsb2NrSW5kZXggKiBibG9ja1NpemU7XHJcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGJsb2NrU2l6ZTtcclxuICAgIG1lc3NhZ2UuY29weShibG9jaywgMCwgc3RhcnQsIGVuZCk7XHJcbiAgICByZXR1cm4gYmxvY2s7XHJcbn1cclxuZnVuY3Rpb24gZ2V0UGFkZGVkTWVzc2FnZUJsb2NrKG1lc3NhZ2UsIGJsb2NrSW5kZXgpIHtcclxuICAgIGNvbnN0IGJsb2NrID0gQnVmZmVyLmFsbG9jKGJsb2NrU2l6ZSk7XHJcbiAgICBjb25zdCBzdGFydCA9IGJsb2NrSW5kZXggKiBibG9ja1NpemU7XHJcbiAgICBjb25zdCBlbmQgPSBtZXNzYWdlLmxlbmd0aDtcclxuICAgIGJsb2NrLmZpbGwoMCk7XHJcbiAgICBtZXNzYWdlLmNvcHkoYmxvY2ssIDAsIHN0YXJ0LCBlbmQpO1xyXG4gICAgYmxvY2tbZW5kIC0gc3RhcnRdID0gMHg4MDtcclxuICAgIHJldHVybiBibG9jaztcclxufVxyXG5mdW5jdGlvbiBnZW5lcmF0ZVN1YmtleXMoa2V5KSB7XHJcbiAgICBjb25zdCBsID0gYWVzKGtleSwgemVybyk7XHJcbiAgICBsZXQgc3Via2V5MSA9IGJpdFNoaWZ0TGVmdChsKTtcclxuICAgIGlmIChsWzBdICYgMHg4MCkge1xyXG4gICAgICAgIHN1YmtleTEgPSB4b3Ioc3Via2V5MSwgcmIpO1xyXG4gICAgfVxyXG4gICAgbGV0IHN1YmtleTIgPSBiaXRTaGlmdExlZnQoc3Via2V5MSk7XHJcbiAgICBpZiAoc3Via2V5MVswXSAmIDB4ODApIHtcclxuICAgICAgICBzdWJrZXkyID0geG9yKHN1YmtleTIsIHJiKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IHN1YmtleTEsIHN1YmtleTIgfTtcclxufVxyXG5mdW5jdGlvbiBhZXNDbWFjKGtleSwgbWVzc2FnZSkge1xyXG4gICAgY29uc3Qgc3Via2V5cyA9IGdlbmVyYXRlU3Via2V5cyhrZXkpO1xyXG4gICAgbGV0IGJsb2NrQ291bnQgPSBNYXRoLmNlaWwobWVzc2FnZS5sZW5ndGggLyBibG9ja1NpemUpO1xyXG4gICAgbGV0IGxhc3RCbG9ja0NvbXBsZXRlRmxhZztcclxuICAgIGxldCBsYXN0QmxvY2s7XHJcbiAgICBpZiAoYmxvY2tDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIGJsb2NrQ291bnQgPSAxO1xyXG4gICAgICAgIGxhc3RCbG9ja0NvbXBsZXRlRmxhZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgbGFzdEJsb2NrQ29tcGxldGVGbGFnID0gKG1lc3NhZ2UubGVuZ3RoICUgYmxvY2tTaXplID09PSAwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxhc3RCbG9ja0luZGV4ID0gYmxvY2tDb3VudCAtIDE7XHJcbiAgICBpZiAobGFzdEJsb2NrQ29tcGxldGVGbGFnKSB7XHJcbiAgICAgICAgbGFzdEJsb2NrID0geG9yKGdldE1lc3NhZ2VCbG9jayhtZXNzYWdlLCBsYXN0QmxvY2tJbmRleCksIHN1YmtleXMuc3Via2V5MSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBsYXN0QmxvY2sgPSB4b3IoZ2V0UGFkZGVkTWVzc2FnZUJsb2NrKG1lc3NhZ2UsIGxhc3RCbG9ja0luZGV4KSwgc3Via2V5cy5zdWJrZXkyKTtcclxuICAgIH1cclxuICAgIGxldCB4ID0gemVybztcclxuICAgIGxldCB5O1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxhc3RCbG9ja0luZGV4OyBpbmRleCsrKSB7XHJcbiAgICAgICAgeSA9IHhvcih4LCBnZXRNZXNzYWdlQmxvY2sobWVzc2FnZSwgaW5kZXgpKTtcclxuICAgICAgICB4ID0gYWVzKGtleSwgeSk7XHJcbiAgICB9XHJcbiAgICB5ID0geG9yKGxhc3RCbG9jaywgeCk7XHJcbiAgICByZXR1cm4gYWVzKGtleSwgeSk7XHJcbn1cclxuY2xhc3MgQWVzQ21hY1Byb3ZpZGVyIGV4dGVuZHMgY29yZS5BZXNDbWFjUHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBBZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGxlbmd0aDogYWxnb3JpdGhtLmxlbmd0aCxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhZXNDbWFjKGdldENyeXB0b0tleShrZXkpLmRhdGEsIEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlMiA9IGF3YWl0IHRoaXMuc2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkuY29tcGFyZShCdWZmZXIuZnJvbShzaWduYXR1cmUyKSkgPT09IDA7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBZXNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyBuYW1lOiBhbGdvcml0aG0ubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KHJlcyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIEFlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzQ3RyUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkFlc0N0clByb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgQWVzQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5lbmNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZGVjcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBZXNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyBuYW1lOiBhbGdvcml0aG0ubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KHJlcyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIEFlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzR2NtUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkFlc0djbVByb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgQWVzQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBsZW5ndGg6IGFsZ29yaXRobS5sZW5ndGgsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5lbmNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZGVjcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBBZXNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyBuYW1lOiBhbGdvcml0aG0ubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KHJlcyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBBZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIEFlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQWVzS3dQcm92aWRlciBleHRlbmRzIGNvcmUuQWVzS3dQcm92aWRlciB7XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEFlc0NyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgbGVuZ3RoOiBhbGdvcml0aG0ubGVuZ3RoLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkocmVzKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIEFlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IEFlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IGFsZ29yaXRobS5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkocmVzKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRW5jcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZW5jcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmRlY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgQWVzQ3J5cHRvS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgYSBBZXNDcnlwdG9LZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEFlc0VjYlByb3ZpZGVyIGV4dGVuZHMgY29yZS5BZXNFY2JQcm92aWRlciB7XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEFlc0NyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgbGVuZ3RoOiBhbGdvcml0aG0ubGVuZ3RoLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRW5jcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBBZXNDcnlwdG8uZW5jcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmRlY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gQWVzQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgQWVzQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgbmFtZTogYWxnb3JpdGhtLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShyZXMpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGlmICghKGdldENyeXB0b0tleShrZXkpIGluc3RhbmNlb2YgQWVzQ3J5cHRvS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgYSBBZXNDcnlwdG9LZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIERlc0NyeXB0b0tleSBleHRlbmRzIFN5bW1ldHJpY0tleSB7XHJcbiAgICBnZXQgYWxnKCkge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5hbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJERVMtQ0JDXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYERFUy1DQkNgO1xyXG4gICAgICAgICAgICBjYXNlIFwiREVTLUVERTMtQ0JDXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYDNERVMtQ0JDYDtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLkFsZ29yaXRobUVycm9yKFwiVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIG5hbWVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0IGFsZyh2YWx1ZSkge1xyXG4gICAgfVxyXG59XHJcbl9fZGVjb3JhdGUoW1xyXG4gICAgSnNvblByb3AoeyBuYW1lOiBcImtcIiwgY29udmVydGVyOiBKc29uQmFzZTY0VXJsQ29udmVydGVyIH0pXHJcbl0sIERlc0NyeXB0b0tleS5wcm90b3R5cGUsIFwiZGF0YVwiLCB2b2lkIDApO1xuXG5jbGFzcyBEZXNDcnlwdG8ge1xyXG4gICAgc3RhdGljIGFzeW5jIGdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBEZXNDcnlwdG9LZXkoKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAga2V5LmRhdGEgPSBjcnlwdG9fX2RlZmF1bHQucmFuZG9tQnl0ZXMoYWxnb3JpdGhtLmxlbmd0aCA+PiAzKTtcclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpzb25TZXJpYWxpemVyLnRvSlNPTihrZXkpO1xyXG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoa2V5LmRhdGEpLmJ1ZmZlcjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snIG9yICdyYXcnXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBpbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBsZXQga2V5O1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxyXG4gICAgICAgICAgICAgICAga2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihrZXlEYXRhLCB7IHRhcmdldFNjaGVtYTogRGVzQ3J5cHRvS2V5IH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjpcclxuICAgICAgICAgICAgICAgIGtleSA9IG5ldyBEZXNDcnlwdG9LZXkoKTtcclxuICAgICAgICAgICAgICAgIGtleS5kYXRhID0gQnVmZmVyLmZyb20oa2V5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snIG9yICdyYXcnXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJERVMtQ0JDXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNyeXB0RGVzQ0JDKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJERVMtRURFMy1DQkNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHREZXNFREUzQ0JDKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiBEZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImtleTogSXMgbm90IERlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJERVMtQ0JDXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0RGVzQ0JDKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJERVMtRURFMy1DQkNcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHREZXNFREUzQ0JDKGFsZ29yaXRobSwga2V5LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGVuY3J5cHREZXNDQkMoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlQ2lwaGVyaXYoYGRlcy1jYmNgLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoYWxnb3JpdGhtLml2KSk7XHJcbiAgICAgICAgbGV0IGVuYyA9IGNpcGhlci51cGRhdGUoZGF0YSk7XHJcbiAgICAgICAgZW5jID0gQnVmZmVyLmNvbmNhdChbZW5jLCBjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KGVuYykuYnVmZmVyO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZGVjcnlwdERlc0NCQyhhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZURlY2lwaGVyaXYoYGRlcy1jYmNgLCBrZXkuZGF0YSwgbmV3IFVpbnQ4QXJyYXkoYWxnb3JpdGhtLml2KSk7XHJcbiAgICAgICAgbGV0IGRlYyA9IGRlY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBkZWMgPSBCdWZmZXIuY29uY2F0KFtkZWMsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZW5jcnlwdERlc0VERTNDQkMoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlQ2lwaGVyaXYoYGRlcy1lZGUzLWNiY2AsIGtleS5kYXRhLCBCdWZmZXIuZnJvbShhbGdvcml0aG0uaXYpKTtcclxuICAgICAgICBsZXQgZW5jID0gY2lwaGVyLnVwZGF0ZShkYXRhKTtcclxuICAgICAgICBlbmMgPSBCdWZmZXIuY29uY2F0KFtlbmMsIGNpcGhlci5maW5hbCgpXSk7XHJcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoZW5jKS5idWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0RGVzRURFM0NCQyhhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZURlY2lwaGVyaXYoYGRlcy1lZGUzLWNiY2AsIGtleS5kYXRhLCBuZXcgVWludDhBcnJheShhbGdvcml0aG0uaXYpKTtcclxuICAgICAgICBsZXQgZGVjID0gZGVjaXBoZXIudXBkYXRlKGRhdGEpO1xyXG4gICAgICAgIGRlYyA9IEJ1ZmZlci5jb25jYXQoW2RlYywgZGVjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWMpLmJ1ZmZlcjtcclxuICAgIH1cclxufVxuXG5jbGFzcyBEZXNDYmNQcm92aWRlciBleHRlbmRzIGNvcmUuRGVzUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLmtleVNpemVCaXRzID0gNjQ7XHJcbiAgICAgICAgdGhpcy5pdlNpemUgPSA4O1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiREVTLUNCQ1wiO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBEZXNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5rZXlTaXplQml0cyxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkVuY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gRGVzQ3J5cHRvLmVuY3J5cHQoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIERlc0NyeXB0by5kZWNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIERlc0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IERlc0NyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IG5hbWU6IHRoaXMubmFtZSwgbGVuZ3RoOiB0aGlzLmtleVNpemVCaXRzIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIGlmIChrZXkuZGF0YS5sZW5ndGggIT09ICh0aGlzLmtleVNpemVCaXRzID4+IDMpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwia2V5RGF0YTogV3Jvbmcga2V5IHNpemVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIERlc0NyeXB0b0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IGEgRGVzQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBEZXNFZGUzQ2JjUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkRlc1Byb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5rZXlTaXplQml0cyA9IDE5MjtcclxuICAgICAgICB0aGlzLml2U2l6ZSA9IDg7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJERVMtRURFMy1DQkNcIjtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgRGVzQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMua2V5U2l6ZUJpdHMsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIERlc0NyeXB0by5lbmNyeXB0KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBEZXNDcnlwdG8uZGVjcnlwdChhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBEZXNDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBEZXNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyBuYW1lOiB0aGlzLm5hbWUsIGxlbmd0aDogdGhpcy5rZXlTaXplQml0cyB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICBpZiAoa2V5LmRhdGEubGVuZ3RoICE9PSAodGhpcy5rZXlTaXplQml0cyA+PiAzKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImtleURhdGE6IFdyb25nIGtleSBzaXplXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBEZXNDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBhIERlc0NyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuZnVuY3Rpb24gZ2V0SndrQWxnb3JpdGhtKGFsZ29yaXRobSkge1xyXG4gICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgY2FzZSBcIlJTQS1PQUVQXCI6IHtcclxuICAgICAgICAgICAgY29uc3QgbWRTaXplID0gLyhcXGQrKSQvLmV4ZWMoYWxnb3JpdGhtLmhhc2gubmFtZSlbMV07XHJcbiAgICAgICAgICAgIHJldHVybiBgUlNBLU9BRVAke21kU2l6ZSAhPT0gXCIxXCIgPyBgLSR7bWRTaXplfWAgOiBcIlwifWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJSU0FTU0EtUEtDUzEtVjFfNVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gYFJTJHsvKFxcZCspJC8uZXhlYyhhbGdvcml0aG0uaGFzaC5uYW1lKVsxXX1gO1xyXG4gICAgICAgIGNhc2UgXCJSU0EtUFNTXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBgUFMkey8oXFxkKykkLy5leGVjKGFsZ29yaXRobS5oYXNoLm5hbWUpWzFdfWA7XHJcbiAgICAgICAgY2FzZSBcIlJTQS1QS0NTMVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gYFJTMWA7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJhbGdvcml0aG06IElzIG5vdCByZWNvZ25pemVkXCIpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFJzYVByaXZhdGVLZXkgZXh0ZW5kcyBBc3ltbWV0cmljS2V5IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJwcml2YXRlXCI7XHJcbiAgICB9XHJcbiAgICBnZXRLZXkoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZSh0aGlzLmRhdGEsIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XHJcbiAgICAgICAgcmV0dXJuIEFzblBhcnNlci5wYXJzZShrZXlJbmZvLnByaXZhdGVLZXksIGNvcmUuYXNuMS5Sc2FQcml2YXRlS2V5KTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSgpO1xyXG4gICAgICAgIGNvbnN0IGpzb24gPSB7XHJcbiAgICAgICAgICAgIGt0eTogXCJSU0FcIixcclxuICAgICAgICAgICAgYWxnOiBnZXRKd2tBbGdvcml0aG0odGhpcy5hbGdvcml0aG0pLFxyXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcclxuICAgICAgICAgICAgZXh0OiB0aGlzLmV4dHJhY3RhYmxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oanNvbiwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5Sc2FQcml2YXRlS2V5IH0pO1xyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKCk7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtLmFsZ29yaXRobSA9IFwiMS4yLjg0MC4xMTM1NDkuMS4xLjFcIjtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0ucGFyYW1ldGVycyA9IG51bGw7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5ID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5KTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBCdWZmZXIuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhUHVibGljS2V5IGV4dGVuZHMgQXN5bW1ldHJpY0tleSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMudHlwZSA9IFwicHVibGljXCI7XHJcbiAgICB9XHJcbiAgICBnZXRLZXkoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZSh0aGlzLmRhdGEsIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcclxuICAgICAgICByZXR1cm4gQXNuUGFyc2VyLnBhcnNlKGtleUluZm8ucHVibGljS2V5LCBjb3JlLmFzbjEuUnNhUHVibGljS2V5KTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSgpO1xyXG4gICAgICAgIGNvbnN0IGpzb24gPSB7XHJcbiAgICAgICAgICAgIGt0eTogXCJSU0FcIixcclxuICAgICAgICAgICAgYWxnOiBnZXRKd2tBbGdvcml0aG0odGhpcy5hbGdvcml0aG0pLFxyXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcclxuICAgICAgICAgICAgZXh0OiB0aGlzLmV4dHJhY3RhYmxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oanNvbiwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5Sc2FQdWJsaWNLZXkgfSk7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHVibGljS2V5SW5mbygpO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLmFsZ29yaXRobSA9IFwiMS4yLjg0MC4xMTM1NDkuMS4xLjFcIjtcclxuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5wYXJhbWV0ZXJzID0gbnVsbDtcclxuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleSA9IEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleSk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gQnVmZmVyLmZyb20oQXNuU2VyaWFsaXplci5zZXJpYWxpemUoa2V5SW5mbykpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFJzYUNyeXB0byB7XHJcbiAgICBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IG5ldyBSc2FQcml2YXRlS2V5KCk7XHJcbiAgICAgICAgcHJpdmF0ZUtleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAgcHJpdmF0ZUtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIHByaXZhdGVLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHJpdmF0ZUtleVVzYWdlcy5pbmRleE9mKHVzYWdlKSAhPT0gLTEpO1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBSc2FQdWJsaWNLZXkoKTtcclxuICAgICAgICBwdWJsaWNLZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xyXG4gICAgICAgIHB1YmxpY0tleS5leHRyYWN0YWJsZSA9IHRydWU7XHJcbiAgICAgICAgcHVibGljS2V5LnVzYWdlcyA9IGtleVVzYWdlcy5maWx0ZXIoKHVzYWdlKSA9PiB0aGlzLnB1YmxpY0tleVVzYWdlcy5pbmRleE9mKHVzYWdlKSAhPT0gLTEpO1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY0V4cG9uZW50ID0gQnVmZmVyLmNvbmNhdChbXHJcbiAgICAgICAgICAgIEJ1ZmZlci5hbGxvYyg0IC0gYWxnb3JpdGhtLnB1YmxpY0V4cG9uZW50LmJ5dGVMZW5ndGgsIDApLFxyXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShhbGdvcml0aG0ucHVibGljRXhwb25lbnQpLFxyXG4gICAgICAgIF0pLnJlYWRJbnQzMkJFKDApO1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBjcnlwdG9fX2RlZmF1bHQuZ2VuZXJhdGVLZXlQYWlyU3luYyhcInJzYVwiLCB7XHJcbiAgICAgICAgICAgIG1vZHVsdXNMZW5ndGg6IGFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoLFxyXG4gICAgICAgICAgICBwdWJsaWNFeHBvbmVudCxcclxuICAgICAgICAgICAgcHVibGljS2V5RW5jb2Rpbmc6IHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3BraVwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcml2YXRlS2V5RW5jb2Rpbmc6IHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwicGtjczhcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcml2YXRlS2V5LmRhdGEgPSBrZXlzLnByaXZhdGVLZXk7XHJcbiAgICAgICAgcHVibGljS2V5LmRhdGEgPSBrZXlzLnB1YmxpY0tleTtcclxuICAgICAgICBjb25zdCByZXMgPSB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwa2NzOFwiOlxyXG4gICAgICAgICAgICBjYXNlIFwic3BraVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGtleS5kYXRhKS5idWZmZXI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJywgJ3BrY3M4JyBvciAnc3BraSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBqd2sgPSBrZXlEYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKGp3ay5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXNuS2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihrZXlEYXRhLCB7IHRhcmdldFNjaGVtYTogY29yZS5hc24xLlJzYVByaXZhdGVLZXkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHJpdmF0ZUtleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGtleURhdGEsIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuUnNhUHVibGljS2V5IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZShuZXcgVWludDhBcnJheShrZXlEYXRhKSwgY29yZS5hc24xLlB1YmxpY0tleUluZm8pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXNuS2V5ID0gQXNuUGFyc2VyLnBhcnNlKGtleUluZm8ucHVibGljS2V5LCBjb3JlLmFzbjEuUnNhUHVibGljS2V5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInBrY3M4XCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UobmV3IFVpbnQ4QXJyYXkoa2V5RGF0YSksIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wcml2YXRlS2V5LCBjb3JlLmFzbjEuUnNhUHJpdmF0ZUtleSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycsICdwa2NzOCcgb3IgJ3Nwa2knXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBzaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJSU0EtUFNTXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJSU0FTU0EtUEtDUzEtVjFfNVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2lnblJzYShhbGdvcml0aG0sIGtleSwgZGF0YSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImFsZ29yaXRobTogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIHZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJSU0EtUFNTXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJSU0FTU0EtUEtDUzEtVjFfNVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyaWZ5U1NBKGFsZ29yaXRobSwga2V5LCBkYXRhLCBzaWduYXR1cmUpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJhbGdvcml0aG06IElzIG5vdCByZWNvZ25pemVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBlbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJSU0EtT0FFUFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdE9BRVAoYWxnb3JpdGhtLCBrZXksIGRhdGEpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJhbGdvcml0aG06IElzIG5vdCByZWNvZ25pemVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBkZWNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJSU0EtT0FFUFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdE9BRVAoYWxnb3JpdGhtLCBrZXksIGRhdGEpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJhbGdvcml0aG06IElzIG5vdCByZWNvZ25pemVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBpbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHJpdmF0ZUtleUluZm8oKTtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiO1xyXG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5wYXJhbWV0ZXJzID0gbnVsbDtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShhc25LZXkpO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBSc2FQcml2YXRlS2V5KCk7XHJcbiAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IE9iamVjdC5hc3NpZ24oe30sIGFsZ29yaXRobSk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCA9IG5ldyBVaW50OEFycmF5KGFzbktleS5wdWJsaWNFeHBvbmVudCk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoID0gYXNuS2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCA8PCAzO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBpbXBvcnRQdWJsaWNLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKCk7XHJcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXlBbGdvcml0aG0uYWxnb3JpdGhtID0gXCIxLjIuODQwLjExMzU0OS4xLjEuMVwiO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBudWxsO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5ID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUoYXNuS2V5KTtcclxuICAgICAgICBjb25zdCBrZXkgPSBuZXcgUnNhUHVibGljS2V5KCk7XHJcbiAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IE9iamVjdC5hc3NpZ24oe30sIGFsZ29yaXRobSk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCA9IG5ldyBVaW50OEFycmF5KGFzbktleS5wdWJsaWNFeHBvbmVudCk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoID0gYXNuS2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCA8PCAzO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBnZXRDcnlwdG9BbGdvcml0aG0oYWxnKSB7XHJcbiAgICAgICAgc3dpdGNoIChhbGcuaGFzaC5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQS0xXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJSU0EtU0hBMVwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTI1NlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUlNBLVNIQTI1NlwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTM4NFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUlNBLVNIQTM4NFwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTUxMlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUlNBLVNIQTUxMlwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBMy0yNTZcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJTQS1TSEEzLTI1NlwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBMy0zODRcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJTQS1TSEEzLTM4NFwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBMy01MTJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJTQS1TSEEzLTUxMlwiO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJhbGdvcml0aG0uaGFzaDogSXMgbm90IHJlY29nbml6ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIHNpZ25Sc2EoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjcnlwdG9BbGcgPSB0aGlzLmdldENyeXB0b0FsZ29yaXRobShrZXkuYWxnb3JpdGhtKTtcclxuICAgICAgICBjb25zdCBzaWduZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlU2lnbihjcnlwdG9BbGcpO1xyXG4gICAgICAgIHNpZ25lci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSkpO1xyXG4gICAgICAgIGlmICgha2V5LnBlbSkge1xyXG4gICAgICAgICAgICBrZXkucGVtID0gYC0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGtleToga2V5LnBlbSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlJTQS1QU1NcIikge1xyXG4gICAgICAgICAgICBvcHRpb25zLnBhZGRpbmcgPSBjcnlwdG9fX2RlZmF1bHQuY29uc3RhbnRzLlJTQV9QS0NTMV9QU1NfUEFERElORztcclxuICAgICAgICAgICAgb3B0aW9ucy5zYWx0TGVuZ3RoID0gYWxnb3JpdGhtLnNhbHRMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25lci5zaWduKG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShzaWduYXR1cmUpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyB2ZXJpZnlTU0EoYWxnb3JpdGhtLCBrZXksIGRhdGEsIHNpZ25hdHVyZSkge1xyXG4gICAgICAgIGNvbnN0IGNyeXB0b0FsZyA9IHRoaXMuZ2V0Q3J5cHRvQWxnb3JpdGhtKGtleS5hbGdvcml0aG0pO1xyXG4gICAgICAgIGNvbnN0IHNpZ25lciA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVWZXJpZnkoY3J5cHRvQWxnKTtcclxuICAgICAgICBzaWduZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICBpZiAoIWtleS5wZW0pIHtcclxuICAgICAgICAgICAga2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5OiBrZXkucGVtLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiUlNBLVBTU1wiKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucGFkZGluZyA9IGNyeXB0b19fZGVmYXVsdC5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HO1xyXG4gICAgICAgICAgICBvcHRpb25zLnNhbHRMZW5ndGggPSBhbGdvcml0aG0uc2FsdExlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb2sgPSBzaWduZXIudmVyaWZ5KG9wdGlvbnMsIHNpZ25hdHVyZSk7XHJcbiAgICAgICAgcmV0dXJuIG9rO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGVuY3J5cHRPQUVQKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAga2V5OiBgLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cXG4ke2tleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLWAsXHJcbiAgICAgICAgICAgIHBhZGRpbmc6IGNyeXB0b19fZGVmYXVsdC5jb25zdGFudHMuUlNBX1BLQ1MxX09BRVBfUEFERElORyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChhbGdvcml0aG0ubGFiZWwpIDtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX19kZWZhdWx0LnB1YmxpY0VuY3J5cHQob3B0aW9ucywgZGF0YSkpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBkZWNyeXB0T0FFUChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGtleTogYC0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLWAsXHJcbiAgICAgICAgICAgIHBhZGRpbmc6IGNyeXB0b19fZGVmYXVsdC5jb25zdGFudHMuUlNBX1BLQ1MxX09BRVBfUEFERElORyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChhbGdvcml0aG0ubGFiZWwpIDtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX19kZWZhdWx0LnByaXZhdGVEZWNyeXB0KG9wdGlvbnMsIGRhdGEpKS5idWZmZXI7XHJcbiAgICB9XHJcbn1cclxuUnNhQ3J5cHRvLnB1YmxpY0tleVVzYWdlcyA9IFtcInZlcmlmeVwiLCBcImVuY3J5cHRcIiwgXCJ3cmFwS2V5XCJdO1xyXG5Sc2FDcnlwdG8ucHJpdmF0ZUtleVVzYWdlcyA9IFtcInNpZ25cIiwgXCJkZWNyeXB0XCIsIFwidW53cmFwS2V5XCJdO1xuXG5jbGFzcyBSc2FTc2FQcm92aWRlciBleHRlbmRzIGNvcmUuUnNhU3NhUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLmhhc2hBbGdvcml0aG1zID0gW1xyXG4gICAgICAgICAgICBcIlNIQS0xXCIsIFwiU0hBLTI1NlwiLCBcIlNIQS0zODRcIiwgXCJTSEEtNTEyXCIsXHJcbiAgICAgICAgICAgIFwic2hha2UxMjhcIiwgXCJzaGFrZTI1NlwiLFxyXG4gICAgICAgICAgICBcIlNIQTMtMjU2XCIsIFwiU0hBMy0zODRcIiwgXCJTSEEzLTUxMlwiXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IFJzYUNyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHNldENyeXB0b0tleShrZXlzLnByaXZhdGVLZXkpLFxyXG4gICAgICAgICAgICBwdWJsaWNLZXk6IHNldENyeXB0b0tleShrZXlzLnB1YmxpY0tleSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uU2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBSc2FDcnlwdG8uc2lnbihhbGdvcml0aG0sIGdldENyeXB0b0tleShrZXkpLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFJzYUNyeXB0by52ZXJpZnkoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgUnNhQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgLi4uYWxnb3JpdGhtLCBuYW1lOiB0aGlzLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgaWYgKCEoaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgUnNhUHVibGljS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgUlNBIENyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhUHNzUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlJzYVBzc1Byb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5oYXNoQWxnb3JpdGhtcyA9IFtcclxuICAgICAgICAgICAgXCJTSEEtMVwiLCBcIlNIQS0yNTZcIiwgXCJTSEEtMzg0XCIsIFwiU0hBLTUxMlwiLFxyXG4gICAgICAgICAgICBcInNoYWtlMTI4XCIsIFwic2hha2UyNTZcIixcclxuICAgICAgICAgICAgXCJTSEEzLTI1NlwiLCBcIlNIQTMtMzg0XCIsIFwiU0hBMy01MTJcIlxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBSc2FDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICAuLi5hbGdvcml0aG0sXHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wdWJsaWNLZXkpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3luYyBvblNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLnNpZ24oYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25WZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBSc2FDcnlwdG8udmVyaWZ5KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIFJzYUNyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IFJzYUNyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLmFsZ29yaXRobSwgbmFtZTogdGhpcy5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBjb25zdCBpbnRlcm5hbEtleSA9IGdldENyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGlmICghKGludGVybmFsS2V5IGluc3RhbmNlb2YgUnNhUHJpdmF0ZUtleSB8fCBpbnRlcm5hbEtleSBpbnN0YW5jZW9mIFJzYVB1YmxpY0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IFJTQSBDcnlwdG9LZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYUNyeXB0byB7XHJcbiAgICBzdGF0aWMgc2l6ZShhbGdvcml0aG0pIHtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQS0xXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTYwO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTI1NlwiOlxyXG4gICAgICAgICAgICBjYXNlIFwiU0hBMy0yNTZcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiAyNTY7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMzg0XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTM4NFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDM4NDtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQS01MTJcIjpcclxuICAgICAgICAgICAgY2FzZSBcIlNIQTMtNTEyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gNTEyO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG5hbWVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGdldEFsZ29yaXRobU5hbWUoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgc3dpdGNoIChhbGdvcml0aG0ubmFtZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2hhMVwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBLTI1NlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2hhMjU2XCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEtMzg0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzaGEzODRcIjtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQS01MTJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInNoYTUxMlwiO1xyXG4gICAgICAgICAgICBjYXNlIFwiU0hBMy0yNTZcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInNoYTMtMjU2XCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJTSEEzLTM4NFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2hhMy0zODRcIjtcclxuICAgICAgICAgICAgY2FzZSBcIlNIQTMtNTEyXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzaGEzLTUxMlwiO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG5hbWVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBoYXNoQWxnID0gdGhpcy5nZXRBbGdvcml0aG1OYW1lKGFsZ29yaXRobSk7XHJcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVIYXNoKGhhc2hBbGcpXHJcbiAgICAgICAgICAgIC51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSkpLmRpZ2VzdCgpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShoYXNoKS5idWZmZXI7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUnNhT2FlcFByb3ZpZGVyIGV4dGVuZHMgY29yZS5Sc2FPYWVwUHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgUnNhQ3J5cHRvLmdlbmVyYXRlS2V5KHtcclxuICAgICAgICAgICAgLi4uYWxnb3JpdGhtLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogc2V0Q3J5cHRvS2V5KGtleXMucHJpdmF0ZUtleSksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xyXG4gICAgICAgIGNvbnN0IGtleVNpemUgPSBNYXRoLmNlaWwoaW50ZXJuYWxLZXkuYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGggPj4gMyk7XHJcbiAgICAgICAgY29uc3QgaGFzaFNpemUgPSBTaGFDcnlwdG8uc2l6ZShpbnRlcm5hbEtleS5hbGdvcml0aG0uaGFzaCkgPj4gMztcclxuICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YVZpZXcuYnl0ZUxlbmd0aDtcclxuICAgICAgICBjb25zdCBwc0xlbmd0aCA9IGtleVNpemUgLSBkYXRhTGVuZ3RoIC0gMiAqIGhhc2hTaXplIC0gMjtcclxuICAgICAgICBpZiAoZGF0YUxlbmd0aCA+IGtleVNpemUgLSAyICogaGFzaFNpemUgLSAyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGEgdG9vIGxhcmdlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IFVpbnQ4QXJyYXkoa2V5U2l6ZSk7XHJcbiAgICAgICAgY29uc3Qgc2VlZCA9IG1lc3NhZ2Uuc3ViYXJyYXkoMSwgaGFzaFNpemUgKyAxKTtcclxuICAgICAgICBjb25zdCBkYXRhQmxvY2sgPSBtZXNzYWdlLnN1YmFycmF5KGhhc2hTaXplICsgMSk7XHJcbiAgICAgICAgZGF0YUJsb2NrLnNldChkYXRhVmlldywgaGFzaFNpemUgKyBwc0xlbmd0aCArIDEpO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsSGFzaCA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVIYXNoKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoLm5hbWUucmVwbGFjZShcIi1cIiwgXCJcIikpXHJcbiAgICAgICAgICAgIC51cGRhdGUoY29yZS5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGFsZ29yaXRobS5sYWJlbCB8fCBuZXcgVWludDhBcnJheSgwKSkpXHJcbiAgICAgICAgICAgIC5kaWdlc3QoKTtcclxuICAgICAgICBkYXRhQmxvY2suc2V0KGxhYmVsSGFzaCwgMCk7XHJcbiAgICAgICAgZGF0YUJsb2NrW2hhc2hTaXplICsgcHNMZW5ndGhdID0gMTtcclxuICAgICAgICBjcnlwdG9fX2RlZmF1bHQucmFuZG9tRmlsbFN5bmMoc2VlZCk7XHJcbiAgICAgICAgY29uc3QgZGF0YUJsb2NrTWFzayA9IHRoaXMubWdmMShpbnRlcm5hbEtleS5hbGdvcml0aG0uaGFzaCwgc2VlZCwgZGF0YUJsb2NrLmxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQmxvY2subGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGF0YUJsb2NrW2ldIF49IGRhdGFCbG9ja01hc2tbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNlZWRNYXNrID0gdGhpcy5tZ2YxKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoLCBkYXRhQmxvY2ssIHNlZWQubGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgc2VlZFtpXSBePSBzZWVkTWFza1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpbnRlcm5hbEtleS5wZW0pIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxLZXkucGVtID0gYC0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXFxuJHtpbnRlcm5hbEtleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBrY3MwID0gY3J5cHRvX19kZWZhdWx0LnB1YmxpY0VuY3J5cHQoe1xyXG4gICAgICAgICAgICBrZXk6IGludGVybmFsS2V5LnBlbSxcclxuICAgICAgICAgICAgcGFkZGluZzogY3J5cHRvX19kZWZhdWx0LmNvbnN0YW50cy5SU0FfTk9fUEFERElORyxcclxuICAgICAgICB9LCBCdWZmZXIuZnJvbShtZXNzYWdlKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHBrY3MwKS5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRlY3J5cHQoYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBpbnRlcm5hbEtleSA9IGdldENyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IGtleVNpemUgPSBNYXRoLmNlaWwoaW50ZXJuYWxLZXkuYWxnb3JpdGhtLm1vZHVsdXNMZW5ndGggPj4gMyk7XHJcbiAgICAgICAgY29uc3QgaGFzaFNpemUgPSBTaGFDcnlwdG8uc2l6ZShpbnRlcm5hbEtleS5hbGdvcml0aG0uaGFzaCkgPj4gMztcclxuICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoO1xyXG4gICAgICAgIGlmIChkYXRhTGVuZ3RoICE9PSBrZXlTaXplKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBkYXRhXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWludGVybmFsS2V5LnBlbSkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEtleS5wZW0gPSBgLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXFxuJHtpbnRlcm5hbEtleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcGtjczAgPSBjcnlwdG9fX2RlZmF1bHQucHJpdmF0ZURlY3J5cHQoe1xyXG4gICAgICAgICAgICBrZXk6IGludGVybmFsS2V5LnBlbSxcclxuICAgICAgICAgICAgcGFkZGluZzogY3J5cHRvX19kZWZhdWx0LmNvbnN0YW50cy5SU0FfTk9fUEFERElORyxcclxuICAgICAgICB9LCBCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgY29uc3QgeiA9IHBrY3MwWzBdO1xyXG4gICAgICAgIGNvbnN0IHNlZWQgPSBwa2NzMC5zdWJhcnJheSgxLCBoYXNoU2l6ZSArIDEpO1xyXG4gICAgICAgIGNvbnN0IGRhdGFCbG9jayA9IHBrY3MwLnN1YmFycmF5KGhhc2hTaXplICsgMSk7XHJcbiAgICAgICAgaWYgKHogIT09IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVjcnlwdGlvbiBmYWlsZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNlZWRNYXNrID0gdGhpcy5tZ2YxKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoLCBkYXRhQmxvY2ssIHNlZWQubGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgc2VlZFtpXSBePSBzZWVkTWFza1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGF0YUJsb2NrTWFzayA9IHRoaXMubWdmMShpbnRlcm5hbEtleS5hbGdvcml0aG0uaGFzaCwgc2VlZCwgZGF0YUJsb2NrLmxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQmxvY2subGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGF0YUJsb2NrW2ldIF49IGRhdGFCbG9ja01hc2tbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGxhYmVsSGFzaCA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVIYXNoKGludGVybmFsS2V5LmFsZ29yaXRobS5oYXNoLm5hbWUucmVwbGFjZShcIi1cIiwgXCJcIikpXHJcbiAgICAgICAgICAgIC51cGRhdGUoY29yZS5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9VaW50OEFycmF5KGFsZ29yaXRobS5sYWJlbCB8fCBuZXcgVWludDhBcnJheSgwKSkpXHJcbiAgICAgICAgICAgIC5kaWdlc3QoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhhc2hTaXplOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGxhYmVsSGFzaFtpXSAhPT0gZGF0YUJsb2NrW2ldKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyeXB0aW9uIGZhaWxlZFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcHNFbmQgPSBoYXNoU2l6ZTtcclxuICAgICAgICBmb3IgKDsgcHNFbmQgPCBkYXRhQmxvY2subGVuZ3RoOyBwc0VuZCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBzeiA9IGRhdGFCbG9ja1twc0VuZF07XHJcbiAgICAgICAgICAgIGlmIChwc3ogPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwc3ogIT09IDApIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlY3J5cHRpb24gZmFpbGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwc0VuZCA9PT0gZGF0YUJsb2NrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyeXB0aW9uIGZhaWxlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGtjczAgPSBkYXRhQmxvY2suc3ViYXJyYXkocHNFbmQgKyAxKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocGtjczApLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIFJzYUNyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IFJzYUNyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLmFsZ29yaXRobSwgbmFtZTogdGhpcy5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBjb25zdCBpbnRlcm5hbEtleSA9IGdldENyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIGlmICghKGludGVybmFsS2V5IGluc3RhbmNlb2YgUnNhUHJpdmF0ZUtleSB8fCBpbnRlcm5hbEtleSBpbnN0YW5jZW9mIFJzYVB1YmxpY0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IFJTQSBDcnlwdG9LZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbWdmMShhbGdvcml0aG0sIHNlZWQsIGxlbmd0aCA9IDApIHtcclxuICAgICAgICBjb25zdCBoYXNoU2l6ZSA9IFNoYUNyeXB0by5zaXplKGFsZ29yaXRobSkgPj4gMztcclxuICAgICAgICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcclxuICAgICAgICBjb25zdCBjb3VudGVyID0gbmV3IFVpbnQ4QXJyYXkoNCk7XHJcbiAgICAgICAgY29uc3QgY2h1bmtzID0gTWF0aC5jZWlsKGxlbmd0aCAvIGhhc2hTaXplKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rczsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvdW50ZXJbMF0gPSBpID4+PiAyNDtcclxuICAgICAgICAgICAgY291bnRlclsxXSA9IChpID4+PiAxNikgJiAyNTU7XHJcbiAgICAgICAgICAgIGNvdW50ZXJbMl0gPSAoaSA+Pj4gOCkgJiAyNTU7XHJcbiAgICAgICAgICAgIGNvdW50ZXJbM10gPSBpICYgMjU1O1xyXG4gICAgICAgICAgICBjb25zdCBzdWJtYXNrID0gbWFzay5zdWJhcnJheShpICogaGFzaFNpemUpO1xyXG4gICAgICAgICAgICBsZXQgY2h1bmsgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlSGFzaChhbGdvcml0aG0ubmFtZS5yZXBsYWNlKFwiLVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgICAgIC51cGRhdGUoc2VlZClcclxuICAgICAgICAgICAgICAgIC51cGRhdGUoY291bnRlcilcclxuICAgICAgICAgICAgICAgIC5kaWdlc3QoKTtcclxuICAgICAgICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IHN1Ym1hc2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rLnN1YmFycmF5KDAsIHN1Ym1hc2subGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdWJtYXNrLnNldChjaHVuayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXNrO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFJzYUVzUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJSU0FFUy1QS0NTMS12MV81XCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSB7XHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogW1wiZW5jcnlwdFwiLCBcIndyYXBLZXlcIl0sXHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IFtcImRlY3J5cHRcIiwgXCJ1bndyYXBLZXlcIl0sXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IFJzYUNyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHNldENyeXB0b0tleShrZXlzLnByaXZhdGVLZXkpLFxyXG4gICAgICAgICAgICBwdWJsaWNLZXk6IHNldENyeXB0b0tleShrZXlzLnB1YmxpY0tleSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNoZWNrR2VuZXJhdGVLZXlQYXJhbXMoYWxnb3JpdGhtKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlcXVpcmVkUHJvcGVydHkoYWxnb3JpdGhtLCBcInB1YmxpY0V4cG9uZW50XCIpO1xyXG4gICAgICAgIGlmICghKGFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCAmJiBhbGdvcml0aG0ucHVibGljRXhwb25lbnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwicHVibGljRXhwb25lbnQ6IE1pc3Npbmcgb3Igbm90IGEgVWludDhBcnJheVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHVibGljRXhwb25lbnQgPSBDb252ZXJ0LlRvQmFzZTY0KGFsZ29yaXRobS5wdWJsaWNFeHBvbmVudCk7XHJcbiAgICAgICAgaWYgKCEocHVibGljRXhwb25lbnQgPT09IFwiQXc9PVwiIHx8IHB1YmxpY0V4cG9uZW50ID09PSBcIkFRQUJcIikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInB1YmxpY0V4cG9uZW50OiBNdXN0IGJlIFszXSBvciBbMSwwLDFdXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoZWNrUmVxdWlyZWRQcm9wZXJ0eShhbGdvcml0aG0sIFwibW9kdWx1c0xlbmd0aFwiKTtcclxuICAgICAgICBzd2l0Y2ggKGFsZ29yaXRobS5tb2R1bHVzTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMTAyNDpcclxuICAgICAgICAgICAgY2FzZSAyMDQ4OlxyXG4gICAgICAgICAgICBjYXNlIDQwOTY6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtb2R1bHVzTGVuZ3RoOiBNdXN0IGJlIDEwMjQsIDIwNDgsIG9yIDQwOTZcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FbmNyeXB0KGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMudG9DcnlwdG9PcHRpb25zKGtleSk7XHJcbiAgICAgICAgY29uc3QgZW5jID0gY3J5cHRvLnB1YmxpY0VuY3J5cHQob3B0aW9ucywgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmMpLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVjcnlwdChhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnRvQ3J5cHRvT3B0aW9ucyhrZXkpO1xyXG4gICAgICAgIGNvbnN0IGRlYyA9IGNyeXB0by5wcml2YXRlRGVjcnlwdChvcHRpb25zLCBuZXcgVWludDhBcnJheShkYXRhKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlYykuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gUnNhQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgUnNhQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgLi4uYWxnb3JpdGhtLCBuYW1lOiB0aGlzLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgaWYgKCEoaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBSc2FQcml2YXRlS2V5IHx8IGludGVybmFsS2V5IGluc3RhbmNlb2YgUnNhUHVibGljS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgUlNBIENyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0b0NyeXB0b09wdGlvbnMoa2V5KSB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IGtleS50eXBlLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAga2V5OiBgLS0tLS1CRUdJTiAke3R5cGV9IEtFWS0tLS0tXFxuJHtnZXRDcnlwdG9LZXkoa2V5KS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EICR7dHlwZX0gS0VZLS0tLS1gLFxyXG4gICAgICAgICAgICBwYWRkaW5nOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QS0NTMV9QQURESU5HLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cblxuY29uc3QgbmFtZWRPSURzID0ge1xyXG4gICAgXCIxLjIuODQwLjEwMDQ1LjMuMS43XCI6IFwiUC0yNTZcIixcclxuICAgIFwiUC0yNTZcIjogXCIxLjIuODQwLjEwMDQ1LjMuMS43XCIsXHJcbiAgICBcIjEuMy4xMzIuMC4zNFwiOiBcIlAtMzg0XCIsXHJcbiAgICBcIlAtMzg0XCI6IFwiMS4zLjEzMi4wLjM0XCIsXHJcbiAgICBcIjEuMy4xMzIuMC4zNVwiOiBcIlAtNTIxXCIsXHJcbiAgICBcIlAtNTIxXCI6IFwiMS4zLjEzMi4wLjM1XCIsXHJcbiAgICBcIjEuMy4xMzIuMC4xMFwiOiBcIkstMjU2XCIsXHJcbiAgICBcIkstMjU2XCI6IFwiMS4zLjEzMi4wLjEwXCIsXHJcbiAgICBcImJyYWlucG9vbFAxNjByMVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS4xXCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4xXCI6IFwiYnJhaW5wb29sUDE2MHIxXCIsXHJcbiAgICBcImJyYWlucG9vbFAxNjB0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS4yXCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4yXCI6IFwiYnJhaW5wb29sUDE2MHQxXCIsXHJcbiAgICBcImJyYWlucG9vbFAxOTJyMVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS4zXCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4zXCI6IFwiYnJhaW5wb29sUDE5MnIxXCIsXHJcbiAgICBcImJyYWlucG9vbFAxOTJ0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS40XCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS40XCI6IFwiYnJhaW5wb29sUDE5MnQxXCIsXHJcbiAgICBcImJyYWlucG9vbFAyMjRyMVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS41XCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS41XCI6IFwiYnJhaW5wb29sUDIyNHIxXCIsXHJcbiAgICBcImJyYWlucG9vbFAyMjR0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS42XCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS42XCI6IFwiYnJhaW5wb29sUDIyNHQxXCIsXHJcbiAgICBcImJyYWlucG9vbFAyNTZyMVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS43XCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS43XCI6IFwiYnJhaW5wb29sUDI1NnIxXCIsXHJcbiAgICBcImJyYWlucG9vbFAyNTZ0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS44XCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS44XCI6IFwiYnJhaW5wb29sUDI1NnQxXCIsXHJcbiAgICBcImJyYWlucG9vbFAzMjByMVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS45XCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS45XCI6IFwiYnJhaW5wb29sUDMyMHIxXCIsXHJcbiAgICBcImJyYWlucG9vbFAzMjB0MVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS4xMFwiLFxyXG4gICAgXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTBcIjogXCJicmFpbnBvb2xQMzIwdDFcIixcclxuICAgIFwiYnJhaW5wb29sUDM4NHIxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjExXCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4xMVwiOiBcImJyYWlucG9vbFAzODRyMVwiLFxyXG4gICAgXCJicmFpbnBvb2xQMzg0dDFcIjogXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTJcIixcclxuICAgIFwiMS4zLjM2LjMuMy4yLjguMS4xLjEyXCI6IFwiYnJhaW5wb29sUDM4NHQxXCIsXHJcbiAgICBcImJyYWlucG9vbFA1MTJyMVwiOiBcIjEuMy4zNi4zLjMuMi44LjEuMS4xM1wiLFxyXG4gICAgXCIxLjMuMzYuMy4zLjIuOC4xLjEuMTNcIjogXCJicmFpbnBvb2xQNTEycjFcIixcclxuICAgIFwiYnJhaW5wb29sUDUxMnQxXCI6IFwiMS4zLjM2LjMuMy4yLjguMS4xLjE0XCIsXHJcbiAgICBcIjEuMy4zNi4zLjMuMi44LjEuMS4xNFwiOiBcImJyYWlucG9vbFA1MTJ0MVwiLFxyXG59O1xyXG5mdW5jdGlvbiBnZXRPaWRCeU5hbWVkQ3VydmUkMShuYW1lZEN1cnZlKSB7XHJcbiAgICBjb25zdCBvaWQgPSBuYW1lZE9JRHNbbmFtZWRDdXJ2ZV07XHJcbiAgICBpZiAoIW9pZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgY29udmVydCBXZWJDcnlwdG8gbmFtZWQgY3VydmUgJyR7bmFtZWRDdXJ2ZX0nIHRvIE9JRGApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9pZDtcclxufVxuXG5jbGFzcyBFY1ByaXZhdGVLZXkgZXh0ZW5kcyBBc3ltbWV0cmljS2V5IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJwcml2YXRlXCI7XHJcbiAgICB9XHJcbiAgICBnZXRLZXkoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZSh0aGlzLmRhdGEsIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XHJcbiAgICAgICAgcmV0dXJuIEFzblBhcnNlci5wYXJzZShrZXlJbmZvLnByaXZhdGVLZXksIGNvcmUuYXNuMS5FY1ByaXZhdGVLZXkpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHtcclxuICAgICAgICAgICAga3R5OiBcIkVDXCIsXHJcbiAgICAgICAgICAgIGNydjogdGhpcy5hbGdvcml0aG0ubmFtZWRDdXJ2ZSxcclxuICAgICAgICAgICAga2V5X29wczogdGhpcy51c2FnZXMsXHJcbiAgICAgICAgICAgIGV4dDogdGhpcy5leHRyYWN0YWJsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGpzb24sIEpzb25TZXJpYWxpemVyLnRvSlNPTihrZXkpKTtcclxuICAgIH1cclxuICAgIGZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBpZiAoIWpzb24uY3J2KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgZ2V0IG5hbWVkIGN1cnZlIGZyb20gSldLLiBQcm9wZXJ0eSAnY3J2JyBpcyByZXF1aXJlZGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbygpO1xyXG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTAwNDUuMi4xXCI7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgY29yZS5hc24xLk9iamVjdElkZW50aWZpZXIoZ2V0T2lkQnlOYW1lZEN1cnZlJDEoanNvbi5jcnYpKSk7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihqc29uLCB7IHRhcmdldFNjaGVtYTogY29yZS5hc24xLkVjUHJpdmF0ZUtleSB9KTtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXkpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxuXG5jbGFzcyBFY1B1YmxpY0tleSBleHRlbmRzIEFzeW1tZXRyaWNLZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnR5cGUgPSBcInB1YmxpY1wiO1xyXG4gICAgfVxyXG4gICAgZ2V0S2V5KCkge1xyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UodGhpcy5kYXRhLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBjb3JlLmFzbjEuRWNQdWJsaWNLZXkoa2V5SW5mby5wdWJsaWNLZXkpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHtcclxuICAgICAgICAgICAga3R5OiBcIkVDXCIsXHJcbiAgICAgICAgICAgIGNydjogdGhpcy5hbGdvcml0aG0ubmFtZWRDdXJ2ZSxcclxuICAgICAgICAgICAga2V5X29wczogdGhpcy51c2FnZXMsXHJcbiAgICAgICAgICAgIGV4dDogdGhpcy5leHRyYWN0YWJsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGpzb24sIEpzb25TZXJpYWxpemVyLnRvSlNPTihrZXkpKTtcclxuICAgIH1cclxuICAgIGZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBpZiAoIWpzb24uY3J2KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgZ2V0IG5hbWVkIGN1cnZlIGZyb20gSldLLiBQcm9wZXJ0eSAnY3J2JyBpcyByZXF1aXJlZGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGpzb24sIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuRWNQdWJsaWNLZXkgfSk7XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHVibGljS2V5SW5mbygpO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLmFsZ29yaXRobSA9IFwiMS4yLjg0MC4xMDA0NS4yLjFcIjtcclxuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5wYXJhbWV0ZXJzID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUobmV3IGNvcmUuYXNuMS5PYmplY3RJZGVudGlmaWVyKGdldE9pZEJ5TmFtZWRDdXJ2ZSQxKGpzb24uY3J2KSkpO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5ID0gQXNuU2VyaWFsaXplci50b0FTTihrZXkpLnZhbHVlSGV4O1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGExUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTSEEtMVwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gU2hhQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYTI1NlByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBLTI1NlwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gU2hhQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYTM4NFByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBLTM4NFwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gU2hhQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYTUxMlByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBLTUxMlwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gU2hhQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIFNoYTMyNTZQcm92aWRlciBleHRlbmRzIGNvcmUuUHJvdmlkZXJDcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIlNIQTMtMjU2XCI7XHJcbiAgICAgICAgdGhpcy51c2FnZXMgPSBbXTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBTaGFDcnlwdG8uZGlnZXN0KGFsZ29yaXRobSwgZGF0YSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2hhMzM4NFByb3ZpZGVyIGV4dGVuZHMgY29yZS5Qcm92aWRlckNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiU0hBMy0zODRcIjtcclxuICAgICAgICB0aGlzLnVzYWdlcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EaWdlc3QoYWxnb3JpdGhtLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFNoYUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGEzNTEyUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLlByb3ZpZGVyQ3J5cHRvIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJTSEEzLTUxMlwiO1xyXG4gICAgICAgIHRoaXMudXNhZ2VzID0gW107XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gU2hhQ3J5cHRvLmRpZ2VzdChhbGdvcml0aG0sIGRhdGEpO1xyXG4gICAgfVxyXG59XG5cbmNsYXNzIEVjQ3J5cHRvIHtcclxuICAgIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBwcml2YXRlS2V5ID0gbmV3IEVjUHJpdmF0ZUtleSgpO1xyXG4gICAgICAgIHByaXZhdGVLZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xyXG4gICAgICAgIHByaXZhdGVLZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBwcml2YXRlS2V5LnVzYWdlcyA9IGtleVVzYWdlcy5maWx0ZXIoKHVzYWdlKSA9PiB0aGlzLnByaXZhdGVLZXlVc2FnZXMuaW5kZXhPZih1c2FnZSkgIT09IC0xKTtcclxuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBuZXcgRWNQdWJsaWNLZXkoKTtcclxuICAgICAgICBwdWJsaWNLZXkuYWxnb3JpdGhtID0gYWxnb3JpdGhtO1xyXG4gICAgICAgIHB1YmxpY0tleS5leHRyYWN0YWJsZSA9IHRydWU7XHJcbiAgICAgICAgcHVibGljS2V5LnVzYWdlcyA9IGtleVVzYWdlcy5maWx0ZXIoKHVzYWdlKSA9PiB0aGlzLnB1YmxpY0tleVVzYWdlcy5pbmRleE9mKHVzYWdlKSAhPT0gLTEpO1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBjcnlwdG9fX2RlZmF1bHQuZ2VuZXJhdGVLZXlQYWlyU3luYyhcImVjXCIsIHtcclxuICAgICAgICAgICAgbmFtZWRDdXJ2ZTogdGhpcy5nZXRPcGVuU1NMTmFtZWRDdXJ2ZShhbGdvcml0aG0ubmFtZWRDdXJ2ZSksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleUVuY29kaW5nOiB7XHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiZGVyXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNwa2lcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcHJpdmF0ZUtleUVuY29kaW5nOiB7XHJcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IFwiZGVyXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcInBrY3M4XCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcHJpdmF0ZUtleS5kYXRhID0ga2V5cy5wcml2YXRlS2V5O1xyXG4gICAgICAgIHB1YmxpY0tleS5kYXRhID0ga2V5cy5wdWJsaWNLZXk7XHJcbiAgICAgICAgY29uc3QgcmVzID0ge1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5LFxyXG4gICAgICAgICAgICBwdWJsaWNLZXksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIHNpZ24oYWxnb3JpdGhtLCBrZXksIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjcnlwdG9BbGcgPSBTaGFDcnlwdG8uZ2V0QWxnb3JpdGhtTmFtZShhbGdvcml0aG0uaGFzaCk7XHJcbiAgICAgICAgY29uc3Qgc2lnbmVyID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZVNpZ24oY3J5cHRvQWxnKTtcclxuICAgICAgICBzaWduZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEpKTtcclxuICAgICAgICBpZiAoIWtleS5wZW0pIHtcclxuICAgICAgICAgICAga2V5LnBlbSA9IGAtLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cXG4ke2tleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBrZXk6IGtleS5wZW0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBzaWduZXIuc2lnbihvcHRpb25zKTtcclxuICAgICAgICBjb25zdCBlY1NpZ25hdHVyZSA9IEFzblBhcnNlci5wYXJzZShzaWduYXR1cmUsIGNvcmUuYXNuMS5FY0RzYVNpZ25hdHVyZSk7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlUmF3ID0gY29yZS5FY1V0aWxzLmVuY29kZVNpZ25hdHVyZShlY1NpZ25hdHVyZSwgY29yZS5FY0N1cnZlcy5nZXQoa2V5LmFsZ29yaXRobS5uYW1lZEN1cnZlKS5zaXplKTtcclxuICAgICAgICByZXR1cm4gc2lnbmF0dXJlUmF3LmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyB2ZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNyeXB0b0FsZyA9IFNoYUNyeXB0by5nZXRBbGdvcml0aG1OYW1lKGFsZ29yaXRobS5oYXNoKTtcclxuICAgICAgICBjb25zdCBzaWduZXIgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlVmVyaWZ5KGNyeXB0b0FsZyk7XHJcbiAgICAgICAgc2lnbmVyLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhKSk7XHJcbiAgICAgICAgaWYgKCFrZXkucGVtKSB7XHJcbiAgICAgICAgICAgIGtleS5wZW0gPSBgLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cXG4ke2tleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGtleToga2V5LnBlbSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGVjU2lnbmF0dXJlID0gbmV3IGNvcmUuYXNuMS5FY0RzYVNpZ25hdHVyZSgpO1xyXG4gICAgICAgIGNvbnN0IG5hbWVkQ3VydmUgPSBjb3JlLkVjQ3VydmVzLmdldChrZXkuYWxnb3JpdGhtLm5hbWVkQ3VydmUpO1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZVBvaW50ID0gY29yZS5FY1V0aWxzLmRlY29kZVNpZ25hdHVyZShzaWduYXR1cmUsIG5hbWVkQ3VydmUuc2l6ZSk7XHJcbiAgICAgICAgZWNTaWduYXR1cmUuciA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlci50b0FycmF5QnVmZmVyKHNpZ25hdHVyZVBvaW50LnIpO1xyXG4gICAgICAgIGVjU2lnbmF0dXJlLnMgPSBCdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihzaWduYXR1cmVQb2ludC5zKTtcclxuICAgICAgICBjb25zdCBlY1NpZ25hdHVyZVJhdyA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGVjU2lnbmF0dXJlKSk7XHJcbiAgICAgICAgY29uc3Qgb2sgPSBzaWduZXIudmVyaWZ5KG9wdGlvbnMsIGVjU2lnbmF0dXJlUmF3KTtcclxuICAgICAgICByZXR1cm4gb2s7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgZGVyaXZlQml0cyhhbGdvcml0aG0sIGJhc2VLZXksIGxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGNyeXB0b0FsZyA9IHRoaXMuZ2V0T3BlblNTTE5hbWVkQ3VydmUoYmFzZUtleS5hbGdvcml0aG0ubmFtZWRDdXJ2ZSk7XHJcbiAgICAgICAgY29uc3QgZWNkaCA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVFQ0RIKGNyeXB0b0FsZyk7XHJcbiAgICAgICAgY29uc3QgYXNuUHJpdmF0ZUtleSA9IEFzblBhcnNlci5wYXJzZShiYXNlS2V5LmRhdGEsIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XHJcbiAgICAgICAgY29uc3QgYXNuRWNQcml2YXRlS2V5ID0gQXNuUGFyc2VyLnBhcnNlKGFzblByaXZhdGVLZXkucHJpdmF0ZUtleSwgY29yZS5hc24xLkVjUHJpdmF0ZUtleSk7XHJcbiAgICAgICAgZWNkaC5zZXRQcml2YXRlS2V5KEJ1ZmZlci5mcm9tKGFzbkVjUHJpdmF0ZUtleS5wcml2YXRlS2V5KSk7XHJcbiAgICAgICAgY29uc3QgYXNuUHVibGljS2V5ID0gQXNuUGFyc2VyLnBhcnNlKGFsZ29yaXRobS5wdWJsaWMuZGF0YSwgY29yZS5hc24xLlB1YmxpY0tleUluZm8pO1xyXG4gICAgICAgIGNvbnN0IGJpdHMgPSBlY2RoLmNvbXB1dGVTZWNyZXQoQnVmZmVyLmZyb20oYXNuUHVibGljS2V5LnB1YmxpY0tleSkpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShiaXRzKS5idWZmZXIuc2xpY2UoMCwgbGVuZ3RoID4+IDMpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpzb25TZXJpYWxpemVyLnRvSlNPTihrZXkpO1xyXG4gICAgICAgICAgICBjYXNlIFwicGtjczhcIjpcclxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShrZXkuZGF0YSkuYnVmZmVyO1xyXG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHB1YmxpY0tleUluZm8gPSBBc25QYXJzZXIucGFyc2Uoa2V5LmRhdGEsIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwdWJsaWNLZXlJbmZvLnB1YmxpY0tleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycsICdyYXcnLCBwa2NzOCcgb3IgJ3Nwa2knXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBpbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgandrID0ga2V5RGF0YTtcclxuICAgICAgICAgICAgICAgIGlmIChqd2suZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IGNvcmUuYXNuMS5FY1ByaXZhdGVLZXkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHJpdmF0ZUtleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGtleURhdGEsIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuRWNQdWJsaWNLZXkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFwicmF3XCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IG5ldyBjb3JlLmFzbjEuRWNQdWJsaWNLZXkoa2V5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQdWJsaWNLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJzcGtpXCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UobmV3IFVpbnQ4QXJyYXkoa2V5RGF0YSksIGNvcmUuYXNuMS5QdWJsaWNLZXlJbmZvKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFzbktleSA9IG5ldyBjb3JlLmFzbjEuRWNQdWJsaWNLZXkoa2V5SW5mby5wdWJsaWNLZXkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRLZXlQYXJhbWV0ZXJzKGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMsIGFsZ29yaXRobS5uYW1lZEN1cnZlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInBrY3M4XCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UobmV3IFVpbnQ4QXJyYXkoa2V5RGF0YSksIGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wcml2YXRlS2V5LCBjb3JlLmFzbjEuRWNQcml2YXRlS2V5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0S2V5UGFyYW1ldGVycyhrZXlJbmZvLnByaXZhdGVLZXlBbGdvcml0aG0ucGFyYW1ldGVycywgYWxnb3JpdGhtLm5hbWVkQ3VydmUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHJpdmF0ZUtleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snLCAncmF3JywgJ3BrY3M4JyBvciAnc3BraSdcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzc2VydEtleVBhcmFtZXRlcnMocGFyYW1ldGVycywgbmFtZWRDdXJ2ZSkge1xyXG4gICAgICAgIGlmICghcGFyYW1ldGVycykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5DcnlwdG9FcnJvcihcIktleSBpbmZvIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwYXJhbWV0ZXJzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbmFtZWRDdXJ2ZUlkZW50aWZpZXIgPSBcIlwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG5hbWVkQ3VydmVJZGVudGlmaWVyID0gQXNuUGFyc2VyLnBhcnNlKHBhcmFtZXRlcnMsIGNvcmUuYXNuMS5PYmplY3RJZGVudGlmaWVyKS52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuQ3J5cHRvRXJyb3IoXCJDYW5ub3QgcmVhZCBrZXkgaW5mbyBwYXJhbWV0ZXJzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZ2V0T2lkQnlOYW1lZEN1cnZlJDEobmFtZWRDdXJ2ZSkgIT09IG5hbWVkQ3VydmVJZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLkNyeXB0b0Vycm9yKFwiS2V5IGluZm8gcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gbmFtZWQgY3VydmVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydFByaXZhdGVLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXlJbmZvID0gbmV3IGNvcmUuYXNuMS5Qcml2YXRlS2V5SW5mbygpO1xyXG4gICAgICAgIGtleUluZm8ucHJpdmF0ZUtleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTAwNDUuMi4xXCI7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtLnBhcmFtZXRlcnMgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShuZXcgY29yZS5hc24xLk9iamVjdElkZW50aWZpZXIoZ2V0T2lkQnlOYW1lZEN1cnZlJDEoYWxnb3JpdGhtLm5hbWVkQ3VydmUpKSk7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5ID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUoYXNuS2V5KTtcclxuICAgICAgICBjb25zdCBrZXkgPSBuZXcgRWNQcml2YXRlS2V5KCk7XHJcbiAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XHJcbiAgICAgICAga2V5LmFsZ29yaXRobSA9IE9iamVjdC5hc3NpZ24oe30sIGFsZ29yaXRobSk7XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydFB1YmxpY0tleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlB1YmxpY0tleUluZm8oKTtcclxuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5hbGdvcml0aG0gPSBcIjEuMi44NDAuMTAwNDUuMi4xXCI7XHJcbiAgICAgICAgY29uc3QgbmFtZWRDdXJ2ZSA9IGdldE9pZEJ5TmFtZWRDdXJ2ZSQxKGFsZ29yaXRobS5uYW1lZEN1cnZlKTtcclxuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleUFsZ29yaXRobS5wYXJhbWV0ZXJzID0gQXNuU2VyaWFsaXplci5zZXJpYWxpemUobmV3IGNvcmUuYXNuMS5PYmplY3RJZGVudGlmaWVyKG5hbWVkQ3VydmUpKTtcclxuICAgICAgICBrZXlJbmZvLnB1YmxpY0tleSA9IGFzbktleS52YWx1ZTtcclxuICAgICAgICBjb25zdCBrZXkgPSBuZXcgRWNQdWJsaWNLZXkoKTtcclxuICAgICAgICBrZXkuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gT2JqZWN0LmFzc2lnbih7fSwgYWxnb3JpdGhtKTtcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0T3BlblNTTE5hbWVkQ3VydmUoY3VydmUpIHtcclxuICAgICAgICBzd2l0Y2ggKGN1cnZlLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcIlAtMjU2XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwcmltZTI1NnYxXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJLLTI1NlwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2VjcDI1NmsxXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQLTM4NFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2VjcDM4NHIxXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQLTUyMVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2VjcDUyMXIxXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VydmU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbkVjQ3J5cHRvLnB1YmxpY0tleVVzYWdlcyA9IFtcInZlcmlmeVwiXTtcclxuRWNDcnlwdG8ucHJpdmF0ZUtleVVzYWdlcyA9IFtcInNpZ25cIiwgXCJkZXJpdmVLZXlcIiwgXCJkZXJpdmVCaXRzXCJdO1xuXG5jbGFzcyBFY2RzYVByb3ZpZGVyIGV4dGVuZHMgY29yZS5FY2RzYVByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5uYW1lZEN1cnZlcyA9IGNvcmUuRWNDdXJ2ZXMubmFtZXM7XHJcbiAgICAgICAgdGhpcy5oYXNoQWxnb3JpdGhtcyA9IFtcclxuICAgICAgICAgICAgXCJTSEEtMVwiLCBcIlNIQS0yNTZcIiwgXCJTSEEtMzg0XCIsIFwiU0hBLTUxMlwiLFxyXG4gICAgICAgICAgICBcInNoYWtlMTI4XCIsIFwic2hha2UyNTZcIixcclxuICAgICAgICAgICAgXCJTSEEzLTI1NlwiLCBcIlNIQTMtMzg0XCIsIFwiU0hBMy01MTJcIlxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBFY0NyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIC4uLmFsZ29yaXRobSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHNldENyeXB0b0tleShrZXlzLnByaXZhdGVLZXkpLFxyXG4gICAgICAgICAgICBwdWJsaWNLZXk6IHNldENyeXB0b0tleShrZXlzLnB1YmxpY0tleSksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uU2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBFY0NyeXB0by5zaWduKGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uVmVyaWZ5KGFsZ29yaXRobSwga2V5LCBzaWduYXR1cmUsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gRWNDcnlwdG8udmVyaWZ5KGFsZ29yaXRobSwgZ2V0Q3J5cHRvS2V5KGtleSksIG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSksIG5ldyBVaW50OEFycmF5KGRhdGEpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIEVjQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgRWNDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5hbGdvcml0aG0sIG5hbWU6IHRoaXMubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxLZXkgPSBnZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgICAgICBpZiAoIShpbnRlcm5hbEtleSBpbnN0YW5jZW9mIEVjUHJpdmF0ZUtleSB8fCBpbnRlcm5hbEtleSBpbnN0YW5jZW9mIEVjUHVibGljS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgRUMgQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBFY2RoUHJvdmlkZXIgZXh0ZW5kcyBjb3JlLkVjZGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZWRDdXJ2ZXMgPSBjb3JlLkVjQ3VydmVzLm5hbWVzO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgRWNDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICAuLi5hbGdvcml0aG0sXHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wcml2YXRlS2V5KSxcclxuICAgICAgICAgICAgcHVibGljS2V5OiBzZXRDcnlwdG9LZXkoa2V5cy5wdWJsaWNLZXkpLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHJldHVybiBFY0NyeXB0by5leHBvcnRLZXkoZm9ybWF0LCBnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IEVjQ3J5cHRvLmltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIHsgLi4uYWxnb3JpdGhtLCBuYW1lOiB0aGlzLm5hbWUgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSkge1xyXG4gICAgICAgIHN1cGVyLmNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpO1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsS2V5ID0gZ2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICAgICAgaWYgKCEoaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBFY1ByaXZhdGVLZXkgfHwgaW50ZXJuYWxLZXkgaW5zdGFuY2VvZiBFY1B1YmxpY0tleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImtleTogSXMgbm90IEVDIENyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkRlcml2ZUJpdHMoYWxnb3JpdGhtLCBiYXNlS2V5LCBsZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBiaXRzID0gYXdhaXQgRWNDcnlwdG8uZGVyaXZlQml0cyh7IC4uLmFsZ29yaXRobSwgcHVibGljOiBnZXRDcnlwdG9LZXkoYWxnb3JpdGhtLnB1YmxpYykgfSwgZ2V0Q3J5cHRvS2V5KGJhc2VLZXkpLCBsZW5ndGgpO1xyXG4gICAgICAgIHJldHVybiBiaXRzO1xyXG4gICAgfVxyXG59XG5cbmNvbnN0IGVkT0lEcyA9IHtcclxuICAgIFtjb3JlLmFzbjEuaWRFZDQ0OF06IFwiRWQ0NDhcIixcclxuICAgIFwiZWQ0NDhcIjogY29yZS5hc24xLmlkRWQ0NDgsXHJcbiAgICBbY29yZS5hc24xLmlkWDQ0OF06IFwiWDQ0OFwiLFxyXG4gICAgXCJ4NDQ4XCI6IGNvcmUuYXNuMS5pZFg0NDgsXHJcbiAgICBbY29yZS5hc24xLmlkRWQyNTUxOV06IFwiRWQyNTUxOVwiLFxyXG4gICAgXCJlZDI1NTE5XCI6IGNvcmUuYXNuMS5pZEVkMjU1MTksXHJcbiAgICBbY29yZS5hc24xLmlkWDI1NTE5XTogXCJYMjU1MTlcIixcclxuICAgIFwieDI1NTE5XCI6IGNvcmUuYXNuMS5pZFgyNTUxOSxcclxufTtcclxuZnVuY3Rpb24gZ2V0T2lkQnlOYW1lZEN1cnZlKG5hbWVkQ3VydmUpIHtcclxuICAgIGNvbnN0IG9pZCA9IGVkT0lEc1tuYW1lZEN1cnZlLnRvTG93ZXJDYXNlKCldO1xyXG4gICAgaWYgKCFvaWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihgQ2Fubm90IGNvbnZlcnQgV2ViQ3J5cHRvIG5hbWVkIGN1cnZlICcke25hbWVkQ3VydmV9JyB0byBPSURgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvaWQ7XHJcbn1cblxuY2xhc3MgRWRQcml2YXRlS2V5IGV4dGVuZHMgQXN5bW1ldHJpY0tleSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMudHlwZSA9IFwicHJpdmF0ZVwiO1xyXG4gICAgfVxyXG4gICAgZ2V0S2V5KCkge1xyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UodGhpcy5kYXRhLCBjb3JlLmFzbjEuUHJpdmF0ZUtleUluZm8pO1xyXG4gICAgICAgIHJldHVybiBBc25QYXJzZXIucGFyc2Uoa2V5SW5mby5wcml2YXRlS2V5LCBjb3JlLmFzbjEuQ3VydmVQcml2YXRlS2V5KTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleSgpO1xyXG4gICAgICAgIGNvbnN0IGpzb24gPSB7XHJcbiAgICAgICAgICAgIGt0eTogXCJPS1BcIixcclxuICAgICAgICAgICAgY3J2OiB0aGlzLmFsZ29yaXRobS5uYW1lZEN1cnZlLFxyXG4gICAgICAgICAgICBrZXlfb3BzOiB0aGlzLnVzYWdlcyxcclxuICAgICAgICAgICAgZXh0OiB0aGlzLmV4dHJhY3RhYmxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwgSnNvblNlcmlhbGl6ZXIudG9KU09OKGtleSkpO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICghanNvbi5jcnYpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoYENhbm5vdCBnZXQgbmFtZWQgY3VydmUgZnJvbSBKV0suIFByb3BlcnR5ICdjcnYnIGlzIHJlcXVpcmVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBuZXcgY29yZS5hc24xLlByaXZhdGVLZXlJbmZvKCk7XHJcbiAgICAgICAga2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtLmFsZ29yaXRobSA9IGdldE9pZEJ5TmFtZWRDdXJ2ZShqc29uLmNydik7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gSnNvblBhcnNlci5mcm9tSlNPTihqc29uLCB7IHRhcmdldFNjaGVtYTogY29yZS5hc24xLkN1cnZlUHJpdmF0ZUtleSB9KTtcclxuICAgICAgICBrZXlJbmZvLnByaXZhdGVLZXkgPSBBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXkpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5mcm9tKEFzblNlcmlhbGl6ZXIuc2VyaWFsaXplKGtleUluZm8pKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxuXG5jbGFzcyBFZFB1YmxpY0tleSBleHRlbmRzIEFzeW1tZXRyaWNLZXkge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnR5cGUgPSBcInB1YmxpY1wiO1xyXG4gICAgfVxyXG4gICAgZ2V0S2V5KCkge1xyXG4gICAgICAgIGNvbnN0IGtleUluZm8gPSBBc25QYXJzZXIucGFyc2UodGhpcy5kYXRhLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XHJcbiAgICAgICAgcmV0dXJuIGtleUluZm8ucHVibGljS2V5O1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7XHJcbiAgICAgICAgY29uc3QganNvbiA9IHtcclxuICAgICAgICAgICAga3R5OiBcIk9LUFwiLFxyXG4gICAgICAgICAgICBjcnY6IHRoaXMuYWxnb3JpdGhtLm5hbWVkQ3VydmUsXHJcbiAgICAgICAgICAgIGtleV9vcHM6IHRoaXMudXNhZ2VzLFxyXG4gICAgICAgICAgICBleHQ6IHRoaXMuZXh0cmFjdGFibGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihqc29uLCB7XHJcbiAgICAgICAgICAgIHg6IENvbnZlcnQuVG9CYXNlNjRVcmwoa2V5KVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICghanNvbi5jcnYpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoYENhbm5vdCBnZXQgbmFtZWQgY3VydmUgZnJvbSBKV0suIFByb3BlcnR5ICdjcnYnIGlzIHJlcXVpcmVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghanNvbi54KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKGBDYW5ub3QgZ2V0IHByb3BlcnR5IGZyb20gSldLLiBQcm9wZXJ0eSAneCcgaXMgcmVxdWlyZWRgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qga2V5SW5mbyA9IG5ldyBjb3JlLmFzbjEuUHVibGljS2V5SW5mbygpO1xyXG4gICAgICAgIGtleUluZm8ucHVibGljS2V5QWxnb3JpdGhtLmFsZ29yaXRobSA9IGdldE9pZEJ5TmFtZWRDdXJ2ZShqc29uLmNydik7XHJcbiAgICAgICAga2V5SW5mby5wdWJsaWNLZXkgPSBDb252ZXJ0LkZyb21CYXNlNjRVcmwoanNvbi54KTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBCdWZmZXIuZnJvbShBc25TZXJpYWxpemVyLnNlcmlhbGl6ZShrZXlJbmZvKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgRWRDcnlwdG8ge1xyXG4gICAgc3RhdGljIGFzeW5jIGdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBuZXcgRWRQcml2YXRlS2V5KCk7XHJcbiAgICAgICAgcHJpdmF0ZUtleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAgcHJpdmF0ZUtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIHByaXZhdGVLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHJpdmF0ZUtleVVzYWdlcy5pbmRleE9mKHVzYWdlKSAhPT0gLTEpO1xyXG4gICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBFZFB1YmxpY0tleSgpO1xyXG4gICAgICAgIHB1YmxpY0tleS5hbGdvcml0aG0gPSBhbGdvcml0aG07XHJcbiAgICAgICAgcHVibGljS2V5LmV4dHJhY3RhYmxlID0gdHJ1ZTtcclxuICAgICAgICBwdWJsaWNLZXkudXNhZ2VzID0ga2V5VXNhZ2VzLmZpbHRlcigodXNhZ2UpID0+IHRoaXMucHVibGljS2V5VXNhZ2VzLmluZGV4T2YodXNhZ2UpICE9PSAtMSk7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IGFsZ29yaXRobS5uYW1lZEN1cnZlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGNyeXB0b19fZGVmYXVsdC5nZW5lcmF0ZUtleVBhaXJTeW5jKHR5cGUsIHtcclxuICAgICAgICAgICAgcHVibGljS2V5RW5jb2Rpbmc6IHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3BraVwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcml2YXRlS2V5RW5jb2Rpbmc6IHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwicGtjczhcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBwcml2YXRlS2V5LmRhdGEgPSBrZXlzLnByaXZhdGVLZXk7XHJcbiAgICAgICAgcHVibGljS2V5LmRhdGEgPSBrZXlzLnB1YmxpY0tleTtcclxuICAgICAgICBjb25zdCByZXMgPSB7XHJcbiAgICAgICAgICAgIHByaXZhdGVLZXksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgc2lnbihhbGdvcml0aG0sIGtleSwgZGF0YSkge1xyXG4gICAgICAgIGlmICgha2V5LnBlbSkge1xyXG4gICAgICAgICAgICBrZXkucGVtID0gYC0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVxcbiR7a2V5LmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9XFxuLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGtleToga2V5LnBlbSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGNyeXB0b19fZGVmYXVsdC5zaWduKG51bGwsIEJ1ZmZlci5mcm9tKGRhdGEpLCBvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gY29yZS5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihzaWduYXR1cmUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIHZlcmlmeShhbGdvcml0aG0sIGtleSwgc2lnbmF0dXJlLCBkYXRhKSB7XHJcbiAgICAgICAgaWYgKCFrZXkucGVtKSB7XHJcbiAgICAgICAgICAgIGtleS5wZW0gPSBgLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cXG4ke2tleS5kYXRhLnRvU3RyaW5nKFwiYmFzZTY0XCIpfVxcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGtleToga2V5LnBlbSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IG9rID0gY3J5cHRvX19kZWZhdWx0LnZlcmlmeShudWxsLCBCdWZmZXIuZnJvbShkYXRhKSwgb3B0aW9ucywgQnVmZmVyLmZyb20oc2lnbmF0dXJlKSk7XHJcbiAgICAgICAgcmV0dXJuIG9rO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIGRlcml2ZUJpdHMoYWxnb3JpdGhtLCBiYXNlS2V5LCBsZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlUHVibGljS2V5KHtcclxuICAgICAgICAgICAga2V5OiBhbGdvcml0aG0ucHVibGljLmRhdGEsXHJcbiAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcclxuICAgICAgICAgICAgdHlwZTogXCJzcGtpXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVQcml2YXRlS2V5KHtcclxuICAgICAgICAgICAga2V5OiBiYXNlS2V5LmRhdGEsXHJcbiAgICAgICAgICAgIGZvcm1hdDogXCJkZXJcIixcclxuICAgICAgICAgICAgdHlwZTogXCJwa2NzOFwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGJpdHMgPSBjcnlwdG9fX2RlZmF1bHQuZGlmZmllSGVsbG1hbih7XHJcbiAgICAgICAgICAgIHB1YmxpY0tleSxcclxuICAgICAgICAgICAgcHJpdmF0ZUtleSxcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYml0cykuYnVmZmVyLnNsaWNlKDAsIGxlbmd0aCA+PiAzKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBleHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBKc29uU2VyaWFsaXplci50b0pTT04oa2V5KTtcclxuICAgICAgICAgICAgY2FzZSBcInBrY3M4XCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJzcGtpXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoa2V5LmRhdGEpLmJ1ZmZlcjtcclxuICAgICAgICAgICAgY2FzZSBcInJhd1wiOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwdWJsaWNLZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKGtleS5kYXRhLCBjb3JlLmFzbjEuUHVibGljS2V5SW5mbyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHVibGljS2V5SW5mby5wdWJsaWNLZXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snLCAncmF3JywgcGtjczgnIG9yICdzcGtpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgc3dpdGNoIChmb3JtYXQudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiandrXCI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGp3ayA9IGtleURhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoandrLmQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc25LZXkgPSBKc29uUGFyc2VyLmZyb21KU09OKGtleURhdGEsIHsgdGFyZ2V0U2NoZW1hOiBjb3JlLmFzbjEuQ3VydmVQcml2YXRlS2V5IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFByaXZhdGVLZXkoYXNuS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqd2sueCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5RGF0YTogQ2Fubm90IGdldCByZXF1aXJlZCAneCcgZmlsZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydFB1YmxpY0tleShDb252ZXJ0LkZyb21CYXNlNjRVcmwoandrLngpLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjoge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBcInNwa2lcIjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5SW5mbyA9IEFzblBhcnNlci5wYXJzZShuZXcgVWludDhBcnJheShrZXlEYXRhKSwgY29yZS5hc24xLlB1YmxpY0tleUluZm8pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0UHVibGljS2V5KGtleUluZm8ucHVibGljS2V5LCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJwa2NzOFwiOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlJbmZvID0gQXNuUGFyc2VyLnBhcnNlKG5ldyBVaW50OEFycmF5KGtleURhdGEpLCBjb3JlLmFzbjEuUHJpdmF0ZUtleUluZm8pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXNuS2V5ID0gQXNuUGFyc2VyLnBhcnNlKGtleUluZm8ucHJpdmF0ZUtleSwgY29yZS5hc24xLkN1cnZlUHJpdmF0ZUtleSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRQcml2YXRlS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGNvcmUuT3BlcmF0aW9uRXJyb3IoXCJmb3JtYXQ6IE11c3QgYmUgJ2p3aycsICdyYXcnLCAncGtjczgnIG9yICdzcGtpJ1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaW1wb3J0UHJpdmF0ZUtleShhc25LZXksIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBFZFByaXZhdGVLZXkoKTtcclxuICAgICAgICBrZXkuZnJvbUpTT04oe1xyXG4gICAgICAgICAgICBjcnY6IGFsZ29yaXRobS5uYW1lZEN1cnZlLFxyXG4gICAgICAgICAgICBkOiBDb252ZXJ0LlRvQmFzZTY0VXJsKGFzbktleS5kKSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0gT2JqZWN0LmFzc2lnbih7fSwgYWxnb3JpdGhtKTtcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgaW1wb3J0UHVibGljS2V5KGFzbktleSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IEVkUHVibGljS2V5KCk7XHJcbiAgICAgICAga2V5LmZyb21KU09OKHtcclxuICAgICAgICAgICAgY3J2OiBhbGdvcml0aG0ubmFtZWRDdXJ2ZSxcclxuICAgICAgICAgICAgeDogQ29udmVydC5Ub0Jhc2U2NFVybChhc25LZXkpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGtleS5hbGdvcml0aG0gPSBPYmplY3QuYXNzaWduKHt9LCBhbGdvcml0aG0pO1xyXG4gICAgICAgIGtleS5leHRyYWN0YWJsZSA9IGV4dHJhY3RhYmxlO1xyXG4gICAgICAgIGtleS51c2FnZXMgPSBrZXlVc2FnZXM7XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxufVxyXG5FZENyeXB0by5wdWJsaWNLZXlVc2FnZXMgPSBbXCJ2ZXJpZnlcIl07XHJcbkVkQ3J5cHRvLnByaXZhdGVLZXlVc2FnZXMgPSBbXCJzaWduXCIsIFwiZGVyaXZlS2V5XCIsIFwiZGVyaXZlQml0c1wiXTtcblxuY2xhc3MgRWREc2FQcm92aWRlciBleHRlbmRzIGNvcmUuRWREc2FQcm92aWRlciB7XHJcbiAgICBhc3luYyBvbkdlbmVyYXRlS2V5KGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCBFZENyeXB0by5nZW5lcmF0ZUtleSh7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgbmFtZWRDdXJ2ZTogYWxnb3JpdGhtLm5hbWVkQ3VydmUucmVwbGFjZSgvXmVkL2ksIFwiRWRcIiksXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogc2V0Q3J5cHRvS2V5KGtleXMucHJpdmF0ZUtleSksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIEVkQ3J5cHRvLnNpZ24oYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25WZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBFZENyeXB0by52ZXJpZnkoYWxnb3JpdGhtLCBnZXRDcnlwdG9LZXkoa2V5KSwgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeHBvcnRLZXkoZm9ybWF0LCBrZXkpIHtcclxuICAgICAgICByZXR1cm4gRWRDcnlwdG8uZXhwb3J0S2V5KGZvcm1hdCwgZ2V0Q3J5cHRvS2V5KGtleSkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25JbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCBhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBFZENyeXB0by5pbXBvcnRLZXkoZm9ybWF0LCBrZXlEYXRhLCB7IC4uLmFsZ29yaXRobSwgbmFtZTogdGhpcy5uYW1lIH0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBFY2RoRXNQcm92aWRlciBleHRlbmRzIGNvcmUuRWNkaEVzUHJvdmlkZXIge1xyXG4gICAgYXN5bmMgb25HZW5lcmF0ZUtleShhbGdvcml0aG0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgRWRDcnlwdG8uZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIG5hbWVkQ3VydmU6IGFsZ29yaXRobS5uYW1lZEN1cnZlLnRvVXBwZXJDYXNlKCksXHJcbiAgICAgICAgfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJpdmF0ZUtleTogc2V0Q3J5cHRvS2V5KGtleXMucHJpdmF0ZUtleSksXHJcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2V0Q3J5cHRvS2V5KGtleXMucHVibGljS2V5KSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25EZXJpdmVCaXRzKGFsZ29yaXRobSwgYmFzZUtleSwgbGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgYml0cyA9IGF3YWl0IEVkQ3J5cHRvLmRlcml2ZUJpdHMoeyAuLi5hbGdvcml0aG0sIHB1YmxpYzogZ2V0Q3J5cHRvS2V5KGFsZ29yaXRobS5wdWJsaWMpIH0sIGdldENyeXB0b0tleShiYXNlS2V5KSwgbGVuZ3RoKTtcclxuICAgICAgICByZXR1cm4gYml0cztcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhwb3J0S2V5KGZvcm1hdCwga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIEVkQ3J5cHRvLmV4cG9ydEtleShmb3JtYXQsIGdldENyeXB0b0tleShrZXkpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgRWRDcnlwdG8uaW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgeyAuLi5hbGdvcml0aG0sIG5hbWU6IHRoaXMubmFtZSB9LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTtcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgUGJrZGZDcnlwdG9LZXkgZXh0ZW5kcyBDcnlwdG9LZXkge1xyXG59XG5cbmNsYXNzIFBia2RmMlByb3ZpZGVyIGV4dGVuZHMgY29yZS5QYmtkZjJQcm92aWRlciB7XHJcbiAgICBhc3luYyBvbkRlcml2ZUJpdHMoYWxnb3JpdGhtLCBiYXNlS2V5LCBsZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzYWx0ID0gY29yZS5CdWZmZXJTb3VyY2VDb252ZXJ0ZXIudG9BcnJheUJ1ZmZlcihhbGdvcml0aG0uc2FsdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBhbGdvcml0aG0uaGFzaC5uYW1lLnJlcGxhY2UoXCItXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBjcnlwdG9fX2RlZmF1bHQucGJrZGYyKGdldENyeXB0b0tleShiYXNlS2V5KS5kYXRhLCBCdWZmZXIuZnJvbShzYWx0KSwgYWxnb3JpdGhtLml0ZXJhdGlvbnMsIGxlbmd0aCA+PiAzLCBoYXNoLCAoZXJyLCBkZXJpdmVkQml0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShkZXJpdmVkQml0cykuYnVmZmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkltcG9ydEtleShmb3JtYXQsIGtleURhdGEsIGFsZ29yaXRobSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcykge1xyXG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwicmF3XCIpIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gbmV3IFBia2RmQ3J5cHRvS2V5KCk7XHJcbiAgICAgICAgICAgIGtleS5kYXRhID0gQnVmZmVyLmZyb20oa2V5RGF0YSk7XHJcbiAgICAgICAgICAgIGtleS5hbGdvcml0aG0gPSB7IG5hbWU6IHRoaXMubmFtZSB9O1xyXG4gICAgICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBmYWxzZTtcclxuICAgICAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAncmF3J1wiKTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIFBia2RmQ3J5cHRvS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgUEJLREYgQ3J5cHRvS2V5XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5jbGFzcyBIbWFjQ3J5cHRvS2V5IGV4dGVuZHMgQ3J5cHRvS2V5IHtcclxuICAgIGdldCBhbGcoKSB7XHJcbiAgICAgICAgY29uc3QgaGFzaCA9IHRoaXMuYWxnb3JpdGhtLmhhc2gubmFtZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiBgSFMke2hhc2gucmVwbGFjZShcIlNIQS1cIiwgXCJcIil9YDtcclxuICAgIH1cclxuICAgIHNldCBhbGcodmFsdWUpIHtcclxuICAgIH1cclxufVxyXG5fX2RlY29yYXRlKFtcclxuICAgIEpzb25Qcm9wKHsgbmFtZTogXCJrXCIsIGNvbnZlcnRlcjogSnNvbkJhc2U2NFVybENvbnZlcnRlciB9KVxyXG5dLCBIbWFjQ3J5cHRvS2V5LnByb3RvdHlwZSwgXCJkYXRhXCIsIHZvaWQgMCk7XG5cbmNsYXNzIEhtYWNQcm92aWRlciBleHRlbmRzIGNvcmUuSG1hY1Byb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uR2VuZXJhdGVLZXkoYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gKGFsZ29yaXRobS5sZW5ndGggfHwgdGhpcy5nZXREZWZhdWx0TGVuZ3RoKGFsZ29yaXRobS5oYXNoLm5hbWUpKSA+PiAzIDw8IDM7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbmV3IEhtYWNDcnlwdG9LZXkoKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0ge1xyXG4gICAgICAgICAgICAuLi5hbGdvcml0aG0sXHJcbiAgICAgICAgICAgIGxlbmd0aCxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICBrZXkuZGF0YSA9IGNyeXB0b19fZGVmYXVsdC5yYW5kb21CeXRlcyhsZW5ndGggPj4gMyk7XHJcbiAgICAgICAgcmV0dXJuIHNldENyeXB0b0tleShrZXkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25TaWduKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgY3J5cHRvQWxnID0gU2hhQ3J5cHRvLmdldEFsZ29yaXRobU5hbWUoa2V5LmFsZ29yaXRobS5oYXNoKTtcclxuICAgICAgICBjb25zdCBobWFjID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUhtYWMoY3J5cHRvQWxnLCBnZXRDcnlwdG9LZXkoa2V5KS5kYXRhKVxyXG4gICAgICAgICAgICAudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEpKS5kaWdlc3QoKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaG1hYykuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25WZXJpZnkoYWxnb3JpdGhtLCBrZXksIHNpZ25hdHVyZSwgZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNyeXB0b0FsZyA9IFNoYUNyeXB0by5nZXRBbGdvcml0aG1OYW1lKGtleS5hbGdvcml0aG0uaGFzaCk7XHJcbiAgICAgICAgY29uc3QgaG1hYyA9IGNyeXB0b19fZGVmYXVsdC5jcmVhdGVIbWFjKGNyeXB0b0FsZywgZ2V0Q3J5cHRvS2V5KGtleSkuZGF0YSlcclxuICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhKSkuZGlnZXN0KCk7XHJcbiAgICAgICAgcmV0dXJuIGhtYWMuY29tcGFyZShCdWZmZXIuZnJvbShzaWduYXR1cmUpKSA9PT0gMDtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgbGV0IGtleTtcclxuICAgICAgICBzd2l0Y2ggKGZvcm1hdC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJqd2tcIjpcclxuICAgICAgICAgICAgICAgIGtleSA9IEpzb25QYXJzZXIuZnJvbUpTT04oa2V5RGF0YSwgeyB0YXJnZXRTY2hlbWE6IEhtYWNDcnlwdG9LZXkgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInJhd1wiOlxyXG4gICAgICAgICAgICAgICAga2V5ID0gbmV3IEhtYWNDcnlwdG9LZXkoKTtcclxuICAgICAgICAgICAgICAgIGtleS5kYXRhID0gQnVmZmVyLmZyb20oa2V5RGF0YSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiZm9ybWF0OiBNdXN0IGJlICdqd2snIG9yICdyYXcnXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0ge1xyXG4gICAgICAgICAgICBoYXNoOiB7IG5hbWU6IGFsZ29yaXRobS5oYXNoLm5hbWUgfSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBsZW5ndGg6IGtleS5kYXRhLmxlbmd0aCA8PCAzLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAga2V5LmV4dHJhY3RhYmxlID0gZXh0cmFjdGFibGU7XHJcbiAgICAgICAga2V5LnVzYWdlcyA9IGtleVVzYWdlcztcclxuICAgICAgICByZXR1cm4gc2V0Q3J5cHRvS2V5KGtleSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4cG9ydEtleShmb3JtYXQsIGtleSkge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0LnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgY2FzZSBcImp3a1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpzb25TZXJpYWxpemVyLnRvSlNPTihnZXRDcnlwdG9LZXkoa2V5KSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyYXdcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShnZXRDcnlwdG9LZXkoa2V5KS5kYXRhKS5idWZmZXI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgY29yZS5PcGVyYXRpb25FcnJvcihcImZvcm1hdDogTXVzdCBiZSAnandrJyBvciAncmF3J1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIuY2hlY2tDcnlwdG9LZXkoa2V5LCBrZXlVc2FnZSk7XHJcbiAgICAgICAgaWYgKCEoZ2V0Q3J5cHRvS2V5KGtleSkgaW5zdGFuY2VvZiBIbWFjQ3J5cHRvS2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwia2V5OiBJcyBub3QgSE1BQyBDcnlwdG9LZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbmNsYXNzIEhrZGZDcnlwdG9LZXkgZXh0ZW5kcyBDcnlwdG9LZXkge1xyXG59XG5cbmNsYXNzIEhrZGZQcm92aWRlciBleHRlbmRzIGNvcmUuSGtkZlByb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uSW1wb3J0S2V5KGZvcm1hdCwga2V5RGF0YSwgYWxnb3JpdGhtLCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKSB7XHJcbiAgICAgICAgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpICE9PSBcInJhd1wiKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBjb3JlLk9wZXJhdGlvbkVycm9yKFwiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBIa2RmQ3J5cHRvS2V5KCk7XHJcbiAgICAgICAga2V5LmRhdGEgPSBCdWZmZXIuZnJvbShrZXlEYXRhKTtcclxuICAgICAgICBrZXkuYWxnb3JpdGhtID0geyBuYW1lOiB0aGlzLm5hbWUgfTtcclxuICAgICAgICBrZXkuZXh0cmFjdGFibGUgPSBleHRyYWN0YWJsZTtcclxuICAgICAgICBrZXkudXNhZ2VzID0ga2V5VXNhZ2VzO1xyXG4gICAgICAgIHJldHVybiBzZXRDcnlwdG9LZXkoa2V5KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRGVyaXZlQml0cyhwYXJhbXMsIGJhc2VLZXksIGxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGhhc2ggPSBwYXJhbXMuaGFzaC5uYW1lLnJlcGxhY2UoXCItXCIsIFwiXCIpO1xyXG4gICAgICAgIGNvbnN0IGhhc2hMZW5ndGggPSBjcnlwdG9fX2RlZmF1bHQuY3JlYXRlSGFzaChoYXNoKS5kaWdlc3QoKS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IGxlbmd0aCAvIDg7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IEJ1ZmZlclNvdXJjZUNvbnZlcnRlciQxLnRvVWludDhBcnJheShwYXJhbXMuaW5mbyk7XHJcbiAgICAgICAgY29uc3QgUFJLID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUhtYWMoaGFzaCwgQnVmZmVyU291cmNlQ29udmVydGVyJDEudG9VaW50OEFycmF5KHBhcmFtcy5zYWx0KSlcclxuICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXJTb3VyY2VDb252ZXJ0ZXIkMS50b1VpbnQ4QXJyYXkoZ2V0Q3J5cHRvS2V5KGJhc2VLZXkpLmRhdGEpKVxyXG4gICAgICAgICAgICAuZGlnZXN0KCk7XHJcbiAgICAgICAgY29uc3QgYmxvY2tzID0gW0J1ZmZlci5hbGxvYygwKV07XHJcbiAgICAgICAgY29uc3QgYmxvY2tDb3VudCA9IE1hdGguY2VpbChieXRlTGVuZ3RoIC8gaGFzaExlbmd0aCkgKyAxO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYmxvY2tDb3VudDsgKytpKSB7XHJcbiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGNyeXB0b19fZGVmYXVsdC5jcmVhdGVIbWFjKGhhc2gsIFBSSylcclxuICAgICAgICAgICAgICAgIC51cGRhdGUoQnVmZmVyLmNvbmNhdChbYmxvY2tzW2kgLSAxXSwgaW5mbywgQnVmZmVyLmZyb20oW2ldKV0pKVxyXG4gICAgICAgICAgICAgICAgLmRpZ2VzdCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYmxvY2tzKS5zbGljZSgwLCBieXRlTGVuZ3RoKTtcclxuICAgIH1cclxuICAgIGNoZWNrQ3J5cHRvS2V5KGtleSwga2V5VXNhZ2UpIHtcclxuICAgICAgICBzdXBlci5jaGVja0NyeXB0b0tleShrZXksIGtleVVzYWdlKTtcclxuICAgICAgICBpZiAoIShnZXRDcnlwdG9LZXkoa2V5KSBpbnN0YW5jZW9mIEhrZGZDcnlwdG9LZXkpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXk6IElzIG5vdCBIS0RGIENyeXB0b0tleVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgU2hha2VDcnlwdG8ge1xyXG4gICAgc3RhdGljIGRpZ2VzdChhbGdvcml0aG0sIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvX19kZWZhdWx0LmNyZWF0ZUhhc2goYWxnb3JpdGhtLm5hbWUudG9Mb3dlckNhc2UoKSwgeyBvdXRwdXRMZW5ndGg6IGFsZ29yaXRobS5sZW5ndGggfSlcclxuICAgICAgICAgICAgLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhKSkuZGlnZXN0KCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGhhc2gpLmJ1ZmZlcjtcclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGFrZTEyOFByb3ZpZGVyIGV4dGVuZHMgY29yZS5TaGFrZTEyOFByb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBTaGFrZUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBTaGFrZTI1NlByb3ZpZGVyIGV4dGVuZHMgY29yZS5TaGFrZTI1NlByb3ZpZGVyIHtcclxuICAgIGFzeW5jIG9uRGlnZXN0KGFsZ29yaXRobSwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiBTaGFrZUNyeXB0by5kaWdlc3QoYWxnb3JpdGhtLCBkYXRhKTtcclxuICAgIH1cclxufVxuXG5jbGFzcyBTdWJ0bGVDcnlwdG8gZXh0ZW5kcyBjb3JlLlN1YnRsZUNyeXB0byB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEFlc0NiY1Byb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgQWVzQ3RyUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBBZXNHY21Qcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEFlc0NtYWNQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IEFlc0t3UHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBBZXNFY2JQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IERlc0NiY1Byb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgRGVzRWRlM0NiY1Byb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgUnNhU3NhUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBSc2FQc3NQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFJzYU9hZXBQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFJzYUVzUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBFY2RzYVByb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgRWNkaFByb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hhMVByb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hhMjU2UHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBTaGEzODRQcm92aWRlcigpKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYTUxMlByb3ZpZGVyKCkpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgUGJrZGYyUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBIbWFjUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBIa2RmUHJvdmlkZXIoKSk7XHJcbiAgICAgICAgY29uc3Qgbm9kZU1ham9yVmVyc2lvbiA9IChfYSA9IC9edihcXGQrKS8uZXhlYyhwcm9jZXNzLnZlcnNpb24pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbMV07XHJcbiAgICAgICAgaWYgKG5vZGVNYWpvclZlcnNpb24gJiYgcGFyc2VJbnQobm9kZU1ham9yVmVyc2lvbiwgMTApID49IDEyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hha2UxMjhQcm92aWRlcigpKTtcclxuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBTaGFrZTI1NlByb3ZpZGVyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBoYXNoZXMgPSBjcnlwdG8uZ2V0SGFzaGVzKCk7XHJcbiAgICAgICAgaWYgKGhhc2hlcy5pbmNsdWRlcyhcInNoYTMtMjU2XCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgU2hhMzI1NlByb3ZpZGVyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaGFzaGVzLmluY2x1ZGVzKFwic2hhMy0zODRcIikpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBTaGEzMzg0UHJvdmlkZXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoYXNoZXMuaW5jbHVkZXMoXCJzaGEzLTUxMlwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQobmV3IFNoYTM1MTJQcm92aWRlcigpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vZGVNYWpvclZlcnNpb24gJiYgcGFyc2VJbnQobm9kZU1ham9yVmVyc2lvbiwgMTApID49IDE0KSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuZXcgRWREc2FQcm92aWRlcigpKTtcclxuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5ldyBFY2RoRXNQcm92aWRlcigpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuY2xhc3MgQ3J5cHRvIGV4dGVuZHMgY29yZS5DcnlwdG8ge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnN1YnRsZSA9IG5ldyBTdWJ0bGVDcnlwdG8oKTtcclxuICAgIH1cclxuICAgIGdldFJhbmRvbVZhbHVlcyhhcnJheSkge1xyXG4gICAgICAgIGlmICghQXJyYXlCdWZmZXIuaXNWaWV3KGFycmF5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ2dldFJhbmRvbVZhbHVlcycgb24gJ0NyeXB0byc6IHBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdBcnJheUJ1ZmZlclZpZXcnXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhcnJheS5idWZmZXIsIGFycmF5LmJ5dGVPZmZzZXQsIGFycmF5LmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIGNyeXB0b19fZGVmYXVsdC5yYW5kb21GaWxsU3luYyhidWZmZXIpO1xyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBDcnlwdG8gfTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tICcuLi90eXBlcy9nbG9iYWwubWpzJztcblxuZXhwb3J0IHtyYW5kb219XG5cbi8qKlxuICogdGhpcyBmdW5jdGlvbiB1c2VzIGNyeXB0IGFuZCByZXR1cm5zIGEgcmFuZG9tIG51bWJlci5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBkZWZpbml0aW9uIHNldCAoZGVmYXVsdCBpcyAwKVxuICogQHBhcmFtIHtudW1iZXJ9IG1heCBlbmQgdmFsdWUgb2YgdGhlIGRlZmluaXRpb24gc2V0IChkZWZhdWx0IGlzIDEwMDAwMDAwMDApXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuTWF0aFxuICogQHRocm93cyB7RXJyb3J9IG1pc3NpbmcgY3J5cHRcbiAqIEB0aHJvd3Mge0Vycm9yfSB3ZSBjYW5ub3QgZ2VuZXJhdGUgbnVtYmVycyBsYXJnZXIgdGhhbiA1MyBiaXRzLlxuICogQHRocm93cyB7RXJyb3J9IHRoZSBkaXN0YW5jZSBpcyB0b28gc21hbGwgdG8gY3JlYXRlIGEgcmFuZG9tIG51bWJlci5cblxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKi9cbiBmdW5jdGlvbiByYW5kb20obWluLCBtYXgpIHtcblxuICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtaW4gPSAwO1xuICAgIH1cbiAgICBpZiAobWF4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWF4ID0gTUFYO1xuICAgIH1cblxuICAgIGlmIChtYXggPCBtaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWF4IG11c3QgYmUgZ3JlYXRlciB0aGFuIG1pblwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZChjcmVhdGUobWluLCBtYXgpKTtcblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG52YXIgTUFYID0gMTAwMDAwMDAwMDtcblxuTWF0aC5sb2cyID0gTWF0aC5sb2cyIHx8IGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWluXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQHByaXZhdGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBtaXNzaW5nIGNyeXB0XG4gKiBAdGhyb3dzIHtFcnJvcn0gd2UgY2Fubm90IGdlbmVyYXRlIG51bWJlcnMgbGFyZ2VyIHRoYW4gNTMgYml0cy5cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgZGlzdGFuY2UgaXMgdG9vIHNtYWxsIHRvIGNyZWF0ZSBhIHJhbmRvbSBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShtaW4sIG1heCkge1xuICAgIGxldCBjcnlwdDtcbiAgICBsZXQgZ2xvYmFsUmVmZXJlbmNlID0gZ2V0R2xvYmFsKCk7XG5cbiAgICBjcnlwdCA9IGdsb2JhbFJlZmVyZW5jZT8uWydjcnlwdG8nXSB8fCBnbG9iYWxSZWZlcmVuY2U/LlsnbXNDcnlwdG8nXSB8fCBnbG9iYWxSZWZlcmVuY2U/LlsnY3J5cHRvJ10gfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBjcnlwdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIGNyeXB0XCIpXG4gICAgfVxuXG4gICAgbGV0IHJ2YWwgPSAwO1xuICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluO1xuICAgIGlmIChyYW5nZSA8IDIpIHtcbiAgICAgICAgdGhyb3cgIG5ldyBFcnJvcigndGhlIGRpc3RhbmNlIGlzIHRvbyBzbWFsbCB0byBjcmVhdGUgYSByYW5kb20gbnVtYmVyLicpXG4gICAgfVxuXG4gICAgY29uc3QgYml0c05lZWRlZCA9IE1hdGguY2VpbChNYXRoLmxvZzIocmFuZ2UpKTtcbiAgICBpZiAoYml0c05lZWRlZCA+IDUzKSB7XG4gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJ3ZSBjYW5ub3QgZ2VuZXJhdGUgbnVtYmVycyBsYXJnZXIgdGhhbiA1MyBiaXRzLlwiKTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXNOZWVkZWQgPSBNYXRoLmNlaWwoYml0c05lZWRlZCAvIDgpO1xuICAgIGNvbnN0IG1hc2sgPSBNYXRoLnBvdygyLCBiaXRzTmVlZGVkKSAtIDE7XG5cbiAgICBjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShieXRlc05lZWRlZCk7XG4gICAgY3J5cHQuZ2V0UmFuZG9tVmFsdWVzKGJ5dGVBcnJheSk7XG5cbiAgICBsZXQgcCA9IChieXRlc05lZWRlZCAtIDEpICogODtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzTmVlZGVkOyBpKyspIHtcbiAgICAgICAgcnZhbCArPSBieXRlQXJyYXlbaV0gKiBNYXRoLnBvdygyLCBwKTtcbiAgICAgICAgcCAtPSA4O1xuICAgIH1cblxuICAgIHJ2YWwgPSBydmFsICYgbWFzaztcblxuICAgIGlmIChydmFsID49IHJhbmdlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGUobWluLCBtYXgpO1xuICAgIH1cblxuICAgIGlmIChydmFsIDwgbWluKSB7XG4gICAgICAgIHJ2YWwgKz0gbWluO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcnZhbDtcblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtyYW5kb219IGZyb20gXCIuLi9tYXRoL3JhbmRvbS5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tIFwiLi9nbG9iYWwubWpzXCI7XG5pbXBvcnQge0lEfSBmcm9tIFwiLi9pZC5tanNcIjtcblxuZXhwb3J0IHtSYW5kb21JRH1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge251bWJlcn1cbiAqL1xubGV0IGludGVybmFsQ291bnRlciA9IDA7XG5cbi8qKlxuICogVGhlIGBSYW5kb21JRGAgY2xhc3MgcHJvdmlkZXMgYSB1bmlxdWUgSUQgZm9yIGFuIGl0ZW0uXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHN1bW1hcnkgY2xhc3MgdG8gZ2VuZXJhdGUgcmFuZG9tIG51bWJlcnNcbiAqL1xuY2xhc3MgUmFuZG9tSUQgZXh0ZW5kcyBJRCB7XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGUgbmV3IG9iamVjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGludGVybmFsQ291bnRlciArPSAxO1xuXG4gICAgICAgIHRoaXMuaWQgPSBnZXRHbG9iYWwoKS5idG9hKHJhbmRvbSgxLCAxMDAwMCkpXG4gICAgICAgICAgICAucmVwbGFjZSgvPS9nLCAnJylcbiAgICAgICAgICAgIC8qKiBObyBudW1iZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIElELCBiZWNhdXNlIG9mIHBvc3NpYmxlIHByb2JsZW1zIHdpdGggRE9NICovXG4gICAgICAgICAgICAucmVwbGFjZSgvXlswLTldKy8sICdYJykgKyBpbnRlcm5hbENvdW50ZXI7XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtyYW5kb219IGZyb20gXCIuLi9tYXRoL3JhbmRvbS5tanNcIjtcbmltcG9ydCB7aXNPYmplY3R9IGZyb20gJy4uL3R5cGVzL2lzLm1qcyc7XG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSBcIi4vZ2xvYmFsLm1qc1wiO1xuXG5leHBvcnQge1VVSUR9XG5cbi8qKlxuICogVGhlIFVVSUQgY2xhc3MgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2V0IGEgdW5pcXVlIFVVSUQgZm9yIGFuIG9iamVjdC5cbiAqIFxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZFxuICovXG4gY2xhc3MgVVVJRCBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBsZXQgdXVpZCA9IGNyZWF0ZVdpdGhDcnlwdG8oKTtcblxuICAgICAgICBpZiAodXVpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1dWlkID0gY3JlYXRlV2l0aFJhbmRvbSgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAodXVpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdID0ge1xuICAgICAgICAgICAgdmFsdWU6IHV1aWRcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXVsndmFsdWUnXTtcbiAgICB9XG5cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBjcmVhdGVXaXRoUmFuZG9tKCkge1xuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHZhciByID0gcmFuZG9tKDAsIDY1MDAwKSAqIDE2IHwgMCxcbiAgICAgICAgICAgIHYgPSAoKGMgPT09ICd4JykgPyByIDogKHIgJiAweDMgfCAweDgpKTtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpWzBdO1xuICAgIH0pXG59XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV2l0aENyeXB0bygpIHtcbiAgICBjb25zdCBjcnlwdCA9IGdldEdsb2JhbE9iamVjdCgnY3J5cHRvJyk7XG4gICAgaWYgKCFpc09iamVjdChjcnlwdCkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGNyeXB0Py5bJ3JhbmRvbVVVSUQnXSkgcmV0dXJuO1xuICAgIHJldHVybiBjcnlwdC5yYW5kb21VVUlEKCk7XG59XG5cbiIsICJpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHtcblxuICAgIChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IHNheXN3aG8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudCwgdGVtLFxuICAgICAgICAgICAgICAgIE0gPSB1YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cXC8pKVxcLz9cXHMqKFxcZCspL2kpIHx8IFtdO1xuICAgICAgICAgICAgaWYgKC90cmlkZW50L2kudGVzdChNWzFdKSkge1xuICAgICAgICAgICAgICAgIHRlbSA9IC9cXGJydlsgOl0rKFxcZCspL2cuZXhlYyh1YSkgfHwgW107XG4gICAgICAgICAgICAgICAgcmV0dXJuICdJRSAnICsgKHRlbVsxXSB8fCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTVsxXSA9PT0gJ0Nocm9tZScpIHtcbiAgICAgICAgICAgICAgICB0ZW0gPSB1YS5tYXRjaCgvXFxiKE9QUnxFZGdlKVxcLyhcXGQrKS8pO1xuICAgICAgICAgICAgICAgIGlmICh0ZW0gIT0gbnVsbCkgcmV0dXJuIHRlbS5zbGljZSgxKS5qb2luKCcgJykucmVwbGFjZSgnT1BSJywgJ09wZXJhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBNID0gTVsyXSA/IFtNWzFdLCBNWzJdXSA6IFtuYXZpZ2F0b3IuYXBwTmFtZSwgbmF2aWdhdG9yLmFwcFZlcnNpb24sICctPyddO1xuICAgICAgICAgICAgaWYgKCh0ZW0gPSB1YS5tYXRjaCgvdmVyc2lvblxcLyhcXGQrKS9pKSkgIT0gbnVsbCkgTS5zcGxpY2UoMSwgMSwgdGVtWzFdKTtcbiAgICAgICAgICAgIHJldHVybiBNLmpvaW4oJyAnKTtcbiAgICAgICAgfSkoKTtcblxuXG4gICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDEnKVxuICAgICAgICBlbGVtZW50LmlubmVySFRNTCArPSBcIiBcIiArIHNheXN3aG87XG5cbiAgICB9KSgpO1xuXG5cbn1cbiIsICJpbXBvcnQgY2hhaSBmcm9tICcuL2luZGV4LmpzJztcblxuZXhwb3J0IGNvbnN0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBjaGFpLnZlcnNpb247XG5leHBvcnQgY29uc3QgQXNzZXJ0aW9uID0gY2hhaS5Bc3NlcnRpb247XG5leHBvcnQgY29uc3QgQXNzZXJ0aW9uRXJyb3IgPSBjaGFpLkFzc2VydGlvbkVycm9yO1xuZXhwb3J0IGNvbnN0IHV0aWwgPSBjaGFpLnV0aWw7XG5leHBvcnQgY29uc3QgY29uZmlnID0gY2hhaS5jb25maWc7XG5leHBvcnQgY29uc3QgdXNlID0gY2hhaS51c2U7XG5leHBvcnQgY29uc3Qgc2hvdWxkID0gY2hhaS5zaG91bGQ7XG5leHBvcnQgY29uc3QgYXNzZXJ0ID0gY2hhaS5hc3NlcnQ7XG5leHBvcnQgY29uc3QgY29yZSA9IGNoYWkuY29yZTtcblxuZXhwb3J0IGRlZmF1bHQgY2hhaTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi9iYXNlLm1qcyc7XG5cbmV4cG9ydCB7VmVyc2lvbiwgZ2V0TW9uc3RlclZlcnNpb259XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2JqZWN0IGNvbnRhaW5zIGEgc2VtYW50aWMgdmVyc2lvbiBudW1iZXJcbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvdmVyc2lvbi0xLm1qc1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBhdXRob3Igc2NodWthaSBHbWJIXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzdW1tYXJ5IFRoZSB2ZXJzaW9uIG9iamVjdCBjb250YWlucyBhIHNlbWF0aWMgdmVyc2lvbiBudW1iZXJcbiAqL1xuY2xhc3MgVmVyc2lvbiBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFqb3JcbiAgICAgKiBAcGFyYW0gbWlub3JcbiAgICAgKiBAcGFyYW0gcGF0Y2hcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gbWFqb3IgaXMgbm90IGEgbnVtYmVyXG4gICAgICogQHRocm93cyB7RXJyb3J9IG1pbm9yIGlzIG5vdCBhIG51bWJlclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBwYXRjaCBpcyBub3QgYSBudW1iZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYWpvciwgbWlub3IsIHBhdGNoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtYWpvciA9PT0gJ3N0cmluZycgJiYgbWlub3IgPT09IHVuZGVmaW5lZCAmJiBwYXRjaCA9PT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IG1ham9yLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIG1ham9yID0gcGFyc2VJbnQocGFydHNbMF0gfHwgMCk7XG4gICAgICAgICAgICBtaW5vciA9IHBhcnNlSW50KHBhcnRzWzFdIHx8IDApO1xuICAgICAgICAgICAgcGF0Y2ggPSBwYXJzZUludChwYXJ0c1syXSB8fCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYWpvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwibWFqb3IgdmVyc2lvbiBpcyB1bmRlZmluZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWlub3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWlub3IgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhdGNoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFqb3IgPSBwYXJzZUludChtYWpvcik7XG4gICAgICAgIHRoaXMubWlub3IgPSBwYXJzZUludChtaW5vcik7XG4gICAgICAgIHRoaXMucGF0Y2ggPSBwYXJzZUludChwYXRjaCk7XG5cbiAgICAgICAgaWYgKGlzTmFOKHRoaXMubWFqb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwibWFqb3IgaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmFOKHRoaXMubWlub3IpKSB7XG4gICAgICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwibWlub3IgaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmFOKHRoaXMucGF0Y2gpKSB7XG4gICAgICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwicGF0Y2ggaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ham9yICsgJy4nICsgdGhpcy5taW5vciArICcuJyArIHRoaXMucGF0Y2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJucyAwIGlmIGVxdWFsLCAtMSBpZiB0aGUgb2JqZWN0IHZlcnNpb24gaXMgbGVzcyBhbmQgMSBpZiBncmVhdGVyXG4gICAgICogdGhhbiB0aGUgY29tcGFyZWQgdmVyc2lvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VmVyc2lvbn0gdmVyc2lvbiBWZXJzaW9uIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGNvbXBhcmVUbyh2ZXJzaW9uKSB7XG5cbiAgICAgICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBWZXJzaW9uKSB7XG4gICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgIG5ldyBFcnJvcihcInR5cGUgZXhjZXB0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcnNpb24gPT09IHRoaXMudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYSA9IFt0aGlzLm1ham9yLCB0aGlzLm1pbm9yLCB0aGlzLnBhdGNoXTtcbiAgICAgICAgbGV0IGIgPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGxldCBsZW4gPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmICgoYVtpXSAmJiAhYltpXSAmJiBwYXJzZUludChhW2ldKSA+IDApIHx8IChwYXJzZUludChhW2ldKSA+IHBhcnNlSW50KGJbaV0pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoYltpXSAmJiAhYVtpXSAmJiBwYXJzZUludChiW2ldKSA+IDApIHx8IChwYXJzZUludChhW2ldKSA8IHBhcnNlSW50KGJbaV0pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbn1cblxubGV0IG1vbnN0ZXJWZXJzaW9uO1xuXG4vKipcbiAqIFZlcnNpb24gb2YgbW9uc3RlclxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy92ZXJzaW9uLTIubWpzXG4gKiBAcmV0dXJucyB7TW9uc3Rlci5UeXBlcy5WZXJzaW9ufVxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAYXV0aG9yIHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0TW9uc3RlclZlcnNpb24oKSB7XG4gICAgaWYgKG1vbnN0ZXJWZXJzaW9uIGluc3RhbmNlb2YgVmVyc2lvbikge1xuICAgICAgICByZXR1cm4gbW9uc3RlclZlcnNpb247XG4gICAgfVxuICAgIFxuICAgIC8qKiBkb24ndCB0b3VjaCwgcmVwbGFjZWQgYnkgbWFrZSB3aXRoIHBhY2thZ2UuanNvbiB2ZXJzaW9uICovXG4gICAgbW9uc3RlclZlcnNpb24gPSBuZXcgVmVyc2lvbignMi4wLjcnKVxuXG4gICAgcmV0dXJuIG1vbnN0ZXJWZXJzaW9uO1xuXG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7VmVyc2lvbiwgZ2V0TW9uc3RlclZlcnNpb259IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdmVyc2lvbi5tanNcIjtcblxuZGVzY3JpYmUoJ01vbnN0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmdldE1vbnN0ZXJWZXJzaW9uKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBtb25zdGVyVmVyc2lvblxuXG4gICAgICAgIC8qKiBkb25cdTAwQjR0IHRvdWNoLCByZXBsYWNlZCBieSBtYWtlIHdpdGggcGFja2FnZS5qc29uIHZlcnNpb24gKi9cbiAgICAgICAgbW9uc3RlclZlcnNpb24gPSBuZXcgVmVyc2lvbignMi4wLjcnKVxuXG4gICAgICAgIGxldCBtID0gZ2V0TW9uc3RlclZlcnNpb24oKTtcblxuICAgICAgICBpdCgnc2hvdWxkICcgKyBtb25zdGVyVmVyc2lvbiArICcgaXMgJyArIG0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChtLmNvbXBhcmVUbyhtb25zdGVyVmVyc2lvbikpLmlzLmVxdWFsKDApO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG59KTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSAnLi4vdHlwZXMvYmFzZS5tanMnO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZUludGVnZXJ9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7TG9nRW50cnl9IGZyb20gXCIuL2xvZ2VudHJ5Lm1qc1wiO1xuaW1wb3J0IHtBTEwsIERFQlVHLCBFUlJPUiwgRkFUQUwsIElORk8sIE9GRiwgVFJBQ0UsIFdBUk59IGZyb20gXCIuL2xvZ2dlci5tanNcIjtcblxuZXhwb3J0IHtIYW5kbGVyfVxuXG4vKipcbiAqIFRoZSBsb2cgaGFuZGxlciBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGxvZyBlbnRyaWVzIGFuZCB0aGUgbG9nIGxpc3RlbmVycy5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuIGNsYXNzIEhhbmRsZXIgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9nbGV2ZWxcbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxvZ2xldmVsID0gT0ZGO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgbG9nIGZ1bmN0aW9uLiB0aGlzIG1ldGhvZCBtdXN0IGJlXG4gICAgICogb3ZlcndyaXR0ZW4gYnkgZGVyaXZlZCBoYW5kbGVycyB3aXRoIHRoZWlyIG93biBsb2dpYy5cbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xvZ0VudHJ5fSBlbnRyeVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGxvZyhlbnRyeSkge1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKGVudHJ5LCBMb2dFbnRyeSk7XG5cbiAgICAgICAgaWYgKHRoaXMubG9nbGV2ZWwgPCBlbnRyeS5nZXRMb2dMZXZlbCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZXQgbG9nbGV2ZWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbG9nbGV2ZWxcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBzZXRMb2dMZXZlbChsb2dsZXZlbCkge1xuICAgICAgICB2YWxpZGF0ZUludGVnZXIobG9nbGV2ZWwpXG4gICAgICAgIHRoaXMubG9nbGV2ZWwgPSBsb2dsZXZlbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IGxvZ2xldmVsXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7aW50ZWdlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBnZXRMb2dMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nbGV2ZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFNldCBsb2cgbGV2ZWwgdG8gQWxsXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SGFuZGxlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBzZXRBbGwoKSB7XG4gICAgICAgIHRoaXMuc2V0TG9nTGV2ZWwoQUxMKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBsb2cgbGV2ZWwgdG8gVHJhY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIYW5kbGVyfVxuICAgICAqIEBzaW5jZSAxLjUuMFxuICAgICAqL1xuICAgIHNldFRyYWNlKCkge1xuICAgICAgICB0aGlzLnNldExvZ0xldmVsKFRSQUNFKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBsb2cgbGV2ZWwgdG8gRGVidWdcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIYW5kbGVyfVxuICAgICAqIEBzaW5jZSAxLjUuMFxuICAgICAqL1xuICAgIHNldERlYnVnKCkge1xuICAgICAgICB0aGlzLnNldExvZ0xldmVsKERFQlVHKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBsb2cgbGV2ZWwgdG8gSW5mb1xuICAgICAqXG4gICAgICogQHJldHVybnMge0hhbmRsZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgc2V0SW5mbygpIHtcbiAgICAgICAgdGhpcy5zZXRMb2dMZXZlbChJTkZPKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBsb2cgbGV2ZWwgdG8gV2FyblxuICAgICAqXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBzZXRXYXJuKCkge1xuICAgICAgICB0aGlzLnNldExvZ0xldmVsKFdBUk4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IGxvZyBsZXZlbCB0byBFcnJvclxuICAgICAqXG4gICAgICogQHJldHVybnMge0hhbmRsZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgc2V0RXJyb3IoKSB7XG4gICAgICAgIHRoaXMuc2V0TG9nTGV2ZWwoRVJST1IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IGxvZyBsZXZlbCB0byBGYXRhbFxuICAgICAqXG4gICAgICogQHJldHVybnMge0hhbmRsZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgc2V0RmF0YWwoKSB7XG4gICAgICAgIHRoaXMuc2V0TG9nTGV2ZWwoRkFUQUwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5cbiAgICAvKipcbiAgICAgKiBTZXQgbG9nIGxldmVsIHRvIE9mZlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hhbmRsZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgc2V0T2ZmKCkge1xuICAgICAgICB0aGlzLnNldExvZ0xldmVsKE9GRik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge3ZhbGlkYXRlSW50ZWdlcn0gZnJvbSAnLi4vdHlwZXMvdmFsaWRhdGUubWpzJztcblxuZXhwb3J0IHtMb2dFbnRyeX1cblxuLyoqXG4gKiBBIGxvZyBlbnRyeSBmb3IgdGhlIGxvZ2dlclxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuTG9nZ2luZ1xuICovXG4gY2xhc3MgTG9nRW50cnkgZXh0ZW5kcyBCYXNlIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gbG9nbGV2ZWxcbiAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3NcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb2dsZXZlbCwgLi4uYXJncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB2YWxpZGF0ZUludGVnZXIobG9nbGV2ZWwpO1xuXG4gICAgICAgIHRoaXMubG9nbGV2ZWwgPSBsb2dsZXZlbFxuICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3NcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtpbnRlZ2Vycn1cbiAgICAgKi9cbiAgICBnZXRMb2dMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nbGV2ZWxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHthcnJheX1cbiAgICAgKi9cbiAgICBnZXRBcmd1bWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3VtZW50c1xuICAgIH1cblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtIYW5kbGVyfSBmcm9tICcuLi9sb2dnaW5nL2hhbmRsZXIubWpzJztcbmltcG9ydCB7TG9nRW50cnl9IGZyb20gJy4uL2xvZ2dpbmcvbG9nZW50cnkubWpzJztcblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuLi90eXBlcy9iYXNlLm1qcyc7XG5pbXBvcnQge3ZhbGlkYXRlSW50ZWdlciwgdmFsaWRhdGVPYmplY3QsIHZhbGlkYXRlU3RyaW5nfSBmcm9tICcuLi90eXBlcy92YWxpZGF0ZS5tanMnO1xuXG5leHBvcnQge0xvZ2dlciwgQUxMLCBUUkFDRSwgREVCVUcsIElORk8sIFdBUk4sIEVSUk9SLCBGQVRBTCwgT0ZGfTtcblxuLyoqXG4gKiBBTEwgPiBUUkFDRSA+IERFQlVHID4gSU5GTyA+IFdBUk4gPiBFUlJPUiA+IEZBVEFMID4gT0ZGXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuTG9nZ2luZ1xuICovXG5jb25zdCBBTEwgPSAyNTU7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Mb2dnaW5nXG4gKi9cbmNvbnN0IFRSQUNFID0gNjQ7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Mb2dnaW5nXG4gKi9cbmNvbnN0IERFQlVHID0gMzI7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Mb2dnaW5nXG4gKi9cbmNvbnN0IElORk8gPSAxNjtcbi8qKlxuICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRlxuICogQHR5cGUge251bWJlcn1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuY29uc3QgV0FSTiA9IDg7XG4vKipcbiAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Mb2dnaW5nXG4gKi9cbmNvbnN0IEVSUk9SID0gNDtcbi8qKlxuICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRlxuICogQHR5cGUge251bWJlcn1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuY29uc3QgRkFUQUwgPSAyO1xuLyoqXG4gKiBBTEwgPiBUUkFDRSA+IERFQlVHID4gSU5GTyA+IFdBUk4gPiBFUlJPUiA+IEZBVEFMID4gT0ZGXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuTG9nZ2luZ1xuICovXG5jb25zdCBPRkYgPSAwO1xuXG4vKipcbiAqIFRoZSBsb2dnZXIgaXMgYSBjbGFzcyB0aGF0IHRha2VzIGNhcmUgb2YgbG9nZ2luZy5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkxvZ2dpbmdcbiAqL1xuY2xhc3MgTG9nZ2VyIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhhbmRsZXIgPSBuZXcgU2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIYW5kbGVyfSBoYW5kbGVyXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXG4gICAgICovXG4gICAgYWRkSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KGhhbmRsZXIpXG4gICAgICAgIGlmICghKGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXCIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZXIuYWRkKGhhbmRsZXIpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIYW5kbGVyfSBoYW5kbGVyXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXG4gICAgICovXG4gICAgcmVtb3ZlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KGhhbmRsZXIpXG4gICAgICAgIGlmICghKGhhbmRsZXIgaW5zdGFuY2VvZiBIYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIYW5kbGVyXCIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZXIuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBsb2cgVHJhY2UgbWVzc2FnZVxuICAgICAqXG4gICAgICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBsb2dUcmFjZSgpIHtcbiAgICAgICAgdHJpZ2dlckxvZy5hcHBseSh0aGlzLCBbVFJBQ0UsIC4uLmFyZ3VtZW50c10pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogbG9nIERlYnVnIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFyZ3VtZW50c1xuICAgICAqIEByZXR1cm5zIHtMb2dnZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgbG9nRGVidWcoKSB7XG4gICAgICAgIHRyaWdnZXJMb2cuYXBwbHkodGhpcywgW0RFQlVHLCAuLi5hcmd1bWVudHNdKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGxvZyBJbmZvIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBsb2dJbmZvKCkge1xuICAgICAgICB0cmlnZ2VyTG9nLmFwcGx5KHRoaXMsIFtJTkZPLCAuLi5hcmd1bWVudHNdKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGxvZyBXYXJuIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFyZ3VtZW50c1xuICAgICAqIEByZXR1cm5zIHtMb2dnZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgbG9nV2FybigpIHtcbiAgICAgICAgdHJpZ2dlckxvZy5hcHBseSh0aGlzLCBbV0FSTiwgLi4uYXJndW1lbnRzXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBsb2cgRXJyb3IgbWVzc2FnZVxuICAgICAqXG4gICAgICogQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYXJndW1lbnRzXG4gICAgICogQHJldHVybnMge0xvZ2dlcn1cbiAgICAgKiBAc2luY2UgMS41LjBcbiAgICAgKi9cbiAgICBsb2dFcnJvcigpIHtcbiAgICAgICAgdHJpZ2dlckxvZy5hcHBseSh0aGlzLCBbRVJST1IsIC4uLmFyZ3VtZW50c10pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogbG9nIEZhdGFsIG1lc3NhZ2VcbiAgICAgKlxuICAgICAqIEFMTCA+IFRSQUNFID4gREVCVUcgPiBJTkZPID4gV0FSTiA+IEVSUk9SID4gRkFUQUwgPiBPRkYgIChBTEwgPSAweGZmO09GRiA9IDB4MDA7XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFyZ3VtZW50c1xuICAgICAqIEByZXR1cm5zIHtMb2dnZXJ9XG4gICAgICogQHNpbmNlIDEuNS4wXG4gICAgICovXG4gICAgbG9nRmF0YWwoKSB7XG4gICAgICAgIHRyaWdnZXJMb2cuYXBwbHkodGhpcywgW0ZBVEFMLCAuLi5hcmd1bWVudHNdKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuXG4gICAgLyoqXG4gICAgICogTGFiZWxzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGxldmVsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRMYWJlbChsZXZlbCkge1xuICAgICAgICB2YWxpZGF0ZUludGVnZXIobGV2ZWwpO1xuXG4gICAgICAgIGlmIChsZXZlbCA9PT0gQUxMKSByZXR1cm4gJ0FMTCc7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gVFJBQ0UpIHJldHVybiAnVFJBQ0UnO1xuICAgICAgICBpZiAobGV2ZWwgPT09IERFQlVHKSByZXR1cm4gJ0RFQlVHJztcbiAgICAgICAgaWYgKGxldmVsID09PSBJTkZPKSByZXR1cm4gJ0lORk8nO1xuICAgICAgICBpZiAobGV2ZWwgPT09IFdBUk4pIHJldHVybiAnV0FSTic7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gRVJST1IpIHJldHVybiAnRVJST1InO1xuICAgICAgICBpZiAobGV2ZWwgPT09IEZBVEFMKSByZXR1cm4gJ0ZBVEFMJztcbiAgICAgICAgaWYgKGxldmVsID09PSBPRkYpIHJldHVybiAnT0ZGJztcblxuICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMZXZlbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gICAgICogQHJldHVybnMge2ludGVnZXJ9XG4gICAgICovXG4gICAgZ2V0TGV2ZWwobGFiZWwpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcobGFiZWwpO1xuXG4gICAgICAgIGlmIChsYWJlbCA9PT0gJ0FMTCcpIHJldHVybiBBTEw7XG4gICAgICAgIGlmIChsYWJlbCA9PT0gJ1RSQUNFJykgcmV0dXJuIFRSQUNFO1xuICAgICAgICBpZiAobGFiZWwgPT09ICdERUJVRycpIHJldHVybiBERUJVRztcbiAgICAgICAgaWYgKGxhYmVsID09PSAnSU5GTycpIHJldHVybiBJTkZPO1xuICAgICAgICBpZiAobGFiZWwgPT09ICdXQVJOJykgcmV0dXJuIFdBUk47XG4gICAgICAgIGlmIChsYWJlbCA9PT0gJ0VSUk9SJykgcmV0dXJuIEVSUk9SO1xuICAgICAgICBpZiAobGFiZWwgPT09ICdGQVRBTCcpIHJldHVybiBGQVRBTDtcbiAgICAgICAgaWYgKGxhYmVsID09PSAnT0ZGJykgcmV0dXJuIE9GRjtcblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuXG5cbn1cblxuXG4vKipcbiAqIExvZyB0cmlnZ2VyblxuICpcbiAqIEBwYXJhbSB7aW50ZWdlcn0gbG9nbGV2ZWxcbiAqIEBwYXJhbSB7Kn0gYXJnc1xuICogQHJldHVybnMge0xvZ2dlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRyaWdnZXJMb2cobG9nbGV2ZWwsIC4uLmFyZ3MpIHtcbiAgICB2YXIgbG9nZ2VyID0gdGhpcztcblxuICAgIGZvciAobGV0IGhhbmRsZXIgb2YgbG9nZ2VyLmhhbmRsZXIpIHtcbiAgICAgICAgaGFuZGxlci5sb2cobmV3IExvZ0VudHJ5KGxvZ2xldmVsLCBhcmdzKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nZ2VyO1xuXG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7TG9nZ2VyLCBPRkYsIEFMTCwgVFJBQ0UsIERFQlVHLCBJTkZPLCBXQVJOLCBFUlJPUiwgRkFUQUx9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvbG9nZ2luZy9sb2dnZXIubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0xvZ2dpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IExvZ2dlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0xvZ2dlci5sb2dUcmFjZSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZ2dlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nZ2VyKCkubG9nVHJhY2UoXCJ0ZXN0XCIpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGRlc2NyaWJlKCdMb2dnZXIubG9nRGVidWcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ0RlYnVnKFwidGVzdFwiKSkudG8uaW5zdGFuY2VPZihMb2dnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBkZXNjcmliZSgnTG9nZ2VyLmxvZ0luZm8oKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ0luZm8oXCJ0ZXN0XCIpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGRlc2NyaWJlKCdMb2dnZXIubG9nV2FybigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZ2dlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nZ2VyKCkubG9nV2FybihcInRlc3RcIikpLnRvLmluc3RhbmNlT2YoTG9nZ2VyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgXG4gICAgZGVzY3JpYmUoJ0xvZ2dlci5sb2dFcnJvcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZ2dlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nZ2VyKCkubG9nRXJyb3IoXCJ0ZXN0XCIpKS50by5pbnN0YW5jZU9mKExvZ2dlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGRlc2NyaWJlKCdMb2dnZXIubG9nRmF0YWwoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBMb2dnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmxvZ0ZhdGFsKFwidGVzdFwiKSkudG8uaW5zdGFuY2VPZihMb2dnZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBkZXNjcmliZSgnTG9nZ2VyLmdldExldmVsKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnQUxMJywgQUxMXSxcbiAgICAgICAgICAgIFsnVFJBQ0UnLCBUUkFDRV0sXG4gICAgICAgICAgICBbJ0RFQlVHJywgREVCVUddLFxuICAgICAgICAgICAgWydJTkZPJywgSU5GT10sXG4gICAgICAgICAgICBbJ1dBUk4nLCBXQVJOXSxcbiAgICAgICAgICAgIFsnRVJST1InLCBFUlJPUl0sXG4gICAgICAgICAgICBbJ0ZBVEFMJywgRkFUQUxdLFxuICAgICAgICAgICAgWydPRkYnLCBPRkZdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KGEgKyAnIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IExvZ2dlcigpLmdldExldmVsKGEpKS50by5iZS5lcXVhbHMoYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0xvZ2dlci5nZXRMYWJlbCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBbXG4gICAgICAgICAgICBbJ0FMTCcsIEFMTF0sXG4gICAgICAgICAgICBbJ1RSQUNFJywgVFJBQ0VdLFxuICAgICAgICAgICAgWydERUJVRycsIERFQlVHXSxcbiAgICAgICAgICAgIFsnSU5GTycsIElORk9dLFxuICAgICAgICAgICAgWydXQVJOJywgV0FSTl0sXG4gICAgICAgICAgICBbJ0VSUk9SJywgRVJST1JdLFxuICAgICAgICAgICAgWydGQVRBTCcsIEZBVEFMXSxcbiAgICAgICAgICAgIFsnT0ZGJywgT0ZGXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdChhICsgJyBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2dnZXIoKS5nZXRMYWJlbChiKSkudG8uYmUuZXF1YWxzKGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7IiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0xvZ0VudHJ5fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvbG9nZW50cnkubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0xvZycsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCduZXcgTG9nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIExvZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgTG9nRW50cnkoMSwgJ2EnLCAnYicsICdjJykpLnRvLmluc3RhbmNlT2YoTG9nRW50cnkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdMb2cubG9nbGV2ZWwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGxvZztcblxuICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxvZyA9IG5ldyBMb2dFbnRyeSgxLCBmYWxzZSwgJ3Rlc3QnLCA5OSwge2E6IHRydWV9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBsb2dsZXZlbCAxJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGxvZy5nZXRMb2dMZXZlbCgpKS50by5iZS5lcXVhbCgxKVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhcmd1bWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobG9nLmdldEFyZ3VtZW50cygpKS50by5oYXZlLmRlZXAubWVtYmVycyhbZmFsc2UsICd0ZXN0JywgOTksIHthOiB0cnVlfV0pXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSBcIi4uLy4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7SGFuZGxlcn0gZnJvbSAnLi4vaGFuZGxlci5tanMnO1xuaW1wb3J0IHtMb2dFbnRyeX0gZnJvbSBcIi4uL2xvZ2VudHJ5Lm1qc1wiO1xuaW1wb3J0IHtUUkFDRSwgV0FSTiwgREVCVUcsIEVSUk9SLCBGQVRBTCwgSU5GT30gZnJvbSBcIi4uL2xvZ2dlci5tanNcIjtcblxuZXhwb3J0IHtDb25zb2xlSGFuZGxlcn1cblxuLyoqXG4gKiBZb3UgY2FuIGNyZWF0ZSBhbiBvYmplY3Qgb2YgdGhlIGNsYXNzIHNpbXBseSBieSB1c2luZyB0aGUgbmFtZXNwYWNlIGBuZXcgTW9uc3Rlci5Mb2dnaW5nLkhhbmRsZXIuQ29uc29sZUhhbmRsZXIoKWAuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS41LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Mb2dnaW5nLkhhbmRsZXJcbiAqL1xuY2xhc3MgQ29uc29sZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBjZW50cmFsIGxvZyBmdW5jdGlvbi4gdGhpcyBtZXRob2QgbXVzdCBiZVxuICAgICAqIG92ZXJ3cml0dGVuIGJ5IGRlcml2ZWQgaGFuZGxlcnMgd2l0aCB0aGVpciBvd24gbG9naWMuXG4gICAgICpcbiAgICAgKiBBTEwgPiBUUkFDRSA+IERFQlVHID4gSU5GTyA+IFdBUk4gPiBFUlJPUiA+IEZBVEFMID4gT0ZGICAoQUxMID0gMHhmZjtPRkYgPSAweDAwO1xuICAgICAqXG4gICAgICogQHBhcmFtIHtMb2dFbnRyeX0gZW50cnlcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBsb2coZW50cnkpIHtcbiAgICAgICAgaWYgKHN1cGVyLmxvZyhlbnRyeSkpIHtcbiAgICAgICAgICAgIGxldCBjb25zb2xlID0gZ2V0R2xvYmFsT2JqZWN0KCdjb25zb2xlJyk7XG4gICAgICAgICAgICBpZiAoIWNvbnNvbGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKCFjb25zb2xlLmVycm9yKSBjb25zb2xlLmVycm9yID0gY29uc29sZS5sb2c7XG4gICAgICAgICAgICBpZiAoIWNvbnNvbGUud2FybikgY29uc29sZS53YXJuID0gY29uc29sZS5sb2c7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZW50cnkuZ2V0TG9nTGV2ZWwoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgVFJBQ0U6XG4gICAgICAgICAgICAgICAgY2FzZSBERUJVRzpcbiAgICAgICAgICAgICAgICBjYXNlIElORk86XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVudHJ5LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEZBVEFMOlxuICAgICAgICAgICAgICAgIGNhc2UgRVJST1I6XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZW50cnkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgV0FSTjpcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVudHJ5LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlbnRyeS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59XG5cblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiO1xuaW1wb3J0IHtDb25zb2xlSGFuZGxlcn0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9sb2dnaW5nL2hhbmRsZXIvY29uc29sZS5tanNcIjtcbmltcG9ydCB7TG9nRW50cnl9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvbG9nZ2luZy9sb2dlbnRyeS5tanNcIjtcbmltcG9ydCB7VFJBQ0UsIFdBUk4sIERFQlVHLCBFUlJPUiwgRkFUQUwsIElORk99IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvbG9nZ2luZy9sb2dnZXIubWpzXCI7XG5cbmRlc2NyaWJlKCdMb2dnaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ0NvbnNvbGVIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgY3JlYXRlIENvbnNvbGVIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb25zb2xlSGFuZGxlcigpKS50by5iZS5pbnN0YW5jZW9mKENvbnNvbGVIYW5kbGVyKVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGxvZyB0byBjb25zb2xlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb25zb2xlSGFuZGxlcigpLnNldEFsbCgpLmxvZyhuZXcgTG9nRW50cnkoRkFUQUwsIFsxLCB0cnVlLCAnZmF0YWwnXSkpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGxvZyB0byBjb25zb2xlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb25zb2xlSGFuZGxlcigpLnNldEFsbCgpLmxvZyhuZXcgTG9nRW50cnkoVFJBQ0UsIFsxLCB0cnVlLCAndHJhY2UnXSkpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGxvZyB0byBjb25zb2xlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb25zb2xlSGFuZGxlcigpLnNldEFsbCgpLmxvZyhuZXcgTG9nRW50cnkoV0FSTiwgWzEsIHRydWUsICd3YXJuJ10pKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBsb2cgdG8gY29uc29sZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29uc29sZUhhbmRsZXIoKS5zZXRBbGwoKS5sb2cobmV3IExvZ0VudHJ5KERFQlVHLCBbMSwgdHJ1ZSwgJ2RlYnVnJ10pKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBsb2cgdG8gY29uc29sZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29uc29sZUhhbmRsZXIoKS5zZXRBbGwoKS5sb2cobmV3IExvZ0VudHJ5KEVSUk9SLCBbMSwgdHJ1ZSwgJ2Vycm9yJ10pKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBsb2cgdG8gY29uc29sZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29uc29sZUhhbmRsZXIoKS5zZXRBbGwoKS5sb2cobmV3IExvZ0VudHJ5KElORk8sIFsxLCB0cnVlLCAnaW5mbyddKSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbn0pOyIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIjtcbmltcG9ydCB7QUxMLCBUUkFDRSwgREVCVUcsIElORk8sIFdBUk4sIEVSUk9SLCBGQVRBTCwgT0ZGfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvbG9nZ2VyLm1qc1wiO1xuaW1wb3J0IHtIYW5kbGVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2xvZ2dpbmcvaGFuZGxlci5tanNcIjtcbmltcG9ydCB7TG9nRW50cnl9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvbG9nZ2luZy9sb2dlbnRyeS5tanNcIjtcblxuZGVzY3JpYmUoJ0xvZ2dpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRMb2dMZXZlbCgpLmdldExvZ0xldmVsKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW0FMTF0sIFtUUkFDRV0sIFtERUJVR10sIFtJTkZPXSwgW1dBUk5dLCBbRVJST1JdLCBbRkFUQUxdLCBbT0ZGXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCd0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgc2V0IHZhbHVlICcgKyBhLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0TG9nTGV2ZWwoYSkuZ2V0TG9nTGV2ZWwoKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdIYW5kbGVyLmxvZygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5sb2cobmV3IExvZ0VudHJ5KDAsIFwidGVzdFwiKSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIubG9nKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGhhbmRsZXI7XG5cbiAgICAgICAgY2xhc3MgVGVzdEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHtcbiAgICAgICAgICAgIGxvZyhlbnRyeSkge1xuICAgICAgICAgICAgICAgIHN1cGVyLmxvZyhlbnRyeSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5sb2cobmV3IExvZ0VudHJ5KDAsIFwidGVzdFwiKSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcubG9nKCkgd2l0aCBsb2dsZXZlbCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgVGVzdEhhbmRsZXI7XG5cbiAgICAgICAgYmVmb3JlKCgpID0+IHtcbiAgICAgICAgICAgIFRlc3RIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBIYW5kbGVyIHtcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxscyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbG9nKGxvZ2xldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdXBlci5sb2cobG9nbGV2ZWwpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxzKytcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFsgLy8gQUxMID4gVFJBQ0UgPiBERUJVRyA+IElORk8gPiBXQVJOID4gRVJST1IgPiBGQVRBTCA+IE9GRiAgKEFMTCA9IDB4ZmY7T0ZGID0gMHgwMDtcbiAgICAgICAgICAgIFtBTEwsIDZdLFxuICAgICAgICAgICAgW1RSQUNFLCA2XSxcbiAgICAgICAgICAgIFtERUJVRywgNV0sXG4gICAgICAgICAgICBbSU5GTywgNF0sXG4gICAgICAgICAgICBbV0FSTiwgM10sXG4gICAgICAgICAgICBbRVJST1IsIDJdLFxuICAgICAgICAgICAgW0ZBVEFMLCAxXSxcbiAgICAgICAgICAgIFtPRkYsIDBdXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmxvZygnICsgYSArICcpIHNob3VsZCBsb2cgJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpLnNldExvZ0xldmVsKGEpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIubG9nKG5ldyBMb2dFbnRyeShUUkFDRSkpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIubG9nKG5ldyBMb2dFbnRyeShERUJVRykpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIubG9nKG5ldyBMb2dFbnRyeShJTkZPKSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5sb2cobmV3IExvZ0VudHJ5KFdBUk4pKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmxvZyhuZXcgTG9nRW50cnkoRVJST1IpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmxvZyhuZXcgTG9nRW50cnkoRkFUQUwpKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChoYW5kbGVyLmNhbGxzKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0TG9nTGV2ZWwoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0TG9nTGV2ZWwoQUxMKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnSGFuZGxlci5nZXRMb2dMZXZlbCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IGxvZ2dlciBzaG91bGQgYmUgMCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLmdldExvZ0xldmVsKCkpLnRvLmJlLmVxdWFsKE9GRik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0QWxsKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCcgc2hvdWxkIGluc3RhbmNlb2YgSGFuZGxlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSGFuZGxlcigpLnNldEFsbCgpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRUcmFjZSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IGxvZ2dlciBzaG91bGQgaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0VHJhY2UoKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0RGVidWcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJyBzaG91bGQgaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0RGVidWcoKSkudG8uaW5zdGFuY2VPZihIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ0hhbmRsZXIuc2V0SW5mbygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5zZXRJbmZvKCkpLnRvLmluc3RhbmNlT2YoSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdIYW5kbGVyLnNldFdhcm4oKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJyBzaG91bGQgaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0V2FybigpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRFcnJvcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5zZXRFcnJvcigpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRGYXRhbCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIEhhbmRsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEhhbmRsZXIoKS5zZXRGYXRhbCgpKS50by5pbnN0YW5jZU9mKEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnSGFuZGxlci5zZXRPZmYoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gaW5zdGFuY2VvZiBIYW5kbGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBIYW5kbGVyKCkuc2V0T2ZmKCkpLnRvLmluc3RhbmNlT2YoSGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7IiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge1BpcGV9IGZyb20gXCIuLi9kYXRhL3BpcGUubWpzXCI7XG5cbmltcG9ydCB7QmFzZVdpdGhPcHRpb25zfSBmcm9tIFwiLi4vdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qc1wiO1xuaW1wb3J0IHtpc09iamVjdCwgaXNTdHJpbmd9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVBcnJheSwgdmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7Z2V0TW9uc3RlclZlcnNpb259IGZyb20gXCIuLi90eXBlcy92ZXJzaW9uLm1qc1wiO1xuXG5leHBvcnQge0Zvcm1hdHRlcn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgaW50ZXJuYWxPYmplY3RTeW1ib2wgPSBTeW1ib2woJ2ludGVybmFsT2JqZWN0Jyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHdhdGNoZG9nU3ltYm9sID0gU3ltYm9sKCd3YXRjaGRvZycpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBtYXJrZXJPcGVuSW5kZXhTeW1ib2wgPSBTeW1ib2woJ21hcmtlck9wZW5JbmRleCcpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBtYXJrZXJDbG9zZUluZGV4U3ltYm9sID0gU3ltYm9sKCdtYXJrZXJjbG9zZUluZGV4Jyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHdvcmtpbmdEYXRhU3ltYm9sID0gU3ltYm9sKCd3b3JraW5nRGF0YScpO1xuXG5cbi8qKlxuICogTWVzc2FnZXMgY2FuIGJlIGZvcm1hdHRlZCB3aXRoIHRoZSBmb3JtYXR0ZXIuIFRvIGRvIHRoaXMsIGFuIG9iamVjdCB3aXRoIHRoZSB2YWx1ZXMgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGZvcm1hdHRlci4gVGhlIG1lc3NhZ2UgY2FuIHRoZW4gY29udGFpbiBwbGFjZWhvbGRlcnMuXG4gKlxuICogTG9vayBhdCB0aGUgZXhhbXBsZSBiZWxvdy4gVGhlIHBsYWNlaG9sZGVycyB1c2UgdGhlIGxvZ2ljIG9mIFBpcGUuXG4gKlxuICogIyMgTWFya2VyIGluIG1hcmtlclxuICpcbiAqIE1hcmtlcnMgY2FuIGJlIG5lc3RlZC4gSGVyZSwgdGhlIGlubmVyIG1hcmtlciBpcyByZXNvbHZlZCBmaXJzdCBgJHtzdWJrZXl9IFx1MjFBNiAxID0gJHtteWtleTJ9YCBhbmQgdGhlbiB0aGUgb3V0ZXIgbWFya2VyIGAke215a2V5Mn1gLlxuICpcbiAqIGBgYFxuICogY29uc3QgdGV4dCA9ICcke215a2V5JHtzdWJrZXl9fSc7XG4gKiBsZXQgb2JqID0ge1xuICogIG15a2V5MjogXCIxXCIsXG4gKiAgc3Via2V5OiBcIjJcIlxuICogfTtcbiAqXG4gKiBuZXcgRm9ybWF0dGVyKG9iaikuZm9ybWF0KHRleHQpO1xuICogLy8gXHUyMUE2IDFcbiAqIGBgYFxuICpcbiAqICMjIENhbGxiYWNrc1xuICpcbiAqIFRoZSB2YWx1ZXMgaW4gYSBmb3JtYXR0ZXIgY2FuIGJlIGFkanVzdGVkIHZpYSB0aGUgY29tbWFuZHMgb2YgdGhlIGBUcmFuc2Zvcm1lcmAgb3IgdGhlYFBpcGVgLlxuICogVGhlcmUgaXMgYWxzbyB0aGUgcG9zc2liaWxpdHkgdG8gdXNlIGNhbGxiYWNrcy5cbiAqXG4gKiBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKHt4OiAnMSd9LCB7XG4gKiAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHtcbiAqICAgICAgICAgICAgICAgICAgICBxdW90ZTogKHZhbHVlKSA9PiB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCInXG4gKiAgICAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICB9KTtcbiAqXG4gKiBmb3JtYXR0ZXIuZm9ybWF0KCcke3ggfCBjYWxsOnF1b3RlfScpKVxuICogLy8gXHUyMUE2IFwiMVwiXG4gKlxuICogIyMgTWFya2VyIHdpdGggcGFyYW1ldGVyXG4gKlxuICogQSBzdHJpbmcgY2FuIGFsc28gYnJpbmcgaXRzIG93biB2YWx1ZXMuIFRoZXNlIG11c3QgdGhlbiBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUga2V5IGJ5IGEgc2VwYXJhdG9yIGA6OmAuXG4gKiBUaGUgdmFsdWVzIHRoZW1zZWx2ZXMgbXVzdCBiZSBzcGVjaWZpZWQgaW4ga2V5L3ZhbHVlIHBhaXJzLiBUaGUga2V5IG11c3QgYmUgc2VwYXJhdGVkIGZyb20gdGhlIHZhbHVlIGJ5IGEgc2VwYXJhdG9yIGA9YC5cbiAqXG4gKiBXaGVuIHVzaW5nIGEgcGlwZSwgeW91IG11c3QgcGF5IGF0dGVudGlvbiB0byB0aGUgc2VwYXJhdG9ycy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCB7Rm9ybWF0dGVyfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS90ZXh0L2Zvcm1hdHRlci5tanMnO1xuICpcbiAqIG5ldyBGb3JtYXR0ZXIoe1xuICogICAgICAgYToge1xuICogICAgICAgICAgIGI6IHtcbiAqICAgICAgICAgICAgICAgYzogXCJIZWxsb1wiXG4gKiAgICAgICAgICAgfSxcbiAqICAgICAgICAgICBkOiBcIndvcmxkXCIsXG4gKiAgICAgICB9XG4gKiAgIH0pLmZvcm1hdChcIiR7YS5iLmN9ICR7YS5kIHwgdWNmaXJzdH0hXCIpOyAvLyB3aXRoIHBpcGVcbiAqXG4gKiAvLyBcdTIxQTYgSGVsbG8gV29ybGQhXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xMi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVGV4dFxuICovXG4gY2xhc3MgRm9ybWF0dGVyIGV4dGVuZHMgQmFzZVdpdGhPcHRpb25zIHtcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIGZvciB0aGUgbWFya2VycyBhcmUgYCR7YCBhbmQgYH1gXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBvYmplY3RcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvYmplY3QsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxPYmplY3RTeW1ib2xdID0gb2JqZWN0IHx8IHt9XG4gICAgICAgIHRoaXNbbWFya2VyT3BlbkluZGV4U3ltYm9sXSA9IDA7XG4gICAgICAgIHRoaXNbbWFya2VyQ2xvc2VJbmRleFN5bWJvbF0gPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBtYXJrZXJcbiAgICAgKiBAcHJvcGVydHkge2FycmF5fSBtYXJrZXIub3Blbj1bXCIke1wiXVxuICAgICAqIEBwcm9wZXJ0eSB7YXJyYXl9IG1hcmtlci5jbG9zZT1bXCIke1wiXVxuICAgICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwYXJhbWV0ZXJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1ldGVyLmRlbGltaXRlcj1cIjo6XCJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1ldGVyLmFzc2lnbm1lbnQ9XCI9XCJcbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gY2FsbGJhY2tzPXt9XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgbWFya2VyOiB7XG4gICAgICAgICAgICAgICAgb3BlbjogWyckeyddLFxuICAgICAgICAgICAgICAgIGNsb3NlOiBbJ30nXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcmFtZXRlcjoge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlcjogJzo6JyxcbiAgICAgICAgICAgICAgICBhc3NpZ25tZW50OiAnPSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWxsYmFja3M6IHt9LFxuICAgICAgICB9KVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogU2V0IG5ldyBQYXJhbWV0ZXIgQ2hhcmFjdGVyXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGNoYXJzIGFyZSBgOjpgIGFuZCBgPWBcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGZvcm1hdHRlci5zZXRQYXJhbWV0ZXJDaGFycygnIycpO1xuICAgICAqIGZvcm1hdHRlci5zZXRQYXJhbWV0ZXJDaGFycygnWycsJ10nKTtcbiAgICAgKiBmb3JtYXR0ZXIuc2V0UGFyYW1ldGVyQ2hhcnMoJ2kxOG57JywnfScpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlbGltaXRlclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhc3NpZ25tZW50XG4gICAgICogQHJldHVybiB7Rm9ybWF0dGVyfVxuICAgICAqIEBzaW5jZSAxLjI0LjBcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqL1xuICAgIHNldFBhcmFtZXRlckNoYXJzKGRlbGltaXRlciwgYXNzaWdubWVudCkge1xuXG4gICAgICAgIGlmIChkZWxpbWl0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF1bJ3BhcmFtZXRlciddWydkZWxpbWl0ZXInXSA9IHZhbGlkYXRlU3RyaW5nKGRlbGltaXRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXNzaWdubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXVsncGFyYW1ldGVyJ11bJ2Fzc2lnbm1lbnQnXSA9IHZhbGlkYXRlU3RyaW5nKGFzc2lnbm1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG5ldyBNYXJrZXJcbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIGZvciB0aGUgbWFya2VycyBhcmUgYCR7YCBhbmQgYH1gXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBmb3JtYXR0ZXIuc2V0TWFya2VyKCcjJyk7IC8vIG9wZW4gYW5kIGNsb3NlIGFyZSBib3RoICNcbiAgICAgKiBmb3JtYXR0ZXIuc2V0TWFya2VyKCdbJywnXScpO1xuICAgICAqIGZvcm1hdHRlci5zZXRNYXJrZXIoJ2kxOG57JywnfScpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHthcnJheXxzdHJpbmd9IG9wZW5cbiAgICAgKiBAcGFyYW0ge2FycmF5fHN0cmluZ3x1bmRlZmluZWR9IGNsb3NlXG4gICAgICogQHJldHVybiB7Rm9ybWF0dGVyfVxuICAgICAqIEBzaW5jZSAxLjEyLjBcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqL1xuICAgIHNldE1hcmtlcihvcGVuLCBjbG9zZSkge1xuXG4gICAgICAgIGlmIChjbG9zZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbG9zZSA9IG9wZW47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTdHJpbmcob3BlbikpIG9wZW4gPSBbb3Blbl07XG4gICAgICAgIGlmIChpc1N0cmluZyhjbG9zZSkpIGNsb3NlID0gW2Nsb3NlXTtcblxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXVsnbWFya2VyJ11bJ29wZW4nXSA9IHZhbGlkYXRlQXJyYXkob3Blbik7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdWydtYXJrZXInXVsnY2xvc2UnXSA9IHZhbGlkYXRlQXJyYXkoY2xvc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRvbyBkZWVwIG5lc3RpbmdcbiAgICAgKi9cbiAgICBmb3JtYXQodGV4dCkge1xuICAgICAgICB0aGlzW3dhdGNoZG9nU3ltYm9sXSA9IDA7XG4gICAgICAgIHRoaXNbbWFya2VyT3BlbkluZGV4U3ltYm9sXSA9IDA7XG4gICAgICAgIHRoaXNbbWFya2VyQ2xvc2VJbmRleFN5bWJvbF0gPSAwO1xuICAgICAgICB0aGlzW3dvcmtpbmdEYXRhU3ltYm9sXSA9IHt9O1xuICAgICAgICByZXR1cm4gZm9ybWF0LmNhbGwodGhpcywgdGV4dCk7XG4gICAgfVxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZm9ybWF0KHRleHQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIHNlbGZbd2F0Y2hkb2dTeW1ib2xdKys7XG4gICAgaWYgKHRoaXNbd2F0Y2hkb2dTeW1ib2xdID4gMjApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b28gZGVlcCBuZXN0aW5nJylcbiAgICB9XG5cbiAgICBsZXQgb3Blbk1hcmtlciA9IHNlbGZbaW50ZXJuYWxTeW1ib2xdWydtYXJrZXInXVsnb3BlbiddPy5bdGhpc1ttYXJrZXJPcGVuSW5kZXhTeW1ib2xdXTtcbiAgICBsZXQgY2xvc2VNYXJrZXIgPSBzZWxmW2ludGVybmFsU3ltYm9sXVsnbWFya2VyJ11bJ2Nsb3NlJ10/Llt0aGlzW21hcmtlckNsb3NlSW5kZXhTeW1ib2xdXTtcblxuICAgIC8vIGNvbnRhaW5zIG5vIHBsYWNlaG9sZGVyc1xuICAgIGlmICh0ZXh0LmluZGV4T2Yob3Blbk1hcmtlcikgPT09IC0xIHx8IHRleHQuaW5kZXhPZihjbG9zZU1hcmtlcikgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSB0b2tlbml6ZS5jYWxsKHRoaXMsIHZhbGlkYXRlU3RyaW5nKHRleHQpLCBvcGVuTWFya2VyLCBjbG9zZU1hcmtlcilcblxuICAgIGlmIChzZWxmW2ludGVybmFsU3ltYm9sXVsnbWFya2VyJ11bJ29wZW4nXT8uW3RoaXNbbWFya2VyT3BlbkluZGV4U3ltYm9sXSArIDFdKSB7XG4gICAgICAgIHRoaXNbbWFya2VyT3BlbkluZGV4U3ltYm9sXSsrO1xuICAgIH1cblxuICAgIGlmIChzZWxmW2ludGVybmFsU3ltYm9sXVsnbWFya2VyJ11bJ2Nsb3NlJ10/Llt0aGlzW21hcmtlckNsb3NlSW5kZXhTeW1ib2xdICsgMV0pIHtcbiAgICAgICAgdGhpc1ttYXJrZXJDbG9zZUluZGV4U3ltYm9sXSsrO1xuICAgIH1cblxuICAgIHJlc3VsdCA9IGZvcm1hdC5jYWxsKHNlbGYsIHJlc3VsdClcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTIuMFxuICogQHBhcmFtIHRleHRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemUodGV4dCwgb3Blbk1hcmtlciwgY2xvc2VNYXJrZXIpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGxldCBmb3JtYXR0ZWQgPSBbXTtcblxuICAgIGNvbnN0IHBhcmFtZXRlckFzc2lnbm1lbnQgPSBzZWxmW2ludGVybmFsU3ltYm9sXVsncGFyYW1ldGVyJ11bJ2Fzc2lnbm1lbnQnXVxuICAgIGNvbnN0IHBhcmFtZXRlckRlbGltaXRlciA9IHNlbGZbaW50ZXJuYWxTeW1ib2xdWydwYXJhbWV0ZXInXVsnZGVsaW1pdGVyJ11cbiAgICBjb25zdCBjYWxsYmFja3MgPSBzZWxmW2ludGVybmFsU3ltYm9sXVsnY2FsbGJhY2tzJ107XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuXG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gdGV4dC5pbmRleE9mKG9wZW5NYXJrZXIpO1xuICAgICAgICAvLyBubyBtYXJrZXIgXG4gICAgICAgIGlmIChzdGFydEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgZm9ybWF0dGVkLnB1c2godGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChzdGFydEluZGV4ID4gMCkge1xuICAgICAgICAgICAgZm9ybWF0dGVkLnB1c2godGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkpXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnRJbmRleClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmRJbmRleCA9IHRleHQuc3Vic3RyaW5nKG9wZW5NYXJrZXIubGVuZ3RoKS5pbmRleE9mKGNsb3NlTWFya2VyKTtcbiAgICAgICAgaWYgKGVuZEluZGV4ICE9PSAtMSkgZW5kSW5kZXggKz0gb3Blbk1hcmtlci5sZW5ndGg7XG4gICAgICAgIGxldCBpbnNpZGVTdGFydEluZGV4ID0gdGV4dC5zdWJzdHJpbmcob3Blbk1hcmtlci5sZW5ndGgpLmluZGV4T2Yob3Blbk1hcmtlcik7XG4gICAgICAgIGlmIChpbnNpZGVTdGFydEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgaW5zaWRlU3RhcnRJbmRleCArPSBvcGVuTWFya2VyLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChpbnNpZGVTdGFydEluZGV4IDwgZW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdG9rZW5pemUuY2FsbChzZWxmLCB0ZXh0LnN1YnN0cmluZyhpbnNpZGVTdGFydEluZGV4KSwgb3Blbk1hcmtlciwgY2xvc2VNYXJrZXIpO1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBpbnNpZGVTdGFydEluZGV4KSArIHJlc3VsdFxuICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gdGV4dC5zdWJzdHJpbmcob3Blbk1hcmtlci5sZW5ndGgpLmluZGV4T2YoY2xvc2VNYXJrZXIpO1xuICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCAhPT0gLTEpIGVuZEluZGV4ICs9IG9wZW5NYXJrZXIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3ludGF4IGVycm9yIGluIGZvcm1hdHRlciB0ZW1wbGF0ZVwiKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGtleSA9IHRleHQuc3Vic3RyaW5nKG9wZW5NYXJrZXIubGVuZ3RoLCBlbmRJbmRleCk7XG4gICAgICAgIGxldCBwYXJ0cyA9IGtleS5zcGxpdChwYXJhbWV0ZXJEZWxpbWl0ZXIpO1xuICAgICAgICBsZXQgY3VycmVudFBpcGUgPSBwYXJ0cy5zaGlmdCgpO1xuXG4gICAgICAgIHNlbGZbd29ya2luZ0RhdGFTeW1ib2xdID0gZXh0ZW5kKHt9LCBzZWxmW2ludGVybmFsT2JqZWN0U3ltYm9sXSwgc2VsZlt3b3JraW5nRGF0YVN5bWJvbF0pO1xuXG4gICAgICAgIGZvciAoY29uc3Qga3Ygb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGNvbnN0IFtrLCB2XSA9IGt2LnNwbGl0KHBhcmFtZXRlckFzc2lnbm1lbnQpO1xuICAgICAgICAgICAgc2VsZlt3b3JraW5nRGF0YVN5bWJvbF1ba10gPSB2O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdDEgPSBrZXkuc3BsaXQoJ3wnKS5zaGlmdCgpLnRyaW0oKTsgLy8gcGlwZSBzeW1ib2xcbiAgICAgICAgY29uc3QgdDIgPSB0MS5zcGxpdCgnOjonKS5zaGlmdCgpLnRyaW0oKTsgLy8ga2V5IHZhbHVlIGRlbGltaXRlclxuICAgICAgICBjb25zdCB0MyA9IHQyLnNwbGl0KCcuJykuc2hpZnQoKS50cmltKCk7IC8vIHBhdGggZGVsaW1pdGVyXG4gICAgICAgIGxldCBwcmVmaXggPSBzZWxmW3dvcmtpbmdEYXRhU3ltYm9sXT8uW3QzXSA/ICdwYXRoOicgOiAnc3RhdGljOic7XG5cbiAgICAgICAgbGV0IGNvbW1hbmQgPSBcIlwiO1xuICAgICAgICBpZiAocHJlZml4ICYmIGtleS5pbmRleE9mKHByZWZpeCkgIT09IDBcbiAgICAgICAgICAgICYmIGtleS5pbmRleE9mKCdwYXRoOicpICE9PSAwXG4gICAgICAgICAgICAmJiBrZXkuaW5kZXhPZignc3RhdGljOicpICE9PSAwKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgY29tbWFuZCArPSBjdXJyZW50UGlwZTtcblxuICAgICAgICBjb25zdCBwaXBlID0gbmV3IFBpcGUoY29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGlzT2JqZWN0KGNhbGxiYWNrcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIGNhbGxiYWNrXSBvZiBPYmplY3QuZW50cmllcyhjYWxsYmFja3MpKSB7XG4gICAgICAgICAgICAgICAgcGlwZS5zZXRDYWxsYmFjayhuYW1lLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXR0ZWQucHVzaCh2YWxpZGF0ZVN0cmluZyhwaXBlLnJ1bihzZWxmW3dvcmtpbmdEYXRhU3ltYm9sXSkpKTtcblxuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoZW5kSW5kZXggKyBjbG9zZU1hcmtlci5sZW5ndGgpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZC5qb2luKCcnKTtcbn1cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tIFwiLi4vZGF0YS9wYXRoZmluZGVyLm1qc1wiO1xuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7QmFzZVdpdGhPcHRpb25zfVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBvcHRpb25zIGZyb20gd2hpY2ggc29tZSBtb25zdGVyIGNsYXNzZXMgYXJlIGRlcml2ZWQuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBhY3R1YWxseSBvbmx5IHVzZWQgYXMgYSBiYXNlIGNsYXNzLlxuICpcbiAqIENsYXNzZXMgdGhhdCByZXF1aXJlIHRoZSBwb3NzaWJpbGl0eSBvZiBvcHRpb25zIGNhbiBiZSBkZXJpdmVkIGRpcmVjdGx5IGZyb20gdGhpcyBjbGFzcy5cbiAqIERlcml2ZWQgY2xhc3NlcyBhbG1vc3QgYWx3YXlzIG92ZXJyaWRlIHRoZSBgZGVmYXVsYCBnZXR0ZXIgd2l0aCB0aGVpciBvd24gdmFsdWVzLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS90eXBlcy9iYXNld2l0aG9wdGlvbnMubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICovXG5jbGFzcyBCYXNlV2l0aE9wdGlvbnMgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBleHRlbmQoe30sIHRoaXMuZGVmYXVsdHMsIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMpKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZ2V0dGVyIHByb3ZpZGVzIHRoZSBvcHRpb25zLiBEZXJpdmVkIGNsYXNzZXMgb3ZlcndyaXRlXG4gICAgICogdGhpcyBnZXR0ZXIgd2l0aCB0aGVpciBvd24gdmFsdWVzLiBJdCBpcyBnb29kIGthcm1hIHRvIGFsd2F5cyBpbmNsdWRlXG4gICAgICogdGhlIHZhbHVlcyBmcm9tIHRoZSBwYXJlbnQgY2xhc3MuXG4gICAgICpcbiAgICAgKiBgYGBqYXZhc2NyaXB0XG4gICAgICogZ2V0IGRlZmF1bHRzKCkge1xuICAgICAqICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgKiAgICAgICAgIG15a2V5OiB0cnVlXG4gICAgICogICAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbmVzdGVkIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBieSBwYXRoIGBhLmIuY2BcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWVcbiAgICAgKiBAcmV0dXJuIHsqfVxuICAgICAqIEBzaW5jZSAxLjEwLjBcbiAgICAgKi9cbiAgICBnZXRPcHRpb24ocGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgUGF0aGZpbmRlcih0aGlzW2ludGVybmFsU3ltYm9sXSkuZ2V0VmlhKHBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG5cbn1cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdGV4dC9mb3JtYXR0ZXIubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0Zvcm1hdHRlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIC8vIGh0dHBzOi8vZ2l0bGFiLnNjaHVrYWkuY29tL29zcy9saWJyYXJpZXMvamF2YXNjcmlwdC9tb25zdGVyLy0vaXNzdWVzLzQ3XG4gICAgZGVzY3JpYmUoJ2V4YW1wbGVzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZmMgZXhhbXBsZSBzaG91bGQgcnVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBGb3JtYXR0ZXIoe1xuXG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjOiBcIkhlbGxvXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZDogXCJXb3JsZFwiLFxuICAgICAgICAgICAgICAgICAgICBlOiAxXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KS5mb3JtYXQoXCIke2EuYi5jfSAke2EuZCB8IHRvdXBwZXJ9IVwiKSkudG8uYmUuZXF1YWwoJ0hlbGxvIFdPUkxEIScpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdkb2MgZXhhbXBsZSBzaG91bGQgcnVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBGb3JtYXR0ZXIoe1xuXG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjOiBcIkhlbGxvXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZDogXCJ3b3JsZFwiLFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSkuZm9ybWF0KFwiJHthLmIuY30gJHthLmQgfCB1Y2ZpcnN0fSFcIikpLnRvLmJlLmVxdWFsKCdIZWxsbyBXb3JsZCEnKTtcbiAgICAgICAgfSlcblxuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdzZXQgbWFya2VyKCknLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgICAgICBbXG4gICAgICAgICAgICBbJyNhIycsICcjJywgdW5kZWZpbmVkLCAndGVzdCddLFxuICAgICAgICAgICAgWyd7YX0nLCAneycsICd9JywgJ3Rlc3QnXSxcbiAgICAgICAgICAgIFsnaTE4bnthfScsICdpMThueycsICd9JywgJ3Rlc3QnXSxcblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGQgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2Zvcm1hdCAnICsgYSArICcgd2l0aCBtYXJrZXIgJyArIGIgKyAnIGFuZCAnICsgYyArICcgc2hvdWxkIHJldHVybiAgJyArIGIsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChcbiAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1hdHRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBhOiBcInRlc3RcIlxuICAgICAgICAgICAgICAgICAgICB9KS5zZXRNYXJrZXIoYiwgYykuZm9ybWF0KGEpXG4gICAgICAgICAgICAgICAgKS50by5lcXVhbChkKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2V4YW1wbGVzKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWycke2EgfCB0b2pzb259JywgXCJ7XFxcImJcXFwiOntcXFwiY1xcXCI6XFxcIkhlbGxvXFxcIn0sXFxcImRcXFwiOlxcXCJXb3JsZFxcXCIsXFxcImVcXFwiOjF9XCJdLFxuICAgICAgICAgICAgWydjbGljayAke2EuZH0gdGltZXMnLCBcImNsaWNrIFdvcmxkIHRpbWVzXCJdLFxuICAgICAgICAgICAgWycgJHthLmIuY30gJywgJyBIZWxsbyAnXSxcbiAgICAgICAgICAgIFsnICR7YS5iLmN9JywgJyBIZWxsbyddLFxuICAgICAgICAgICAgWycke2EuYi5jfSAnLCAnSGVsbG8gJ10sXG4gICAgICAgICAgICBbJyR7YS5iLmN9JywgJ0hlbGxvJ10sXG4gICAgICAgICAgICBbJyR7YS5iLmN9JHthLmIuY30nLCAnSGVsbG9IZWxsbyddLFxuICAgICAgICAgICAgWycke2EuYi5jfSAke2EuYi5jfScsICdIZWxsbyBIZWxsbyddLFxuICAgICAgICAgICAgWycke2EuYi5jfSAke2EuYi5jfSAnLCAnSGVsbG8gSGVsbG8gJ10sXG4gICAgICAgICAgICBbJyAke2EuYi5jfSAke2EuYi5jfSAnLCAnIEhlbGxvIEhlbGxvICddLFxuICAgICAgICAgICAgWycgJHthLmIuY30gJHthLmR9ICcsICcgSGVsbG8gV29ybGQgJ10sXG4gICAgICAgICAgICBbJyAke2EuYi5jfSAke2EuYi5jIHwgdG91cHBlciB8IGxlbmd0aCB8IHRvc3RyaW5nfSAnLCAnIEhlbGxvIDUgJ10sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnZm9ybWF0ICcgKyBhICsgJyBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCJIZWxsb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZDogXCJXb3JsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZTogMVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcihvYmopLmZvcm1hdChhKSkuaXMuZXF1YWwoYilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ01hcmtlciBpbiBtYXJrZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IHRleHQgPSAnJHtteWtleSR7c3Via2V5fX0nO1xuICAgICAgICBsZXQgZXhwZWN0ZWQgPSAnMSc7XG5cbiAgICAgICAgaXQoJ2Zvcm1hdCAnICsgdGV4dCArICcgc2hvdWxkICcgKyBleHBlY3RlZCwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIG15a2V5MjogXCIxXCIsXG4gICAgICAgICAgICAgICAgc3Via2V5OiBcIjJcIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZXhwZWN0KG5ldyBGb3JtYXR0ZXIob2JqKS5mb3JtYXQodGV4dCkpLmlzLmVxdWFsKGV4cGVjdGVkKVxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXRQYXJhbWV0ZXJDaGFycygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzZXRQYXJhbWV0ZXJDaGFycygpIHNob3VsZCByZXR1cm4gSW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcih7fSkuc2V0UGFyYW1ldGVyQ2hhcnMoJ2EnLCAnYicpKS5pcy5pbnN0YW5jZW9mKEZvcm1hdHRlcik7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnd2l0aCBjYWxsYmFja3MnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2FkZCBjYWxsYmFjaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoe1xuICAgICAgICAgICAgICAgIHg6ICcxJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrczoge1xuICAgICAgICAgICAgICAgICAgICBteTogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIhXCIgKyB2YWx1ZSArIFwiIVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZXhwZWN0KGZvcm1hdHRlci5mb3JtYXQoJyR7eCB8IGNhbGw6bXl9JykpLmlzLmVxdWFsKCchMSEnKTtcblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnTWFya2VyIGluIG1hcmtlciB3aXRoIHBhcmFtZXRlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgdGV4dCA9ICcke215a2V5OjpteWtleT0ke3N1YmtleX19JztcbiAgICAgICAgbGV0IGV4cGVjdGVkID0gJzInO1xuXG4gICAgICAgIGl0KCdmb3JtYXQgJyArIHRleHQgKyAnIHNob3VsZCAnICsgZXhwZWN0ZWQsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgICBzdWJrZXk6IFwiMlwiXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcihvYmopLmZvcm1hdCh0ZXh0KSkuaXMuZXF1YWwoZXhwZWN0ZWQpXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZXhjZXB0aW9ucycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJyR7YS5iLnh9JywgVHlwZUVycm9yXSxcbiAgICAgICAgICAgIFsnJHthLmIuZCB8IHRvdXBwZXIgfCBsZW5ndGh9JywgVHlwZUVycm9yXSxcbiAgICAgICAgICAgIFsnJHthLmIuZH0nLCBUeXBlRXJyb3JdLCAgLy8gYS5iLmQgcmV0dXJuIHVuZGVmaW5lZCBieSBwYXRoZmluZGVyIFxuICAgICAgICAgICAgWycke2EuYi5kIHwgdG9sb3dlcn0nLCBUeXBlRXJyb3JdLCAgLy8gYS5iLmQgcmV0dXJuIHVuZGVmaW5lZCBieSBwYXRoZmluZGVyIFxuICAgICAgICAgICAgWycke2EgfCB9JywgRXJyb3JdLFxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2Zvcm1hdCAnICsgYSArICcgc2hvdWxkIHRocm93ICcgKyB0eXBlb2YgYiwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtYXR0ZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCJ0ZXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JtYXQoYSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICkudG8udGhyb3coYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uLy4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtMaW5rfSBmcm9tIFwiLi4vbGluay5tanNcIjtcblxuZXhwb3J0IHtTdHlsZXNoZWV0fVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgcmVzb3VyY2UgbWFuYWdlciB0byBlbWJlZCBleHRlcm5hbCByZXNvdXJjZXMuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NLlJlc291cmNlXG4gKiBAc3VtbWFyeSBBIFJlc291cmNlIGNsYXNzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rXG4gKi9cbmNsYXNzIFN0eWxlc2hlZXQgZXh0ZW5kcyBMaW5rIHtcblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWwge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItcmVsfVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgICAgICAgIHJlbDogJ3N0eWxlc2hlZXQnXG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge1xuICAgIEFUVFJJQlVURV9DTEFTUyxcbiAgICBBVFRSSUJVVEVfSFJFRixcbiAgICBBVFRSSUJVVEVfSUQsXG4gICAgQVRUUklCVVRFX05PTkNFLCBBVFRSSUJVVEVfU1JDLFxuICAgIEFUVFJJQlVURV9USVRMRSwgQVRUUklCVVRFX1RZUEUsXG4gICAgVEFHX0xJTktcbn0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7S0VZX0RPQ1VNRU5ULCByZWZlcmVuY2VTeW1ib2wsIFJlc291cmNlfSBmcm9tIFwiLi4vcmVzb3VyY2UubWpzXCI7XG5cbmV4cG9ydCB7TGlua31cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIHJlc291cmNlIG1hbmFnZXIgdG8gZW1iZWQgZXh0ZXJuYWwgcmVzb3VyY2VzLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjUuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRPTS5SZXNvdXJjZVxuICogQHN1bW1hcnkgQSBSZXNvdXJjZSBjbGFzc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGlua1xuICovXG5jbGFzcyBMaW5rIGV4dGVuZHMgUmVzb3VyY2Uge1xuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFzIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGluayNhdHRyLWFzfVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcm9zc09yaWdpbj1hbm9ueW1vdXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1jcm9zc29yaWdpbn1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGRpc2FibGVkXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGhyZWYge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaHJlZn1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaHJlZmxhbmcge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaHJlZmxhbmd9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGltYWdlc2l6ZXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaW1hZ2VzaXplc31cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaW1hZ2VzcmNzZXQge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItaW1hZ2VzcmNzZXR9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGludGVncml0eSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1pbnRlZ3JpdHl9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IG1lZGlhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvbGluayNhdHRyLW1lZGlhfVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcmVmZXRjaCB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1wcmVmZXRjaH1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVmZXJyZXJwb2xpY3kge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItcmVmZXJyZXJwb2xpY3l9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbCB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2xpbmsjYXR0ci1yZWx9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItdHlwZX1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gc2l6ZXMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9saW5rI2F0dHItc2l6ZXN9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IG5vbmNlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItbm9uY2V9XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBocmVmOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBocmVmbGFuZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW1hZ2VzaXplczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW1hZ2VzcmNzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGludGVncml0eTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbWVkaWE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByZWZldGNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZWZlcnJlcnBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVsOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzaXplczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHlwZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9uY2U6IHVuZGVmaW5lZFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2UuTGlua31cbiAgICAgKi9cbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRVUkxBdHRyaWJ1dGUoKSB7XG4gICAgICAgIHJldHVybiBBVFRSSUJVVEVfSFJFRlxuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZS5MaW5rfVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBzZWxmLmdldE9wdGlvbihLRVlfRE9DVU1FTlQpO1xuICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX0xJTkspO1xuXG4gICAgZm9yIChsZXQga2V5IG9mIFsnYXMnLCdjcm9zc09yaWdpbicsJ2Rpc2FibGVkJywnaHJlZicsJ2hyZWZsYW5nJywnaW1hZ2VzaXplcycsJ2ltYWdlc3Jjc2V0JywnaW50ZWdyaXR5JywnbWVkaWEnLCdwcmVmZXRjaCcsJ3JlZmVycmVycG9saWN5Jywnc2l6ZXMnLCdyZWwnLCd0eXBlJyxBVFRSSUJVVEVfSFJFRixBVFRSSUJVVEVfSUQsQVRUUklCVVRFX0NMQVNTLEFUVFJJQlVURV9USVRMRSxBVFRSSUJVVEVfTk9OQ0VdKSB7XG4gICAgICAgIGlmIChzZWxmLmdldE9wdGlvbihrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXVtrZXldID0gc2VsZi5nZXRPcHRpb24oa2V5KTtcbiAgICAgICAgfVxuICAgIH0gICAgXG4gICAgXG4gICAgcmV0dXJuIHNlbGY7XG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3RhdGVTeW1ib2wsIGludGVybmFsU3ltYm9sLH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge0Jhc2VXaXRoT3B0aW9uc30gZnJvbSBcIi4uL3R5cGVzL2Jhc2V3aXRob3B0aW9ucy5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsT2JqZWN0fSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtJRH0gZnJvbSBcIi4uL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHtpc1N0cmluZ30gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtPYnNlcnZlcn0gZnJvbSBcIi4uL3R5cGVzL29ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHtQcm94eU9ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7QVRUUklCVVRFX0NMQVNTLCBBVFRSSUJVVEVfSUQsIEFUVFJJQlVURV9USVRMRX0gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuXG5leHBvcnQge1Jlc291cmNlLCBLRVlfRE9DVU1FTlQsIEtFWV9RVUVSWSwgcmVmZXJlbmNlU3ltYm9sfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBLRVlfRE9DVU1FTlQgPSAnZG9jdW1lbnQnO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBLRVlfUVVFUlkgPSAncXVlcnknO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBLRVlfVElNRU9VVCA9ICd0aW1lb3V0JztcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcmVmZXJlbmNlU3ltYm9sID0gU3ltYm9sKCdyZWZlcmVuY2UnKTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgcmVzb3VyY2VzIHRvIGJlIGxvYWRlZC5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBzdW1tYXJ5IEEgUmVzb3VyY2UgY2xhc3NcbiAqL1xuY2xhc3MgUmVzb3VyY2UgZXh0ZW5kcyBCYXNlV2l0aE9wdGlvbnMge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdHx1bmRlZmluZWR9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIGxldCB1cmkgPSB0aGlzLmdldE9wdGlvbih0aGlzLmNvbnN0cnVjdG9yLmdldFVSTEF0dHJpYnV0ZSgpKTtcblxuICAgICAgICBpZiAodXJpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBzb3VyY2UnKVxuICAgICAgICB9IGVsc2UgaWYgKHVyaSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgICAgICAgdXJpID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaW5nKHVyaSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgdXJsIHR5cGUnKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF1bdGhpcy5jb25zdHJ1Y3Rvci5nZXRVUkxBdHRyaWJ1dGUoKV0gPSB1cmk7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxTdGF0ZVN5bWJvbF0gPSBuZXcgUHJveHlPYnNlcnZlcih7XG4gICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzW3JlZmVyZW5jZVN5bWJvbF0gPSB1bmRlZmluZWQ7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkKCkge1xuXG4gICAgICAgIGlmICh0aGlzW3JlZmVyZW5jZVN5bWJvbF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbcmVmZXJlbmNlU3ltYm9sXS5pc0Nvbm5lY3RlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IHRoZSBzcGVjaWFsIGNsYXNzZXMgYW5kIGNyZWF0ZXMgdGhlIERPTSBvYmplY3QuXG4gICAgICogVGhpcyBtZXRob2QgaXMgYWxzbyBjYWxsZWQgaW1wbGljaXRseSwgaWYgbm90IHlldCBkb25lIGV4cGxpY2l0bHksIGJ5IGNhbGxpbmcgYGNvbm5lY3QoKWAuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXNcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZX1cbiAgICAgKi9cbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGFwcGVuZHMgdGhlIEhUTUxFbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQuXG4gICAgICogSWYgdGhlIGVsZW1lbnQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLCBgY3JlYXRlKClgIGlzIGNhbGxlZCBpbXBsaWNpdGx5LlxuICAgICAqXG4gICAgICogdGhyb3dzIHtFcnJvcn0gdGFyZ2V0IG5vdCBmb3VuZFxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlfVxuICAgICAqL1xuICAgIGNvbm5lY3QoKSB7XG5cbiAgICAgICAgaWYgKCEodGhpc1tyZWZlcmVuY2VTeW1ib2xdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kVG9Eb2N1bWVudC5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge0RvY3VtZW50fSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgb2JqZWN0IGludG8gd2hpY2ggdGhlIG5vZGUgaXMgdG8gYmUgYXBwZW5kZWRcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gc3JjL2hyZWYgdXJsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5IGRlZmluZXMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSByZXNvdXJjZSBpcyB0byBiZSBob29rZWQgaW50byB0aGUgZG9tLlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBlbGVtZW50IGF0dHJpYnV0ZSBpZFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBlbGVtZW50IGF0dHJpYnV0ZSB0aXRsZVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzcyBlbGVtZW50IGF0dHJpYnV0ZSBjbGFzc1xuICAgICAqIEBwcm9wZXJ0eSB7aW50fSB0aW1lb3V0IHRpbWVvdXRcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICBbdGhpcy5jb25zdHJ1Y3Rvci5nZXRVUkxBdHRyaWJ1dGUoKV06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFtLRVlfRE9DVU1FTlRdOiBnZXRHbG9iYWxPYmplY3QoJ2RvY3VtZW50JyksXG4gICAgICAgICAgICBbS0VZX1FVRVJZXTogJ2hlYWQnLFxuICAgICAgICAgICAgW0tFWV9USU1FT1VUXTogMTAwMDAsXG4gICAgICAgICAgICBbQVRUUklCVVRFX0lEXTogKG5ldyBJRCgncmVzb3VyY2UnKSkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIFtBVFRSSUJVVEVfQ0xBU1NdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBbQVRUUklCVVRFX1RJVExFXTogdW5kZWZpbmVkXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2l0aCBgYXZhaWxhYmxlKClgIHlvdSBjYW4gY2hlY2sgaWYgYSByZXNvdXJjZSBpcyBhdmFpbGFibGUuXG4gICAgICogVGhpcyBpcyB0aGUgY2FzZSB3aGVuIHRoZSB0YWcgaXMgaW5jbHVkZWQgYW5kIHRoZSByZXNvdXJjZSBpcyBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGF2YWlsYWJsZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmICghKHNlbGZbcmVmZXJlbmNlU3ltYm9sXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdubyBlbGVtZW50JylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VsZi5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ2VsZW1lbnQgbm90IGNvbm5lY3RlZCcpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5nZXRTdWJqZWN0KClbJ2xvYWRlZCddID09PSB0cnVlKSB7XG5cbiAgICAgICAgICAgIGlmIChzZWxmW2ludGVybmFsU3RhdGVTeW1ib2xdLmdldFN1YmplY3QoKVsnZXJyb3InXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHNlbGZbaW50ZXJuYWxTdGF0ZVN5bWJvbF0uZ2V0U3ViamVjdCgpWydlcnJvciddKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgICAgICB9LCBzZWxmLmdldE9wdGlvbigndGltZW91dCcpKVxuXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHNlbGZbaW50ZXJuYWxTdGF0ZVN5bWJvbF0uZGV0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHNlbGZbaW50ZXJuYWxTdGF0ZVN5bWJvbF0uYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VVJMQXR0cmlidXRlKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlc1wiKTtcbiAgICB9XG5cbn1cblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICogdGhyb3dzIHtFcnJvcn0gdGFyZ2V0IG5vdCBmb3VuZFxuICovXG5mdW5jdGlvbiBhcHBlbmRUb0RvY3VtZW50KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZi5nZXRPcHRpb24oS0VZX1FVRVJZLCAnaGVhZCcpKVxuICAgIGlmICghKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXQgbm90IGZvdW5kJylcbiAgICB9XG5cbiAgICBhZGRFdmVudHMuY2FsbChzZWxmKTtcbiAgICB0YXJnZXROb2RlLmFwcGVuZENoaWxkKHNlbGZbcmVmZXJlbmNlU3ltYm9sXSk7XG5cbiAgICByZXR1cm4gc2VsZjtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7YWRkRXZlbnRzfVxuICovXG5mdW5jdGlvbiBhZGRFdmVudHMoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuXG4gICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBzZWxmW3JlZmVyZW5jZVN5bWJvbF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG5cbiAgICAgICAgc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5zZXRTdWJqZWN0KHtcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGVycm9yOiBzZWxmW3JlZmVyZW5jZVN5bWJvbF1bc2VsZi5jb25zdHJ1Y3Rvci5nZXRVUkxBdHRyaWJ1dGUoKV0gKyAnIGlzIG5vdCBhdmFpbGFibGUnLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbkxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBzZWxmW3JlZmVyZW5jZVN5bWJvbF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgICAgIHNlbGZbaW50ZXJuYWxTdGF0ZVN5bWJvbF0uZ2V0U3ViamVjdCgpWydsb2FkZWQnXSA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmW3JlZmVyZW5jZVN5bWJvbF0uYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCwgZmFsc2UpO1xuICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IsIGZhbHNlKTtcblxuICAgIHJldHVybiBzZWxmO1xuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgY2hhaSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1N0eWxlc2hlZXR9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3Jlc291cmNlL2xpbmsvc3R5bGVzaGVldC5tanNcIjtcbmltcG9ydCB7RGF0YVVybH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qc1wiO1xuaW1wb3J0IHtJRH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2NsZWFudXBET01Gcm9tVGVzdGluZywgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC9jbGVhbnVwZG9tLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5cbmNoYWkudXNlKGNoYWlEb20pO1xuXG5sZXQgaHRtbDEgPSBgXG5cbmA7XG5cblxuZGVzY3JpYmUoJ1N0eWxlc2hlZXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKHtcbiAgICAgICAgICAgIHJ1blNjcmlwdHM6IFwiZGFuZ2Vyb3VzbHlcIixcbiAgICAgICAgICAgIHJlc291cmNlczogXCJ1c2FibGVcIlxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZygpXG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGNsZWFudXBET01Gcm9tVGVzdGluZygpO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnU3R5bGVzaGVldCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnY29ubmVjdCgpLmF2YWlsYWJsZSgpJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgY29uc3Qgc3R5bGVzaGVldCA9IG5ldyBTdHlsZXNoZWV0KHtcbiAgICAgICAgICAgICAgICBocmVmOiBuZXcgRGF0YVVybCgnJywgJ3RleHQvY3NzJykudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzdHlsZXNoZWV0LmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHN0eWxlc2hlZXQuZ2V0T3B0aW9uKCdpZCcpXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG4gICAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRXh0ZXJuYWwgU3R5bGVzaGVldCcsICgpID0+IHtcblxuICAgICAgICBsZXQgaWQgPSBuZXcgSUQoJ1N0eWxlc2hlZXQnKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgc3R5bGVzaGVldCwgdXJsID0gJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvZW1wdHkuY3NzPycgKyBpZDtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgc3R5bGVzaGVldCA9IG5ldyBTdHlsZXNoZWV0KHtcbiAgICAgICAgICAgICAgICBocmVmOiB1cmwsXG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FwcGVuZCBhbmQgcmVtb3ZlIFN0eWxlc2hlZXQgJywgKGRvbmUpID0+IHtcblxuICAgICAgICAgICAgZXhwZWN0KHN0eWxlc2hlZXQuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgICAgIHN0eWxlc2hlZXQuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChzdHlsZXNoZWV0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHN0eWxlc2hlZXQuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkubm90LnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChzdHlsZXNoZWV0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbaHJlZj1cIicgKyB1cmwgKyAnXCJdJykpLnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkubm90LnRvLmV4aXN0O1xuICAgICAgICAgICAgICAgICAgICBleHBlY3Qoc3R5bGVzaGVldC5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7IiwgIi8qKioqKioqKlxuXG4gQ29udmVydCBjaGFpLWRvbSAxLjguMSB0byBlcyBtb2R1bGUsIHdpdGhvdXQgYW55IG90aGVyIG1vZGlmaWNhdGlvbi5cbiBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9uYXRoYW5ib2t0YWUvY2hhaS1kb20vYmxvYi84NmMzNDIzL2NoYWktZG9tLmpzXG4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uYXRoYW5ib2t0YWUvY2hhaS1kb20vaXNzdWVzLzM4XG5cbiBVc2FnZTpcbiBpbXBvcnQgeyBjaGFpRG9tIH0gZnJvbSAnPHBhdGgtdG8+L2NoYWktZG9tJztcbiBjaGFpLnVzZShjaGFpRG9tKTtcblxuIENvcHlyaWdodCAoYykgMjAxNSBOYXRoYW4gQmxhY2sgYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuXG4gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIGxpY2Vuc2UuIEZvciBhIGNvcHksIHNlZSA8aHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQ+LlxuXG4gKioqKioqKioqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYWlEb20oY2hhaSwgdXRpbHMpIHtcbiAgICB2YXIgZmxhZyA9IHV0aWxzLmZsYWcsXG5cbiAgICAgICAgZWxUb1N0cmluZyA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICB2YXIgZGVzY1xuICAgICAgICAgICAgaWYgKGlzTm9kZUxpc3QoZWwpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdlbXB0eSBOb2RlTGlzdCdcbiAgICAgICAgICAgICAgICBkZXNjID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZWwsIDAsIDUpLm1hcChlbFRvU3RyaW5nKS5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsLmxlbmd0aCA+IDUgPyBkZXNjICsgJy4uLiAoKycgKyAoZWwubGVuZ3RoIC0gNSkgKyAnIG1vcmUpJyA6IGRlc2NcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGVsKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXNjID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICBpZiAoZWwuaWQpIHtcbiAgICAgICAgICAgICAgICBkZXNjICs9ICcjJyArIGVsLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWwuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgZGVzYyArPSAnLicgKyBTdHJpbmcoZWwuY2xhc3NOYW1lKS5yZXBsYWNlKC9cXHMrL2csICcuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZWwuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyLm5hbWUgIT09ICdjbGFzcycgJiYgYXR0ci5uYW1lICE9PSAnaWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgKz0gJ1snICsgYXR0ci5uYW1lICsgKGF0dHIudmFsdWUgPyAnPVwiJyArIGF0dHIudmFsdWUgKyAnXCJdJyA6ICddJylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NcbiAgICAgICAgfSxcblxuICAgICAgICBhdHRyQXNzZXJ0ID0gZnVuY3Rpb24obmFtZSwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKSwgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKG5hbWUpXG5cbiAgICAgICAgICAgIGlmICghZmxhZyh0aGlzLCAnbmVnYXRlJykgfHwgdW5kZWZpbmVkID09PSB2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgISFlbC5hdHRyaWJ1dGVzW25hbWVdXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSBhbiBhdHRyaWJ1dGUgI3tleHB9J1xuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIGFuIGF0dHJpYnV0ZSAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICwgbmFtZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVuZGVmaW5lZCAhPT0gdmFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIHZhbCA9PT0gYWN0dWFsXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSBhbiBhdHRyaWJ1dGUgJyArIHV0aWxzLmluc3BlY3QobmFtZSkgKyAnIHdpdGggdGhlIHZhbHVlICN7ZXhwfSwgYnV0IHRoZSB2YWx1ZSB3YXMgI3thY3R9J1xuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIGFuIGF0dHJpYnV0ZSAnICsgdXRpbHMuaW5zcGVjdChuYW1lKSArICcgd2l0aCB0aGUgdmFsdWUgI3thY3R9J1xuICAgICAgICAgICAgICAgICAgICAsIHZhbFxuICAgICAgICAgICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmxhZyh0aGlzLCAnb2JqZWN0JywgYWN0dWFsKVxuICAgICAgICB9LFxuXG4gICAgICAgIGlzSFRNTEVsZW1lbnQgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsLm5vZGVUeXBlID09PSAxIC8vIHdpbmRvdy5Ob2RlLkVMRU1FTlRfTk9ERVxuICAgICAgICB9LFxuXG4gICAgICAgIGlzTm9kZUxpc3QgPSBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgTm9kZUxpc3RdJ1xuICAgICAgICB9XG5cbiAgICB1dGlscy5lbFRvU3RyaW5nID0gZWxUb1N0cmluZ1xuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgnYXR0cicsIGF0dHJBc3NlcnQpXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdhdHRyaWJ1dGUnLCBhdHRyQXNzZXJ0KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdjbGFzcycsIGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgICAgICB2YXIgZWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIHRvIGhhdmUgY2xhc3MgI3tleHB9J1xuICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyBub3QgdG8gaGF2ZSBjbGFzcyAje2V4cH0nXG4gICAgICAgICAgICAsIGNsYXNzTmFtZVxuICAgICAgICApXG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaWQnLCBmdW5jdGlvbihpZCkge1xuICAgICAgICB2YXIgZWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgIGVsLmlkID09IGlkXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIHRvIGhhdmUgaWQgI3tleHB9J1xuICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyBub3QgdG8gaGF2ZSBpZCAje2V4cH0nXG4gICAgICAgICAgICAsIGlkXG4gICAgICAgIClcbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24uYWRkTWV0aG9kKCdodG1sJywgZnVuY3Rpb24oaHRtbCkge1xuICAgICAgICB2YXIgZWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKSwgYWN0dWFsID0gZmxhZyh0aGlzLCAnb2JqZWN0JykuaW5uZXJIVE1MXG5cbiAgICAgICAgaWYgKGZsYWcodGhpcywgJ2NvbnRhaW5zJykpIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgIGFjdHVhbC5pbmRleE9mKGh0bWwpID49IDBcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAje2FjdH0gdG8gY29udGFpbiBIVE1MICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAje2FjdH0gbm90IHRvIGNvbnRhaW4gSFRNTCAje2V4cH0nXG4gICAgICAgICAgICAgICAgLCBodG1sXG4gICAgICAgICAgICAgICAgLCBhY3R1YWxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgIGFjdHVhbCA9PT0gaHRtbFxuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKGVsKSArICcgdG8gaGF2ZSBIVE1MICN7ZXhwfSwgYnV0IHRoZSBIVE1MIHdhcyAje2FjdH0nXG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyBub3QgdG8gaGF2ZSBIVE1MICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAsIGh0bWxcbiAgICAgICAgICAgICAgICAsIGFjdHVhbFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgndHJpbW1lZCcsIG51bGwsIGZ1bmN0aW9uKCkge1xuICAgICAgICBmbGFnKHRoaXMsICd0cmltLXRleHQnLCB0cnVlKVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5hZGRNZXRob2QoJ3RleHQnLCBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKSwgY29udGFpbnMgPSBmbGFnKHRoaXMsICdjb250YWlucycpLFxuICAgICAgICAgICAgdHJpbSA9IGZsYWcodGhpcywgJ3RyaW0tdGV4dCcpLCBhY3R1YWwsIHJlc3VsdFxuXG4gICAgICAgIGlmIChpc05vZGVMaXN0KG9iaikpIHtcbiAgICAgICAgICAgIGFjdHVhbCA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChvYmosIGZ1bmN0aW9uKGVsKSB7IHJldHVybiB0cmltID8gZWwudGV4dENvbnRlbnQudHJpbSgpIDogZWwudGV4dENvbnRlbnQgfSlcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udGFpbnMgP1xuICAgICAgICAgICAgICAgICAgICB0ZXh0W2ZsYWcodGhpcywgJ25lZ2F0ZScpID8gJ3NvbWUnIDogJ2V2ZXJ5J10oZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwob2JqLCBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJpbSA/IGVsLnRleHRDb250ZW50LnRyaW0oKSA6IGVsLnRleHRDb250ZW50KSA9PT0gdFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICB1dGlscy5lcWwoYWN0dWFsLCB0ZXh0KVxuXG4gICAgICAgICAgICAgICAgYWN0dWFsID0gYWN0dWFsLmpvaW4oKVxuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LmpvaW4oKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhY3R1YWwgPSBhY3R1YWwuam9pbignJylcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjb250YWlucyA/IGFjdHVhbC5pbmRleE9mKHRleHQpID49IDAgOiBhY3R1YWwgPT09IHRleHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjdHVhbCA9IHRyaW0gPyBvYmoudGV4dENvbnRlbnQudHJpbSgpIDogb2JqLnRleHRDb250ZW50XG4gICAgICAgICAgICByZXN1bHQgPSBjb250YWlucyA/IGFjdHVhbC5pbmRleE9mKHRleHQpID49IDAgOiBhY3R1YWwgPT09IHRleHRcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvYmpEZXNjID0gZWxUb1N0cmluZyhvYmopLCB0ZXh0TXNnID0gdHJpbSA/ICd0cmltbWVkIHRleHQnIDogJ3RleHQnXG4gICAgICAgIGlmIChjb250YWlucykge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIG9iakRlc2MgKyAnIHRvIGNvbnRhaW4gI3tleHB9LCBidXQgdGhlICcgKyB0ZXh0TXNnICsgJyB3YXMgI3thY3R9J1xuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBvYmpEZXNjICsgJyBub3QgdG8gY29udGFpbiAje2V4cH0sIGJ1dCB0aGUgJyArIHRleHRNc2cgKyAnIHdhcyAje2FjdH0nXG4gICAgICAgICAgICAgICAgLCB0ZXh0XG4gICAgICAgICAgICAgICAgLCBhY3R1YWxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBvYmpEZXNjICsgJyB0byBoYXZlICcgKyB0ZXh0TXNnICsgJyAje2V4cH0sIGJ1dCB0aGUgJyArIHRleHRNc2cgKyAnIHdhcyAje2FjdH0nXG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIG9iakRlc2MgKyAnIG5vdCB0byBoYXZlICcgKyB0ZXh0TXNnICsgJyAje2V4cH0nXG4gICAgICAgICAgICAgICAgLCB0ZXh0XG4gICAgICAgICAgICAgICAgLCBhY3R1YWxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5hZGRNZXRob2QoJ3ZhbHVlJywgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIGVsID0gZmxhZyh0aGlzLCAnb2JqZWN0JyksIGFjdHVhbCA9IGZsYWcodGhpcywgJ29iamVjdCcpLnZhbHVlXG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgZmxhZyh0aGlzLCAnb2JqZWN0JykudmFsdWUgPT09IHZhbHVlXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIHRvIGhhdmUgdmFsdWUgI3tleHB9LCBidXQgdGhlIHZhbHVlIHdhcyAje2FjdH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIG5vdCB0byBoYXZlIHZhbHVlICN7ZXhwfSdcbiAgICAgICAgICAgICwgdmFsdWVcbiAgICAgICAgICAgICwgYWN0dWFsXG4gICAgICAgIClcbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlUHJvcGVydHkoJ2V4aXN0JywgZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICAgICAgaWYgKGlzTm9kZUxpc3Qob2JqKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICBvYmoubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCBhbiBlbXB0eSBOb2RlTGlzdCB0byBoYXZlIG5vZGVzJ1xuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgZXhpc3QnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZVByb3BlcnR5KCdlbXB0eScsIGZ1bmN0aW9uKF9zdXBlcikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KG9iaikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgb2JqLmNoaWxkcmVuLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBiZSBlbXB0eSdcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IGJlIGVtcHR5JylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlTGlzdChvYmopKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIG9iai5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gYmUgZW1wdHknXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBiZSBlbXB0eScpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKCdsZW5ndGgnLFxuICAgICAgICBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlTGlzdChvYmopIHx8IGlzSFRNTEVsZW1lbnQob2JqKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsTGVuZ3RoID0gb2JqLmNoaWxkcmVuID8gb2JqLmNoaWxkcmVuLmxlbmd0aCA6IG9iai5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxMZW5ndGggPT09IGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gaGF2ZSAje2V4cH0gY2hpbGRyZW4gYnV0IGl0IGhhZCAje2FjdH0gY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgaGF2ZSAje2V4cH0gY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICAsIGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLCBhY3R1YWxMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbihfc3VwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKVxuXG5cbiAgICBjaGFpLkFzc2VydGlvbi5vdmVyd3JpdGVNZXRob2QoJ21hdGNoJywgZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAgICAgICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAgICAgICBpZiAoaXNIVE1MRWxlbWVudChvYmopKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIG9iai5tYXRjaGVzKHNlbGVjdG9yKVxuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBtYXRjaCAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBtYXRjaCAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICwgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZUxpc3Qob2JqKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAoISFvYmoubGVuZ3RoICYmIEFycmF5LnByb3RvdHlwZS5ldmVyeS5jYWxsKG9iaiwgZnVuY3Rpb24oZWwpIHsgcmV0dXJuIGVsLm1hdGNoZXMoc2VsZWN0b3IpIH0pKVxuICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBtYXRjaCAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBtYXRjaCAje2V4cH0nXG4gICAgICAgICAgICAgICAgICAgICwgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKCdjb250YWluJyxcbiAgICAgICAgZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3ViaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KG9iaikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdWJpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgISFvYmoucXVlcnlTZWxlY3RvcihzdWJpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIGNvbnRhaW4gI3tleHB9J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIG5vdCBjb250YWluICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN1Yml0ZW0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouY29udGFpbnMoc3ViaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBjb250YWluICcgKyBlbFRvU3RyaW5nKHN1Yml0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IGNvbnRhaW4gJyArIGVsVG9TdHJpbmcoc3ViaXRlbSkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIClcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZGVzY2VuZGFudCcsIGZ1bmN0aW9uKHN1Yml0ZW0pIHtcbiAgICAgICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpLCBhY3R1YWwgPSBzdWJpdGVtXG5cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYWN0dWFsID0gb2JqLnF1ZXJ5U2VsZWN0b3Ioc3ViaXRlbSlcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgICAgICAgICEhYWN0dWFsXG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gaGF2ZSBkZXNjZW5kYW50ICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBub3QgaGF2ZSBkZXNjZW5kYW50ICN7ZXhwfSdcbiAgICAgICAgICAgICAgICAsIHN1Yml0ZW0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICBvYmouY29udGFpbnMoc3ViaXRlbSlcbiAgICAgICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhvYmopICsgJyB0byBjb250YWluICcgKyBlbFRvU3RyaW5nKHN1Yml0ZW0pXG4gICAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IGNvbnRhaW4gJyArIGVsVG9TdHJpbmcoc3ViaXRlbSkpXG4gICAgICAgIH1cblxuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBhY3R1YWwpXG4gICAgfSlcblxuICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZGVzY2VuZGFudHMnLCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JyksXG4gICAgICAgICAgICBhY3R1YWwgPSBvYmoucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICAhIWFjdHVhbC5sZW5ndGhcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICcgKyBlbFRvU3RyaW5nKG9iaikgKyAnIHRvIGhhdmUgZGVzY2VuZGFudHMgI3tleHB9J1xuICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcob2JqKSArICcgdG8gbm90IGhhdmUgZGVzY2VuZGFudHMgI3tleHB9J1xuICAgICAgICAgICAgLCBzZWxlY3RvcilcbiAgICAgICAgZmxhZyh0aGlzLCAnb2JqZWN0JywgYWN0dWFsKVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZGlzcGxheWVkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbCA9IGZsYWcodGhpcywgJ29iamVjdCcpLFxuICAgICAgICAgICAgYWN0dWFsID0gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCkgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZGlzcGxheSA6IGVsLnN0eWxlLmRpc3BsYXlcblxuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgIGFjdHVhbCAhPT0gJ25vbmUnXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIHRvIGJlIGRpc3BsYXllZCwgYnV0IGl0IHdhcyBub3QnXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIHRvIG5vdCBiZSBkaXNwbGF5ZWQsIGJ1dCBpdCB3YXMgYXMgJyArIGFjdHVhbFxuICAgICAgICAgICAgLCBhY3R1YWxcbiAgICAgICAgKVxuICAgIH0pXG5cbiAgICBjaGFpLkFzc2VydGlvbi5hZGRQcm9wZXJ0eSgndmlzaWJsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZWwgPSBmbGFnKHRoaXMsICdvYmplY3QnKSxcbiAgICAgICAgICAgIGFjdHVhbCA9IGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpID8gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLnZpc2liaWxpdHkgOiBlbC5zdHlsZS52aXNpYmlsaXR5XG5cbiAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBhY3R1YWwgIT09ICdoaWRkZW4nICYmIGFjdHVhbCAhPT0gJ2NvbGxhcHNlJ1xuICAgICAgICAgICAgLCAnZXhwZWN0ZWQgJyArIGVsVG9TdHJpbmcoZWwpICsgJyB0byBiZSB2aXNpYmxlLCBidXQgaXQgd2FzICcgKyAoYWN0dWFsID09PSAnaGlkZGVuJyA/ICdoaWRkZW4nIDogJ2NvbGxhcHNlZCcpXG4gICAgICAgICAgICAsICdleHBlY3RlZCAnICsgZWxUb1N0cmluZyhlbCkgKyAnIHRvIG5vdCBiZSB2aXNpYmxlLCBidXQgaXQgd2FzJ1xuICAgICAgICAgICAgLCBhY3R1YWxcbiAgICAgICAgKVxuICAgIH0pXG59IiwgIid1c2Ugc3RyaWN0JztcblxuXG5sZXQgYWRkZWROb2RlcywgbXV0YXRpb25vYnNlcnZlcjtcblxuZnVuY3Rpb24gaW5pdCgpIHtcblxuICAgIGFkZGVkTm9kZXMgPSBbXTtcbiAgICBtdXRhdGlvbm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9ucykge1xuICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHtcbiAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpIHtcblxuICAgICAgICAgICAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRlZE5vZGVzLnB1c2gobik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbn1cblxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3RpbmcoKSB7XG5cbiAgICBpZiAobXV0YXRpb25vYnNlcnZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluaXQoKVxuICAgIH1cblxuICAgIG11dGF0aW9ub2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyksIHtjaGlsZExpc3Q6IHRydWV9KTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cERPTUZyb21UZXN0aW5nKCkge1xuICAgIG11dGF0aW9ub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXG4gICAgZm9yIChjb25zdCBuIG9mIGFkZGVkTm9kZXMpIHtcbiAgICAgICAgbi5yZW1vdmUoKTtcbiAgICB9XG59IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0Jyb3dzZXIgPSBuZXcgRnVuY3Rpb24oXCJ0cnkge3JldHVybiB0aGlzPT09d2luZG93O31jYXRjaChlKXsgcmV0dXJuIGZhbHNlO31cIik7XG5cbmV4cG9ydCBjb25zdCBpc05vZGUgPSBuZXcgRnVuY3Rpb24oXCJ0cnkge3JldHVybiB0aGlzPT09Z2xvYmFsO31jYXRjaChlKXtyZXR1cm4gZmFsc2U7fVwiKTtcblxuXG4vKipcbiAqIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIGRvbSBzdGFjayBpbiB0aGUgbm9kZSBlbnZpcm9ubWVudFxuICpcbiAqIEByZXR1cm4ge1Byb21pc2U8dW5rbm93bj58UHJvbWlzZTx2b2lkPn1cbiAqL1xuZnVuY3Rpb24gaW5pdEpTRE9NKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3dbJ0RPTVBhcnNlciddKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICBjb25zdCBnID0gZ2V0R2xvYmFsKCk7XG5cbiAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCB7XG4gICAgICAgIHByZXRlbmRUb0JlVmlzdWFsOiB0cnVlLFxuICAgICAgICBjb250ZW50VHlwZTogXCJ0ZXh0L2h0bWxcIixcbiAgICAgICAgaW5jbHVkZU5vZGVMb2NhdGlvbnM6IHRydWUsXG4gICAgICAgIHN0b3JhZ2VRdW90YTogMTAwMDAwMDAsXG4gICAgICAgIHJ1blNjcmlwdHM6IFwiZGFuZ2Vyb3VzbHlcIixcbiAgICAgICAgcmVzb3VyY2VzOiBcInVzYWJsZVwiXG4gICAgfSwgb3B0aW9uc3x8e30pXG5cbiAgICByZXR1cm4gaW1wb3J0KFwianNkb21cIikudGhlbigoe0pTRE9NfSkgPT4ge1xuICAgICAgICBjb25zdCB7d2luZG93fSA9IG5ldyBKU0RPTShgPGh0bWw+XG48aGVhZD5cbjwvaGVhZD5cbjxib2R5PlxuPGRpdiBpZD1cIm1vY2tzXCI+PC9kaXY+XG48L2JvZHk+YCwgb3B0aW9ucyk7XG5cbiAgICAgICAgZ1snd2luZG93J10gPSB3aW5kb3c7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT5cbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICdzZWxmJyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ05vZGVMaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgJ0VsZW1lbnRJbnRlcm5hbHMnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTERvY3VtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxGb3JtRWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MSW5wdXRFbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxTZWxlY3RFbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxUZXh0QXJlYUVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnRG9jdW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnTm9kZScsXG4gICAgICAgICAgICAgICAgICAgICdTaGFkb3dSb290JyxcbiAgICAgICAgICAgICAgICAgICAgJ0V2ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbUV2ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0VsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTEVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnSFRNTERpdkVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnY3VzdG9tRWxlbWVudHMnLFxuICAgICAgICAgICAgICAgICAgICAnRG9jdW1lbnRGcmFnbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdET01QYXJzZXInLFxuICAgICAgICAgICAgICAgICAgICAnQ1NTU3R5bGVTaGVldCcsXG4gICAgICAgICAgICAgICAgICAgICdIVE1MU2NyaXB0RWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdNdXRhdGlvbk9ic2VydmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ0hUTUxUZW1wbGF0ZUVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnWE1MU2VyaWFsaXplcicsXG4gICAgICAgICAgICAgICAgICAgICdOb2RlRmlsdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ25hdmlnYXRvcicsXG4gICAgICAgICAgICAgICAgICAgICdJbnB1dEV2ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ0Jsb2InLFxuICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tRXZlbnQnXG4gICAgICAgICAgICAgICAgXS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGdba2V5XSA9IHdpbmRvd1trZXldXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG5cbiAgICB9KTtcbn1cblxuZXhwb3J0IHtpbml0SlNET019XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTdGF0ZVN5bWJvbH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbEZ1bmN0aW9ufSBmcm9tIFwiLi4vLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtcbiAgICBBVFRSSUJVVEVfQ0xBU1MsXG4gICAgQVRUUklCVVRFX0VSUk9STUVTU0FHRSxcbiAgICBBVFRSSUJVVEVfSUQsXG4gICAgQVRUUklCVVRFX1NSQyxcbiAgICBBVFRSSUJVVEVfVElUTEUsXG4gICAgQVRUUklCVVRFX1RZUEUsXG4gICAgVEFHX1NDUklQVFxufSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtLRVlfRE9DVU1FTlQsIEtFWV9RVUVSWSwgcmVmZXJlbmNlU3ltYm9sLCBSZXNvdXJjZX0gZnJvbSBcIi4uL3Jlc291cmNlLm1qc1wiO1xuXG5leHBvcnQge0RhdGF9XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRvIGVtYmVkIGRhdGEuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NLlJlc291cmNlXG4gKiBAc3VtbWFyeSBBIERhdGEgUmVzb3VyY2UgY2xhc3NcbiAqL1xuY2xhc3MgRGF0YSBleHRlbmRzIFJlc291cmNlIHtcblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlPWNvcnMgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL2ZldGNoXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWRlbnRpYWxzPXNhbWUtb3JpZ2luIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9mZXRjaFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlPWFwcGxpY2F0aW9uL2pzb24ge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci10eXBlfVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgc3VwZXIuZGVmYXVsdHMsIHtcbiAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2UuRGF0YX1cbiAgICAgKi9cbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYXBwZW5kcyB0aGUgSFRNTEVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBkb2N1bWVudFxuICAgICAqXG4gICAgICogdGhyb3dzIHtFcnJvcn0gdGFyZ2V0IG5vdCBmb3VuZFxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLlJlc291cmNlfVxuICAgICAqL1xuICAgIGNvbm5lY3QoKSB7XG5cbiAgICAgICAgaWYgKCEodGhpc1tyZWZlcmVuY2VTeW1ib2xdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kVG9Eb2N1bWVudC5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldFVSTEF0dHJpYnV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIEFUVFJJQlVURV9TUkNcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2UuRGF0YX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IGRvY3VtZW50ID0gc2VsZi5nZXRPcHRpb24oS0VZX0RPQ1VNRU5UKTtcbiAgICBzZWxmW3JlZmVyZW5jZVN5bWJvbF0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFRBR19TQ1JJUFQpO1xuXG4gICAgZm9yIChsZXQga2V5IG9mIFtBVFRSSUJVVEVfVFlQRSwgQVRUUklCVVRFX0lELCBBVFRSSUJVVEVfQ0xBU1MsIEFUVFJJQlVURV9USVRMRV0pIHtcbiAgICAgICAgaWYgKHNlbGYuZ2V0T3B0aW9uKGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2VsZltyZWZlcmVuY2VTeW1ib2xdW2tleV0gPSBzZWxmLmdldE9wdGlvbihrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG59XG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqIHRocm93cyB7RXJyb3J9IHRhcmdldCBub3QgZm91bmRcbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9Eb2N1bWVudCgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IHRhcmdldE5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGYuZ2V0T3B0aW9uKEtFWV9RVUVSWSwgJ2hlYWQnKSlcbiAgICBpZiAoISh0YXJnZXROb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0IG5vdCBmb3VuZCcpXG4gICAgfVxuXG4gICAgdGFyZ2V0Tm9kZS5hcHBlbmRDaGlsZChzZWxmW3JlZmVyZW5jZVN5bWJvbF0pO1xuXG4gICAgZ2V0R2xvYmFsRnVuY3Rpb24oJ2ZldGNoJykoc2VsZi5nZXRPcHRpb24oQVRUUklCVVRFX1NSQyksIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJywgLy8gKkdFVCwgUE9TVCwgUFVULCBERUxFVEUsIGV0Yy5cbiAgICAgICAgbW9kZTogc2VsZi5nZXRPcHRpb24oJ21vZGUnLCAnY29ycycpLCAvLyBuby1jb3JzLCAqY29ycywgc2FtZS1vcmlnaW5cbiAgICAgICAgY2FjaGU6ICduby1jYWNoZScsIC8vICpkZWZhdWx0LCBuby1jYWNoZSwgcmVsb2FkLCBmb3JjZS1jYWNoZSwgb25seS1pZi1jYWNoZWRcbiAgICAgICAgY3JlZGVudGlhbHM6IHNlbGYuZ2V0T3B0aW9uKCdjcmVkZW50aWFscycsICdzYW1lLW9yaWdpbicpLCAvLyBpbmNsdWRlLCAqc2FtZS1vcmlnaW4sIG9taXRcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0FjY2VwdCc6IHNlbGYuZ2V0T3B0aW9uKCd0eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKVxuICAgICAgICB9LFxuICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIG1hbnVhbCwgKmZvbGxvdywgZXJyb3JcbiAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlcicsIC8vIG5vLXJlZmVycmVyLCBcbiAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpXG5cblxuICAgIH0pLnRoZW4odGV4dCA9PiB7XG5cbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbiAgICAgICAgc2VsZltyZWZlcmVuY2VTeW1ib2xdLmFwcGVuZENoaWxkKHRleHROb2RlKTtcblxuICAgICAgICBzZWxmW2ludGVybmFsU3RhdGVTeW1ib2xdLmdldFN1YmplY3QoKVsnbG9hZGVkJ10gPSB0cnVlO1xuXG5cbiAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgc2VsZltpbnRlcm5hbFN0YXRlU3ltYm9sXS5zZXRTdWJqZWN0KHtcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGVycm9yOiBlLnRvU3RyaW5nKCksXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGFyZ2V0Tm9kZS5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0VSUk9STUVTU0FHRSwgZS50b1N0cmluZygpKTtcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNlbGY7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgY2hhaSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge0RhdGF9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3Jlc291cmNlL2RhdGEubWpzXCI7XG5pbXBvcnQge0RhdGFVcmx9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvZGF0YXVybC5tanNcIjtcbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaWQubWpzXCI7XG5pbXBvcnQge2NoYWlEb219IGZyb20gXCIuLi8uLi8uLi91dGlsL2NoYWktZG9tLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuXG5jaGFpLnVzZShjaGFpRG9tKTtcblxubGV0IGh0bWwxID0gYFxuXG5gO1xuXG5cbmRlc2NyaWJlKCdEYXRhJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IGZldGNoUmVmZXJlbmNlLCByZXR1cm5TdGF0dXMsIG11dGF0aW9ub2JzZXJ2ZXIsIGFkZGVkTm9kZXMgPSBbXTtcblxuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcblxuICAgICAgICByZXR1cm5TdGF0dXMgPSAyMDA7XG4gICAgICAgIGZldGNoUmVmZXJlbmNlID0gZ2xvYmFsVGhpc1snZmV0Y2gnXTtcbiAgICAgICAgZ2xvYmFsVGhpc1snZmV0Y2gnXSA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1cmwnKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJldHVyblN0YXR1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICB9O1xuXG5cbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgZ2xvYmFsVGhpc1snZmV0Y2gnXSA9IGZldGNoUmVmZXJlbmNlO1xuICAgICAgICBjbGVhbnVwRE9NRnJvbVRlc3RpbmcoKTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ0RhdGEoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3NldEV2ZW50VHlwZXMoKScsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRGF0YSh7XG4gICAgICAgICAgICAgICAgc3JjOiBuZXcgRGF0YVVybCgnJywgJ3RleHQvamF2YXNjcmlwdCcpLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkYXRhLmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdFeHRlcm5hbCBEYXRhJywgKCkgPT4ge1xuXG4gICAgICAgIGxldCBpZCA9IG5ldyBJRCgnZGF0YScpLnRvU3RyaW5nKCk7XG4gICAgICAgIGxldCBzZXJ2ZXIsIGRhdGEsIHVybCA9ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL2VtcHR5LmpzPycgKyBpZDtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhKHtcbiAgICAgICAgICAgICAgICBzcmM6IHVybCxcbiAgICAgICAgICAgICAgICBpZDogaWRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkYXRhIGlzIG5vdCBjb25uZWN0ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBleHBlY3QoZGF0YS5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnY29ubmVjdCBhbmQgY2hlY2sgYXZhaWxhYmlsaXR5JywgKGRvbmUpID0+IHtcblxuICAgICAgICAgICAgZGF0YS5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRhdGEuaXNDb25uZWN0ZWQoKSwgJ2lzQ29ubmVjdGVkIDEnKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIl0nKSwgJ2V4aXN0cyAxJykudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnBhcmVudEVsZW1lbnQ7XG5cblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChkYXRhLmlzQ29ubmVjdGVkKCksICdpc0Nvbm5lY3RlZCAyJykudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPVwiYXBwbGljYXRpb24vanNvblwiXScpLCAnZXhpc3RzIDInKS5ub3QudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBkYXRhLmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRhdGEuaXNDb25uZWN0ZWQoKSwgJ2lzQ29ubmVjdGVkIDMnKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3R5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCJdJyksICdleGlzdHMgMycpLnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPVwiYXBwbGljYXRpb24vanNvblwiXScpLCAnZXhpc3RzIDQnKS5ub3QudG8uZXhpc3Q7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkYXRhLmlzQ29ubmVjdGVkKCksICdpc0Nvbm5lY3RlZCA0JykudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbn0pOyIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBjaGFpIGZyb20gXCJjaGFpXCJcbmltcG9ydCB7TGlua30gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVzb3VyY2UvbGluay5tanNcIjtcbmltcG9ydCB7RGF0YVVybH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qc1wiO1xuaW1wb3J0IHtJRH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2NsZWFudXBET01Gcm9tVGVzdGluZywgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jbGVhbnVwZG9tLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5cbmNoYWkudXNlKGNoYWlEb20pO1xuXG5cblxuZGVzY3JpYmUoJ0xpbmsnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdMaW5rKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGltZW91dCg1MDAwKTtcblxuICAgICAgICBpdCgnY29ubmVjdCgpLmF2YWlsYWJsZSgpJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgY29uc3QgbGluayA9IG5ldyBMaW5rKHtcbiAgICAgICAgICAgICAgICBocmVmOiBuZXcgRGF0YVVybCgnJywgJ3RleHQvY3NzJykudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICByZWw6ICdzdHlsZXNoZWV0J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxpbmsuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuICAgICAgICB9KVxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0V4dGVybmFsIExpbmsnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMudGltZW91dCg1MDAwKTtcblxuICAgICAgICBsZXQgaWQgPSBuZXcgSUQoJ2xpbmsnKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgbGluaywgdXJsID0gJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvZW1wdHkuY3NzPycgKyBpZDtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgbGluayA9IG5ldyBMaW5rKHtcbiAgICAgICAgICAgICAgICBocmVmOiB1cmwsXG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIHJlbDogJ3N0eWxlc2hlZXQnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYXBwZW5kIGFuZCByZW1vdmUgTGluayAnLCAoZG9uZSkgPT4ge1xuXG4gICAgICAgICAgICBleHBlY3QobGluay5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgbGluay5jb25uZWN0KCkuYXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxpbmsuaXNDb25uZWN0ZWQoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS50by5leGlzdDtcblxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBleHBlY3QobGluay5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBsaW5rLmNvbm5lY3QoKS5hdmFpbGFibGUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGxpbmsuaXNDb25uZWN0ZWQoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tocmVmPVwiJyArIHVybCArICdcIl0nKSkudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2hyZWY9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChsaW5rLmlzQ29ubmVjdGVkKCkpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcblxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtcbiAgICBBVFRSSUJVVEVfQ0xBU1MsXG4gICAgQVRUUklCVVRFX0lELFxuICAgIEFUVFJJQlVURV9OT05DRSxcbiAgICBBVFRSSUJVVEVfU1JDLFxuICAgIEFUVFJJQlVURV9USVRMRSxcbiAgICBBVFRSSUJVVEVfVFlQRSxcbiAgICBUQUdfU0NSSVBUXG59IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge0tFWV9ET0NVTUVOVCwgcmVmZXJlbmNlU3ltYm9sLCBSZXNvdXJjZX0gZnJvbSBcIi4uL3Jlc291cmNlLm1qc1wiO1xuXG5leHBvcnQge1NjcmlwdH1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIHJlc291cmNlIG1hbmFnZXIgdG8gZW1iZWQgc2NyaXB0cy5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI1LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET00uUmVzb3VyY2VcbiAqIEBzdW1tYXJ5IEEgUmVzb3VyY2UgY2xhc3NcbiAqL1xuY2xhc3MgU2NyaXB0IGV4dGVuZHMgUmVzb3VyY2Uge1xuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBhc3luYz10cnVlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItYXN5bmN9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNyb3NzT3JpZ2luPWFub255bW91cyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3NjcmlwdCNhdHRyLWNyb3Nzb3JpZ2lufVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZGVmZXI9ZmFsc2Uge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1kZWZlcn1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaW50ZWdyaXR5IHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvc2NyaXB0I2F0dHItaW50ZWdyaXR5fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm9tb2R1bGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1ub21vZHVsZX1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gbm9uY2Uge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1ub25jZX1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVmZXJyZXJwb2xpY3kge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9zY3JpcHQjYXR0ci1yZWZlcnJlcnBvbGljeX1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L3NjcmlwdCNhdHRyLXR5cGV9XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXG4gICAgICAgICAgICBkZWZlcjogZmFsc2UsXG4gICAgICAgICAgICBpbnRlZ3JpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vbW9kdWxlOiBmYWxzZSxcbiAgICAgICAgICAgIG5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZWZlcnJlcnBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZS5TY3JpcHR9XG4gICAgICovXG4gICAgY3JlYXRlKCkge1xuICAgICAgICBjcmVhdGVFbGVtZW50LmNhbGwodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VVJMQXR0cmlidXRlKCkge1xuICAgICAgICByZXR1cm4gQVRUUklCVVRFX1NSQ1xuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZS5TY3JpcHR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCBkb2N1bWVudCA9IHNlbGYuZ2V0T3B0aW9uKEtFWV9ET0NVTUVOVCk7XG4gICAgc2VsZltyZWZlcmVuY2VTeW1ib2xdID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfU0NSSVBUKTtcblxuICAgIGZvciAobGV0IGtleSBvZiBbJ2Nyb3NzT3JpZ2luJywgJ2RlZmVyJywgJ2FzeW5jJywgJ2ludGVncml0eScsICdub21vZHVsZScsIEFUVFJJQlVURV9OT05DRSwgJ3JlZmVycmVycG9saWN5JywgQVRUUklCVVRFX1RZUEUsIEFUVFJJQlVURV9TUkMsIEFUVFJJQlVURV9JRCwgQVRUUklCVVRFX0NMQVNTLCBBVFRSSUJVVEVfVElUTEVdKSB7XG4gICAgICAgIGlmIChzZWxmLmdldE9wdGlvbihrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNlbGZbcmVmZXJlbmNlU3ltYm9sXVtrZXldID0gc2VsZi5nZXRPcHRpb24oa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcmV0dXJuIHNlbGY7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgY2hhaSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1NjcmlwdH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vcmVzb3VyY2Uvc2NyaXB0Lm1qc1wiO1xuaW1wb3J0IHtEYXRhVXJsfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2RhdGF1cmwubWpzXCI7XG5pbXBvcnQge0lEfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2lkLm1qc1wiO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7Y2xlYW51cERPTUZyb21UZXN0aW5nLCBpbml0TXV0YXRpb25PYnNlcnZlckZvclRlc3Rpbmd9IGZyb20gXCIuLi8uLi8uLi91dGlsL2NsZWFudXBkb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcblxuYDtcblxuXG5kZXNjcmliZSgnU2NyaXB0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZygpXG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGNsZWFudXBET01Gcm9tVGVzdGluZygpO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnU2NyaXB0KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzZXRFdmVudFR5cGVzKCknLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBuZXcgU2NyaXB0KHtcbiAgICAgICAgICAgICAgICBzcmM6IG5ldyBEYXRhVXJsKCcnLCAndGV4dC9qYXZhc2NyaXB0JykudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXG4gICAgICAgICAgICAgICAgZGVmZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGludGVncml0eTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG5vbW9kdWxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBub25jZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlZmVycmVycG9saWN5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY3JpcHQuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBzY3JpcHQuZ2V0T3B0aW9uKCdpZCcpXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG4gICAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnRXh0ZXJuYWwgSlMnLCAoKSA9PiB7XG5cbiAgICAgICAgbGV0IGlkID0gbmV3IElEKCdzY3JpcHQnKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgc2VydmVyLCBzY3JpcHQsIHVybCA9ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL2VtcHR5LmpzPycgKyBpZDtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgc2NyaXB0ID0gbmV3IFNjcmlwdCh7XG4gICAgICAgICAgICAgICAgc3JjOiB1cmwsXG4gICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICAgICAgY3Jvc3NPcmlnaW46ICdhbm9ueW1vdXMnLFxuICAgICAgICAgICAgICAgIGRlZmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbnRlZ3JpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBub21vZHVsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWZlcnJlcnBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnLFxuICAgICAgICAgICAgICAgIGlkOiBpZFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FwcGVuZCBhbmQgcmVtb3ZlIHNjcmlwdCAnLCAoZG9uZSkgPT4ge1xuXG4gICAgICAgICAgICBleHBlY3Qoc2NyaXB0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICBzY3JpcHQuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGV4cGVjdChzY3JpcHQuaXNDb25uZWN0ZWQoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3NyYz1cIicgKyB1cmwgKyAnXCJdJykpLnRvLmV4aXN0O1xuXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChzY3JpcHQuaXNDb25uZWN0ZWQoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tzcmM9XCInICsgdXJsICsgJ1wiXScpKS5ub3QudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3Qoc2NyaXB0LmlzQ29ubmVjdGVkKCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbc3JjPVwiJyArIHVybCArICdcIl0nKSkudG8uZXhpc3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW3NyYz1cIicgKyB1cmwgKyAnXCJdJykpLm5vdC50by5leGlzdDtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHNjcmlwdC5pc0Nvbm5lY3RlZCgpKS50by5iZS5mYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGNoYWkgZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtVcGRhdGVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS91cGRhdGVyLm1qc1wiO1xuaW1wb3J0IHtJRH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge1Byb3h5T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcbiAgICA8dGVtcGxhdGUgaWQ9XCJjdXJyZW50XCI+XG4gICAgICAgIDxsaSBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6Y3VycmVudCB8IHRvanNvblwiPjwvbGk+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICAgICAgPHVsIGRhdGEtbW9uc3Rlci1pbnNlcnQ9XCJjdXJyZW50IHBhdGg6YS5iXCI+XG4gICAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBpZD1cInRlc3QyXCI+XG4gICAgICAgIDx1bCBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwiY3VycmVudCBwYXRoOmEuYiB8IGRvaXRcIj5cbiAgICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwidGVzdDNcIj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cImNsYXNzIHBhdGg6YS5iXCI+XG4gICAgICAgICAgICA8aW5wdXQgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJ2YWx1ZSBwYXRoOmEuY1wiIGlkPVwiaW5wdXQxXCI+XG4gICAgICAgICAgICA8aW5wdXQgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjaGVja2VkIHBhdGg6YS5jaGVja2JveFwiIHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJjaGVja2JveFwiIGlkPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgIDxpbnB1dCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS50ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidGV4dFwiIGlkPVwidGV4dFwiPlxuICAgICAgICAgICAgPGlucHV0IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2hlY2tlZCBwYXRoOmEucmFkaW9cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInIxXCIgaWQ9XCJyYWRpb1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJyYWRpb1wiIHZhbHVlPVwicjJcIiBpZD1cInIyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInJhZGlvXCIgdmFsdWU9XCJyeFwiIGlkPVwicnhcIj5cblxuICAgICAgICAgICAgPHNlbGVjdCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS5zZWxlY3RcIiBuYW1lPVwic2VsZWN0XCIgaWQ9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3RoZXItdmFsdWVcIj52YWx1ZTE8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxzZWxlY3QgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJ2YWx1ZSBwYXRoOmEubXVsdGlzZWxlY3RcIiBuYW1lPVwibXVsdGlzZWxlY3RcIiBtdWx0aXBsZSBpZD1cIm11bHRpc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTE8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3RoZXItdmFsdWU1XCI+dmFsdWU1PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cblxuICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9XCJ0ZXh0YXJlYVwiIGlkPVwidGV4dGFyZWFcIiBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS50ZXh0YXJlYVwiPjwvdGV4dGFyZWE+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbmA7XG5cbmxldCBodG1sMiA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6dGV4dCB8IHRvbG93ZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInBhdGg6dGV4dCB8IGNhbGw6bXlmb3JtYXR0ZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcmVwbGFjZT1cInN0YXRpYzpoZWxsb1xcXFwgXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5gO1xuXG5sZXQgaHRtbDMgPSBgXG5cbiAgICA8dGVtcGxhdGUgaWQ9XCJteWlubmVyaWRcIj5cbiAgICAgICAgPHNwYW4gZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOm15aW5uZXJpZCB8IHRvanNvblwiPjwvc3Bhbj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlIGlkPVwibXlpZFwiPlxuICAgICAgICA8cCBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpbm5lcmlkIHBhdGg6YS5iXCI+PC9wPlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpZCBwYXRoOmEuYlwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG5gO1xuXG5sZXQgaHRtbDQgPSBgXG4gICAgPGRpdj5cbiAgICAgICAgPGZvcm0gaWQ9XCJmb3JtMVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwiY2hlY2tlZFwiIG5hbWU9XCJjaGVja2JveFwiIGRhdGEtbW9uc3Rlci1iaW5kPVwicGF0aDpzdGF0ZVwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInRleHRcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInIxXCIgaWQ9XCJyMVwiIGRhdGEtbW9uc3Rlci1iaW5kPVwicGF0aDpyYWRpb1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJyYWRpb1wiIHZhbHVlPVwicjJcIiBpZD1cInIyXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnJhZGlvXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInJhZGlvXCIgdmFsdWU9XCJyeFwiIGlkPVwicnhcIiBkYXRhLWNvbW1lbnQ9XCJub3QgY2FsbGVkIGJlY2F1c2Ugbm8gYmluZCBhdHRyaWJ1dGVcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgbmFtZT1cImJ1dHRvblwiPlxuXG4gICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJzZWxlY3QxXCIgaWQ9XCJzZWxlY3QxXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUxPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTI8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJzZWxlY3QyXCIgbXVsdGlwbGUgaWQ9XCJzZWxlY3QyXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOm11bHRpc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTE8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlMjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+dmFsdWUzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbj52YWx1ZTQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPnZhbHVlNTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPVwidGV4dGFyZWFcIiBpZD1cInRleHRhcmVhXCIgZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOnRleHRhcmVhXCI+XG4gICAgICAgICAgICBcbiAgICAgICAgPC90ZXh0YXJlYT5cblxuICAgICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG5cbmA7XG5cblxuZGVzY3JpYmUoJ0RPTScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgndGVzdCBHZXR0ZXIgJiYgU2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3NldEV2ZW50VHlwZXMoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpXG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBVcGRhdGVyKGVsZW1lbnQpLnNldEV2ZW50VHlwZXMoWyd0b3VjaCddKSkudG8uYmUuaW5zdGFuY2VvZihVcGRhdGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpdCgnZ2V0U3ViamVjdCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBsZXQgc3ViamVjdCA9IHthOiAxfTtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFVwZGF0ZXIoZWxlbWVudCwgc3ViamVjdCkuZ2V0U3ViamVjdCgpLmEpLnRvLmJlLmVxdWFsKDEpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3Rlc3QgY29udHJvbCBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2VuYWJsZUV2ZW50UHJvY2Vzc2luZygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFVwZGF0ZXIoZWxlbWVudCkuZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCkpLnRvLmJlLmluc3RhbmNlb2YoVXBkYXRlcik7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnZGlzYWJsZUV2ZW50UHJvY2Vzc2luZygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IFVwZGF0ZXIoZWxlbWVudCkuZGlzYWJsZUV2ZW50UHJvY2Vzc2luZygpKS50by5iZS5pbnN0YW5jZW9mKFVwZGF0ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ3Rlc3QgRXJyb3JzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCBFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IFVwZGF0ZXIoKSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB2YWx1ZSBpcyB3cm9uZycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IFVwZGF0ZXIoZWxlbWVudCwgbnVsbCkpLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgdGhyb3cgRXJyb3I6IHRoZSB2YWx1ZSBpcyBub3QgaXRlcmFibGUnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcblxuICAgICAgICAgICAgICAgIGxldCB1ID0gbmV3IFVwZGF0ZXIoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuXG4gICAgICAgICAgICAgICAgdS5ydW4oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJzaG91bGQgbmV2ZXIgY2FsbGVkIVwiKSk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGUpLmlzLmluc3RhbmNlT2YoRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZSArIFwiXCIpLnRvLmJlLmVxdWFsKCdFcnJvcjogdGhlIHZhbHVlIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZXIoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzY3JpYmUoJ25ldyBVcGRhdGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBkb2N1bWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjcmliZSgnUmVwZWF0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGJ1aWxkIDYgbGkgZWxlbWVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJylcblxuICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IFVwZGF0ZXIoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpOiAnMCd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aTogJzEnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2k6ICcyJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpOiAnMyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aTogJzQnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2k6ICc1J30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGQucnVuKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8bGkgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmEuYi4nICsgaSArICcgfCB0b2pzb25cIiBkYXRhLW1vbnN0ZXItaW5zZXJ0LXJlZmVyZW5jZT1cImN1cnJlbnQtJyArIGkgKyAnXCI+e1wiaVwiOlwiJyArIGkgKyAnXCJ9PC9saT4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChcbiAgICAgICAgICAgICAgICAgICAgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihlKSlcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVcGRhdGVyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWw0O1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdFdmVudGhhbmRsaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgdXBkYXRlciwgZm9ybTEsIHByb3h5b2JzZXJ2ZXI7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyID0gbmV3IFByb3h5T2JzZXJ2ZXIoe30pXG4gICAgICAgICAgICAgICAgdXBkYXRlciA9IG5ldyBVcGRhdGVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtMScpLCBwcm94eW9ic2VydmVyKTtcbiAgICAgICAgICAgICAgICBmb3JtMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtMScpO1xuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAvLyBoZXJlIGNsaWNrIGV2ZW50cyBhcmUgdGhyb3duIG9uIHRoZSBjaGVja2JveCBhbmQgdGhlIHNldHRpbmcgb2YgdGhlIHZhbHVlIGlzIG9ic2VydmVkIHZpYSB0aGUgcHJveHlvYnNlcnZlci5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIGNoZWNrYm94IGNsaWNrIGV2ZW50cycsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHN1YmplY3QgPSB1cGRhdGVyLmdldFN1YmplY3QoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc3ViamVjdCkuaXMuZXF1YWwocHJveHlvYnNlcnZlci5nZXRTdWJqZWN0KCkpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gWydjaGVja2VkJywgdW5kZWZpbmVkLCAnY2hlY2tlZCddO1xuICAgICAgICAgICAgICAgIC8vIGhlcmUgdGhlIG5vdGF0aW9uIHdpdGggZnVuY3Rpb24gaXMgaW1wb3J0YW50LCBiZWNhdXNlIHRoZSBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U3ViamVjdCgpWydzdGF0ZSddICE9PSBlKSBkb25lKG5ldyBFcnJvcih0aGlzLmdldFN1YmplY3QoKVsnc3RhdGUnXSArICcgc2hvdWxkICcgKyBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybTEucXVlcnlTZWxlY3RvcignW25hbWU9Y2hlY2tib3hdJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwKVxuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybTEucXVlcnlTZWxlY3RvcignW25hbWU9Y2hlY2tib3hdJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9LCAxMClcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSByYWRpbyBjbGljayBldmVudHMgMScsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgICAgICB1cGRhdGVyLmVuYWJsZUV2ZW50UHJvY2Vzc2luZygpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHN1YmplY3QgPSB1cGRhdGVyLmdldFN1YmplY3QoKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qoc3ViamVjdCkuaXMuZXF1YWwocHJveHlvYnNlcnZlci5nZXRTdWJqZWN0KCkpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gWydyMScsICdyMicsICdyMSddO1xuICAgICAgICAgICAgICAgIGxldCBjbGlja1RhcmdldHMgPSBbJ3IyJywgJ3IxJ11cbiAgICAgICAgICAgICAgICAvLyBoZXJlIHRoZSBub3RhdGlvbiB3aXRoIGZ1bmN0aW9uIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgdGhpcyBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmdldFN1YmplY3QoKVsncmFkaW8nXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IGUpIGRvbmUobmV3IEVycm9yKHYgKyAnIHNob3VsZCAnICsgZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjbGlja1RhcmdldHMuc2hpZnQoKSkuY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwKVxuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3IxJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9LCAxMClcblxuICAgICAgICAgICAgICAgIC8vIG5vIGhhbmRsZXIgLy8gYmluZFxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncngnKS5jbGljaygpO1xuICAgICAgICAgICAgICAgIH0sIDIwKVxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBzZWxlY3QgY2xpY2sgZXZlbnRzIDInLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0MScpO1xuXG4gICAgICAgICAgICAgICAgdXBkYXRlci5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHN1YmplY3QpLmlzLmVxdWFsKHByb3h5b2JzZXJ2ZXIuZ2V0U3ViamVjdCgpKTtcblxuICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IFsndmFsdWUyJywgJ3ZhbHVlMScsICd2YWx1ZTInXTtcbiAgICAgICAgICAgICAgICAvLyBoZXJlIHRoZSBub3RhdGlvbiB3aXRoIGZ1bmN0aW9uIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgdGhpcyBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmdldFN1YmplY3QoKVsnc2VsZWN0J107XG4gICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSBlKSBkb25lKG5ldyBFcnJvcih2ICsgJyBzaG91bGQgJyArIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4ID09PSAxID8gMCA6IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdmFsdWUgYW5kIHNpbXVsYXRlIGNsaWNrIGV2ZW50IGZvciBidWJibGVcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5zZWxlY3RlZEluZGV4ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5jbGljaygpO1xuXG4gICAgICAgICAgICAgICAgfSwgMjApXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSB0ZXh0YXJlYSBldmVudHMnLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRleHRhcmVhRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXh0YXJlYScpO1xuXG4gICAgICAgICAgICAgICAgdXBkYXRlci5lbmFibGVFdmVudFByb2Nlc3NpbmcoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHN1YmplY3QpLmlzLmVxdWFsKHByb3h5b2JzZXJ2ZXIuZ2V0U3ViamVjdCgpKTtcblxuICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IFsndGVzdFgnLCAnbG9yZW0gaXBzdW0nLCAnJ107XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RWYWx1ZXMgPSBbXCJsb3JlbSBpcHN1bVwiLCBcIlwiXTtcbiAgICAgICAgICAgICAgICAvLyBoZXJlIHRoZSBub3RhdGlvbiB3aXRoIGZ1bmN0aW9uIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGUgdGhpcyBwb2ludGVyIGlzIHNldC5cbiAgICAgICAgICAgICAgICBwcm94eW9ic2VydmVyLmF0dGFjaE9ic2VydmVyKG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBleHBlY3RlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdW5kZWZpbmVkICYmIGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ3RvIG1hbnkgY2FsbHMnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmdldFN1YmplY3QoKVsndGV4dGFyZWEnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHYpICE9PSBKU09OLnN0cmluZ2lmeShlKSkgZG9uZShuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodikgKyAnIHNob3VsZCAnICsgSlNPTi5zdHJpbmdpZnkoZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWFFbGVtZW50LnZhbHVlID0gdGVzdFZhbHVlcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRhcmVhRWxlbWVudC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCB2YWx1ZSBhbmQgc2ltdWxhdGUgY2xpY2sgZXZlbnQgZm9yIGJ1YmJsZVxuICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYUVsZW1lbnQudmFsdWUgPSBcInRlc3RYXCI7XG4gICAgICAgICAgICAgICAgICAgIHRleHRhcmVhRWxlbWVudC5jbGljaygpO1xuXG4gICAgICAgICAgICAgICAgfSwgMjApXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBzZWxlY3QgZXZlbnRzJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdDInKTtcblxuICAgICAgICAgICAgICAgIHVwZGF0ZXIuZW5hYmxlRXZlbnRQcm9jZXNzaW5nKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3ViamVjdCA9IHVwZGF0ZXIuZ2V0U3ViamVjdCgpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChzdWJqZWN0KS5pcy5lcXVhbChwcm94eW9ic2VydmVyLmdldFN1YmplY3QoKSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBbXG4gICAgICAgICAgICAgICAgICAgIFsndmFsdWUxJ10sXG4gICAgICAgICAgICAgICAgICAgIFsndmFsdWUyJywgJ3ZhbHVlMycsICd2YWx1ZTQnXSxcbiAgICAgICAgICAgICAgICAgICAgWyd2YWx1ZTEnLCAndmFsdWU0J10sXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGxldCB0ZXN0U2VsZWN0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICAgICAgICAgICAgW3RydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAgICAgLy8gaGVyZSB0aGUgbm90YXRpb24gd2l0aCBmdW5jdGlvbiBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgdGhlIHRoaXMgcG9pbnRlciBpcyBzZXQuXG4gICAgICAgICAgICAgICAgcHJveHlvYnNlcnZlci5hdHRhY2hPYnNlcnZlcihuZXcgT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBlID0gZXhwZWN0ZWQuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IHVuZGVmaW5lZCAmJiBleHBlY3RlZC5sZW5ndGggPT09IDApIGRvbmUobmV3IEVycm9yKCd0byBtYW55IGNhbGxzJykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdGhpcy5nZXRTdWJqZWN0KClbJ211bHRpc2VsZWN0J107XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHYpICE9PSBKU09OLnN0cmluZ2lmeShlKSkgZG9uZShuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkodikgKyAnIHNob3VsZCAnICsgSlNPTi5zdHJpbmdpZnkoZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSB0ZXN0U2VsZWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1swXS5zZWxlY3RlZCA9IHZbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzFdLnNlbGVjdGVkID0gdlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMl0uc2VsZWN0ZWQgPSB2WzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1szXS5zZWxlY3RlZCA9IHZbM107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQub3B0aW9uc1sxXS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMl0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzNdLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuY2xpY2soKTtcblxuICAgICAgICAgICAgICAgIH0sIDIwKVxuXG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cblxuICAgIGRlc2NyaWJlKCdVcGRhdGVyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwyO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdSZXBsYWNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGFkZCBsb3dlciBoZWxsbyBhbmQgSEVMTE95ZXMhJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpXG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IG5ldyBVcGRhdGVyKFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBcIkhBTExPXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBkLnNldENhbGxiYWNrKCdteWZvcm1hdHRlcicsIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhICsgJ3llcyEnXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkLnJ1bigpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCB0b2xvd2VyXCI+aGFsbG88L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCBjYWxsOm15Zm9ybWF0dGVyXCI+SEFMTE95ZXMhPC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwic3RhdGljOmhlbGxvXFxcXCBcIj5oZWxsbyA8L2Rpdj4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSwgMTAwKVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdVcGRhdGVyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwzO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdSZXBsYWNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkICcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKVxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2k6ICcwJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuXG4gICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPGRpdiBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpZCBwYXRoOmEuYlwiPicpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8cCBkYXRhLW1vbnN0ZXItaW5zZXJ0PVwibXlpbm5lcmlkIHBhdGg6YS5iXCIgZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJteWlkLTBcIj4nKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPHNwYW4gZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmEuYi4wIHwgdG9qc29uXCIgZGF0YS1tb25zdGVyLWluc2VydC1yZWZlcmVuY2U9XCJteWlubmVyaWQtMFwiPntcImlcIjpcIjBcIn08L3NwYW4+Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKFxuICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKGUpKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZXIoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzY3JpYmUoJ0F0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIGF0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QzJylcblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZXh0LnZhbHVlKS50by5iZS5lcXVhbChcIlwiKTtcblxuICAgICAgICAgICAgICAgIGxldCByYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYWRpbycpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHJhZGlvLmNoZWNrZWQpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrYm94JylcbiAgICAgICAgICAgICAgICBleHBlY3QoY2hlY2tib3guY2hlY2tlZCkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbGVjdCcpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHNlbGVjdC5zZWxlY3RlZEluZGV4KS50by5iZS5lcXVhbCgwKTtcblxuICAgICAgICAgICAgICAgIGxldCBtdWx0aXNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtdWx0aXNlbGVjdCcpXG4gICAgICAgICAgICAgICAgZXhwZWN0KG11bHRpc2VsZWN0LnNlbGVjdGVkSW5kZXgpLnRvLmJlLmVxdWFsKC0xKTtcblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXh0YXJlYScpXG4gICAgICAgICAgICAgICAgZXhwZWN0KHRleHRhcmVhLnZhbHVlKS50by5iZS5lcXVhbChcIlwiKTtcblxuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IFwiZGl2LWNsYXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCJoZWxsb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IFwiaGVsbG9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpbzogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWE6IFwidGVzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpc2VsZWN0OiBbJ3ZhbHVlMycsICd2YWx1ZTQnLCAnb3RoZXItdmFsdWU1J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0OiBcInZhbHVlMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94OiBcInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcblxuXG4gICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcblxuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJjbGFzcyBwYXRoOmEuYlwiIGNsYXNzPVwiZGl2LWNsYXNzXCI+Jyk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxpbnB1dCBkYXRhLW1vbnN0ZXItYXR0cmlidXRlcz1cInZhbHVlIHBhdGg6YS5jXCIgaWQ9XCJpbnB1dDFcIiB2YWx1ZT1cImhlbGxvXCI+Jyk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzx0ZXh0YXJlYSBuYW1lPVwidGV4dGFyZWFcIiBpZD1cInRleHRhcmVhXCIgZGF0YS1tb25zdGVyLWF0dHJpYnV0ZXM9XCJ2YWx1ZSBwYXRoOmEudGV4dGFyZWFcIiB2YWx1ZT1cInRlc3RcIj4nKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPGlucHV0IGRhdGEtbW9uc3Rlci1hdHRyaWJ1dGVzPVwiY2hlY2tlZCBwYXRoOmEucmFkaW9cIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwicmFkaW9cIiB2YWx1ZT1cInIxXCIgaWQ9XCJyYWRpb1wiIGNoZWNrZWQ9XCJ0cnVlXCI+Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRleHQudmFsdWUsICd0ZXh0IGNvbnRyb2wnKS50by5iZS5lcXVhbChkLmdldFN1YmplY3QoKVsnYSddWydjJ10pO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QocmFkaW8uY2hlY2tlZCwgJ3JhZGlvIGNvbnRyb2wnKS50by5iZS5lcXVhbCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRleHRhcmVhLnZhbHVlLCAndGV4dGFyZWEgY29udHJvbCcpLnRvLmJlLmVxdWFsKGQuZ2V0U3ViamVjdCgpWydhJ11bJ3RleHRhcmVhJ10pO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3Qoc2VsZWN0LnNlbGVjdGVkSW5kZXgsICdzZWxlY3QgY29udHJvbCcpLnRvLmJlLmVxdWFsKDEpOyAvLyBbMD0+b3RoZXItdmFsdWUsIDE9PnZhbHVlMl1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgbXVsdGlzZWxlY3RTZWxlY3RlZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIG9ial0gb2YgT2JqZWN0LmVudHJpZXMobXVsdGlzZWxlY3Quc2VsZWN0ZWRPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlzZWxlY3RTZWxlY3RlZE9wdGlvbnMucHVzaChvYmoudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkobXVsdGlzZWxlY3RTZWxlY3RlZE9wdGlvbnMpLCAnbXVsdGlzZWxlY3QgY29udHJvbCcpLnRvLmJlLmVxdWFsKEpTT04uc3RyaW5naWZ5KGQuZ2V0U3ViamVjdCgpWydhJ11bJ211bHRpc2VsZWN0J10pKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGNoZWNrYm94LmNoZWNrZWQsICdjaGVja2JveCBjb250cm9sJykudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoZSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0dldCBBdHRyaWJ1dGUgUGlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGlkLCBtb2NrcztcbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgaWQgPSBuZXcgSUQoJ21vbnN0ZXInKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGAgPGRpdiBpZD1cImAgKyBpZCArIGBcIlxuICAgICAgICAgICAgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmEgfCBpZjp2YWx1ZTpcXFxcIFwiPjwvZGl2PmBcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGluY2x1ZGUgc3BhY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZC50b1N0cmluZygpKVxuXG4gICAgICAgICAgICBjb25zdCBwaXBlID0gZGl2LmdldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLXJlcGxhY2UnKTtcbiAgICAgICAgICAgIGV4cGVjdChwaXBlLmxlbmd0aCkudG8uYmUuZXF1YWwoMjApO1xuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnbWFudWVsIHVwZGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGlkLCBtb2NrcztcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICBpZCA9IG5ldyBJRCgnbW9uc3RlcicpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgPGlucHV0IGlkPVwiYCArIGlkICsgYFwiZGF0YS1tb25zdGVyLWJpbmQ9XCJwYXRoOm15dmFsdWVcIj5gXG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3Nob3VsZCBnZXQgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS52YWx1ZSA9IFwiaGVsbG9cIjtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZXIgPSBuZXcgVXBkYXRlcihtb2Nrcyk7XG4gICAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gdXBkYXRlci5nZXRTdWJqZWN0KCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChzdWJqZWN0KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnbXl2YWx1ZScpO1xuICAgICAgICAgICAgdXBkYXRlci5yZXRyaWV2ZSgpO1xuICAgICAgICAgICAgZXhwZWN0KHN1YmplY3QpLnRvLmhhdmUucHJvcGVydHkoJ215dmFsdWUnKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICAvKipcbiAgICAgKiBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMTJcbiAgICAgKi9cbiAgICBkZXNjcmliZSgnVXBkYXRlcigpIDIwMjIwMTA3JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAvLyBsYW5ndWFnZT1IVE1MXG4gICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBgXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOmNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICBgO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdCdWdmaXggIzExMicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBhZGQgJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MID0gJ3llYWghIDxiPlRlc3Q8L2I+ISc7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJIVE1MID0gY29udGFpbmVyRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3SFRNTCA9IG5ld0VsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgVXBkYXRlcihcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogbmV3RWxlbWVudFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZC5ydW4oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGNvbnRhaW5lckVsZW1lbnQpLmNvbnRhaW4uaHRtbCgnPGRpdj55ZWFoISA8Yj5UZXN0PC9iPiE8L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LCAxMDApXG5cbiAgICAgICAgICAgICAgICAvLyBkLnNldENhbGxiYWNrKCdteWZvcm1hdHRlcicsIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBhICsgJ3llcyEnXG4gICAgICAgICAgICAgICAgLy8gfSlcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBkLnJ1bigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCB0b2xvd2VyXCI+aGFsbG88L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGV4cGVjdChlbGVtZW50KS5jb250YWluLmh0bWwoJzxkaXYgZGF0YS1tb25zdGVyLXJlcGxhY2U9XCJwYXRoOnRleHQgfCBjYWxsOm15Zm9ybWF0dGVyXCI+SEFMTE95ZXMhPC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBleHBlY3QoZWxlbWVudCkuY29udGFpbi5odG1sKCc8ZGl2IGRhdGEtbW9uc3Rlci1yZXBsYWNlPVwic3RhdGljOmhlbGxvXFxcXCBcIj5oZWxsbyA8L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfSkuY2F0Y2goXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihlKSlcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gfSwgMTAwKVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGNoYWkgZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtBVFRSSUJVVEVfT1BUSU9OU30gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtnZXREb2N1bWVudH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vdXRpbC5tanNcIjtcbmltcG9ydCB7Y2hhaURvbX0gZnJvbSBcIi4uLy4uL3V0aWwvY2hhaS1kb20ubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxubGV0IGV4cGVjdCA9IGNoYWkuZXhwZWN0O1xuY2hhaS51c2UoY2hhaURvbSk7XG5cbmxldCBodG1sMSA9IGBcbiAgICA8ZGl2IGlkPVwidGVzdDFcIj5cbiAgICA8L2Rpdj5cbmA7XG5cbmRlc2NyaWJlKCdET00nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgQ3VzdG9tQ29udHJvbCwgcmVnaXN0ZXJDdXN0b21FbGVtZW50LCBUZXN0Q29tcG9uZW50LCBkb2N1bWVudCwganNkb21GbGFnO1xuXG4gICAgZGVzY3JpYmUoJ0N1c3RvbUNvbnRyb2woKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy8ganNkb20gZG9lcyBub3Qgc3VwcG9ydCBFbGVtZW50SW50ZXJuYWxzXG4gICAgICAgICAgICAgICAganNkb21GbGFnID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcyhcImpzZG9tXCIpO1xuXG4gICAgICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCA9IG1bJ3JlZ2lzdGVyQ3VzdG9tRWxlbWVudCddO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9jdXN0b21jb250cm9sLm1qc1wiKS50aGVuKChtKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21Db250cm9sID0gbVsnQ3VzdG9tQ29udHJvbCddO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbXBvbmVudCA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tQ29udHJvbCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJtb25zdGVyLWN1c3RvbWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudChUZXN0Q29tcG9uZW50KVxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnY3JlYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gY3VzdG9tLWVsZW1lbnQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IFRlc3RDb21wb25lbnQoKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnY29ubmVjdCBlbXB0eSBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2RvY3VtZW50IHNob3VsZCBjb250YWluIG1vbnN0ZXItY3VzdG9tY29udHJvbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpLmFwcGVuZENoaWxkKGQpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbW9uc3Rlci1jdXN0b21jb250cm9sJykubGVuZ3RoKS5pcy5lcXVhbCgxKTtcbiAgICAgICAgICAgICAgICAvLyBubyBkYXRhLW1vbnN0ZXItb2JqZWN0bGluaz1cIlN5bWJvbChtb25zdGVyVXBkYXRlcilcIiBiZWNhdXNlIGl0IGhhcyBub3RoaW5nIHRvIHVwZGF0ZVxuICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci1jdXN0b21jb250cm9sPjwvbW9uc3Rlci1jdXN0b21jb250cm9sPicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdPcHRpb25zIGNoYW5nZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaXQoJ2RlbGVnYXRlc0ZvY3VzIHNob3VsZCBjaGFuZ2UgZnJvbSB0cnVlIHRvIGZhbHNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJylcblxuICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldE9wdGlvbignZGVsZWdhdGVzRm9jdXMnKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfT1BUSU9OUywgSlNPTi5zdHJpbmdpZnkoe2RlbGVnYXRlc0ZvY3VzOiBmYWxzZX0pKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRPcHRpb24oJ2RlbGVnYXRlc0ZvY3VzJykpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnVGVzdCBFbGVtZW50SW50ZXJuYWxzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgZm9ybTtcblxuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KCdmb3JtQXNzb2NpYXRlZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChkLmNvbnN0cnVjdG9yLmZvcm1Bc3NvY2lhdGVkKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGl0KCdmb3JtJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGpzZG9tRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gZC5mb3JtKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGQuZm9ybSkudG8uYmUuaW5zdGFuY2VvZihIVE1MRm9ybUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgndmFsdWUgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGQudmFsdWUpLnRvLnRocm93KEVycm9yKTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCd2YWx1ZSBzZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gZC52YWx1ZSA9IDQpLnRvLnRocm93KEVycm9yKTtcblxuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgaXQoJ3NldEZvcm1WYWx1ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIGlmIChqc2RvbUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGQuc2V0Rm9ybVZhbHVlKCkpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICBpdCgnbmFtZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZC5uYW1lKS50by5iZS5udWxsO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3R5cGUgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQudHlwZSkudG8uYmUuZXF1YWwoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3ZhbGlkaXR5IGdldHRlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcbiAgICAgICAgICAgICAgICBpZiAoanNkb21GbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBkLnZhbGlkaXR5KS50by50aHJvdyhFcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCd2YWxpZGF0aW9uTWVzc2FnZSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoanNkb21GbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBkLnZhbGlkaXR5KS50by50aHJvdyhFcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCd3aWxsVmFsaWRhdGUgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGpzZG9tRmxhZykge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gZC53aWxsVmFsaWRhdGUpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGl0KCdjaGVja1ZhbGlkaXR5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItY3VzdG9tY29udHJvbCcpO1xuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoanNkb21GbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBkLmNoZWNrVmFsaWRpdHkoKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgncmVwb3J0VmFsaWRpdHkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci1jdXN0b21jb250cm9sJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChkKTtcblxuICAgICAgICAgICAgICAgIGlmIChqc2RvbUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGQucmVwb3J0VmFsaWRpdHkoKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgIGl0KCdzZXRWYWxpZGl0eSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLWN1c3RvbWNvbnRyb2wnKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGQpO1xuICAgICAgICAgICAgICAgIGlmIChqc2RvbUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGQuc2V0VmFsaWRpdHkoKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkLnNldFZhbGlkaXR5KHsndmFsdWVNaXNzaW5nJzogdHJ1ZX0sIFwibXkgbWVzc2FnZVwiKSkudG8uYmUudW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxufSk7XG5cblxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vdHlwZXMvYmFzZS5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7Y2xvbmV9IGZyb20gXCIuLi91dGlsL2Nsb25lLm1qc1wiO1xuXG5leHBvcnQge0xvY2FsZSwgcGFyc2VMb2NhbGV9XG5cbi8qKlxuICogQG1lbWJlck9mIE1vbnN0ZXIuSTE4blxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgcHJvcGVydGllc1N5bWJvbCA9IFN5bWJvbCgncHJvcGVydGllcycpO1xuXG4vKipcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5JMThuXG4gKi9cbmNvbnN0IGxvY2FsZVN0cmluZ1N5bWJvbCA9IFN5bWJvbCgnbG9jYWxlU3RyaW5nJyk7XG5cbi8qKlxuICogVGhlIExvY2FsZSBjbGFzcyBpcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBsYW5ndWFnZSBjbGFzc2VzLlxuICpcbiAqIFJGQ1xuICpcbiAqIGBgYFxuICogQSBMYW5ndWFnZS1UYWcgY29uc2lzdHMgb2Y6XG4gKiBsYW5ndGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBnZW5lcmF0ZWQgdGFnXG4gKiAgICAgICAgICAgLW9yLSBwcml2YXRlLXVzZSAgICAgICAgOyBhIHByaXZhdGUgdXNlIHRhZ1xuICpcbiAqIGxhbmd0YWcgICAgICAgPSAobGFuZ3VhZ2VcbiAqICAgICAgICAgICAgICAgICAgICBbXCItXCIgc2NyaXB0XVxuICogICAgICAgICAgICAgICAgICAgIFtcIi1cIiByZWdpb25dXG4gKiAgICAgICAgICAgICAgICAgICAgKihcIi1cIiB2YXJpYW50KVxuICogICAgICAgICAgICAgICAgICAgICooXCItXCIgZXh0ZW5zaW9uKVxuICogICAgICAgICAgICAgICAgICAgIFtcIi1cIiBwcml2YXRldXNlXSlcbiAqXG4gKiBsYW5ndWFnZSAgICAgID0gXCJlblwiLCBcImFsZVwiLCBvciBhIHJlZ2lzdGVyZWQgdmFsdWVcbiAqXG4gKiBzY3JpcHQgICAgICAgID0gXCJMYXRuXCIsIFwiQ3lybFwiLCBcIkhhbnRcIiBJU08gMTU5MjQgY29kZXNcbiAqXG4gKiByZWdpb24gICAgICAgID0gXCJVU1wiLCBcIkNTXCIsIFwiRlJcIiBJU08gMzE2NiBjb2Rlc1xuICogICAgICAgICAgICAgICAgIFwiNDE5XCIsIFwiMDE5XCIsICBvciBVTiBNLjQ5IGNvZGVzXG4gKlxuICogdmFyaWFudCAgICAgICA9IFwicm96YWpcIiwgXCJuZWRpc1wiLCBcIjE5OTZcIiwgbXVsdGlwbGUgc3VidGFncyBjYW4gYmUgdXNlZCBpbiBhIHRhZ1xuICpcbiAqIGV4dGVuc2lvbiAgICAgPSBzaW5nbGUgbGV0dGVyIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgc3VidGFnczsgbW9yZSB0aGFuIG9uZSBleHRlbnNpb25cbiAqICAgICAgICAgICAgICAgICBtYXkgYmUgdXNlZCBpbiBhIGxhbmd1YWdlIHRhZ1xuICpcbiAqIHByaXZhdGUtdXNlICAgPSBcIngtXCIgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBzdWJ0YWdzLCBhcyBtYW55IGFzIGFyZSByZXF1aXJlZFxuICogICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGVzZSBjYW4gc3RhcnQgYSB0YWcgb3IgYXBwZWFyIGF0IHRoZSBlbmQgKGJ1dCBub3RcbiAqICAgICAgICAgICAgICAgICBpbiB0aGUgbWlkZGxlKVxuICogYGBgXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuSTE4blxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzMwNjZcbiAqL1xuY2xhc3MgTG9jYWxlIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlZ2lvbl1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NjcmlwdF1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhcmlhbnRzXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0bGFuZ11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ByaXZhdGVVc2VdXG4gICAgICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGxvY2FsZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxhbmd1YWdlLCByZWdpb24sIHNjcmlwdCwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW3Byb3BlcnRpZXNTeW1ib2xdID0ge1xuICAgICAgICAgICAgbGFuZ3VhZ2U6IChsYW5ndWFnZSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKGxhbmd1YWdlKSxcbiAgICAgICAgICAgIHNjcmlwdDogKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKHNjcmlwdCksXG4gICAgICAgICAgICByZWdpb246IChyZWdpb24gPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiB2YWxpZGF0ZVN0cmluZyhyZWdpb24pLFxuICAgICAgICAgICAgdmFyaWFudHM6ICh2YXJpYW50cyA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKHZhcmlhbnRzKSxcbiAgICAgICAgICAgIGV4dGxhbmc6IChleHRsYW5nID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogdmFsaWRhdGVTdHJpbmcoZXh0bGFuZyksXG4gICAgICAgICAgICBwcml2YXRlVXNlOiAocHJpdmF0ZVVzZSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IHZhbGlkYXRlU3RyaW5nKHByaXZhdGVVc2UpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBzID0gW107XG4gICAgICAgIGlmIChsYW5ndWFnZSAhPT0gdW5kZWZpbmVkKSBzLnB1c2gobGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoc2NyaXB0ICE9PSB1bmRlZmluZWQpIHMucHVzaChzY3JpcHQpO1xuICAgICAgICBpZiAocmVnaW9uICE9PSB1bmRlZmluZWQpIHMucHVzaChyZWdpb24pO1xuICAgICAgICBpZiAodmFyaWFudHMgIT09IHVuZGVmaW5lZCkgcy5wdXNoKHZhcmlhbnRzKTtcbiAgICAgICAgaWYgKGV4dGxhbmcgIT09IHVuZGVmaW5lZCkgcy5wdXNoKGV4dGxhbmcpO1xuICAgICAgICBpZiAocHJpdmF0ZVVzZSAhPT0gdW5kZWZpbmVkKSBzLnB1c2gocHJpdmF0ZVVzZSk7XG5cbiAgICAgICAgaWYgKHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGxvY2FsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1tsb2NhbGVTdHJpbmdTeW1ib2xdID0gcy5qb2luKCctJyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0IGxvY2FsZVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbbG9jYWxlU3RyaW5nU3ltYm9sXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGdldCBsYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydGllc1N5bWJvbF0ubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXQgcmVnaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0aWVzU3ltYm9sXS5yZWdpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXQgc2NyaXB0KCkge1xuICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0aWVzU3ltYm9sXS5zY3JpcHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXQgdmFyaWFudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnRpZXNTeW1ib2xdLnZhcmlhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9XG4gICAgICovXG4gICAgZ2V0IGV4dGxhbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnRpZXNTeW1ib2xdLmV4dGxhbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXQgcHJpdmF0ZVVzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydGllc1N5bWJvbF0ucHJpdmF0ZVZhbHVlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gXCJcIiArIHRoaXMubG9jYWxlU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJ1Y3R1cmUgaGFzIHRoZSBmb2xsb3dpbmc6IGxhbmd1YWdlLCBzY3JpcHQsIHJlZ2lvbiwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2VcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuSTE4bi5Mb2NhbGVNYXB9XG4gICAgICovXG4gICAgZ2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpc1twcm9wZXJ0aWVzU3ltYm9sXSlcbiAgICB9XG5cblxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvY2FsZU1hcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxhbmd1YWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2NyaXB0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVnaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFyaWFudHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHRsYW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJpdmF0ZVVzZVxuICogQG1lbWJlck9mIE1vbnN0ZXIuSTE4blxuICovXG5cbi8qKlxuICogUGFyc2UgbG9jYWwgYWNjb3JkaW5nIHRvIHJmYzQ2NDYgc3RhbmRhcmRcbiAqXG4gKiBMaW1pdGF0aW9uczogVGhlIHJlZ2V4IGNhbm5vdCBoYW5kbGUgbXVsdGlwbGUgdmFyaWFudHMgb3IgcHJpdmF0ZS5cbiAqXG4gKiBZb3UgY2FuIGNhbGwgdGhlIG1ldGhvZCB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLkkxOG4uY3JlYXRlTG9jYWxlKClgLlxuICpcbiAqIGBgYFxuICogPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+XG4gKiBpbXBvcnQge01vbnN0ZXJ9IGZyb20gJ0BzY2h1a2FpL21vbnN0ZXIvc291cmNlLy9tb25zdGVyLm1qcyc7XG4gKiBuZXcgTW9uc3Rlci5JMThuLmNyZWF0ZUxvY2FsZSgpXG4gKiA8L3NjcmlwdD5cbiAqIGBgYFxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyBpbnRlZ3JhdGUgdGhpcyBmdW5jdGlvbiBpbmRpdmlkdWFsbHkuXG4gKlxuICogYGBgXG4gKiA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAqIGltcG9ydCB7Y3JlYXRlTG9jYWxlfSBmcm9tICdAc2NodWthaS9tb25zdGVyL3NvdXJjZS9pMThuL2xvY2FsZS5tanMnO1xuICogY3JlYXRlTG9jYWxlKClcbiAqIDwvc2NyaXB0PlxuICogYGBgXG4gKlxuICogUkZDXG4gKlxuICogYGBgXG4gKiAgIFRoZSBzeW50YXggb2YgdGhlIGxhbmd1YWdlIHRhZyBpbiBBQk5GIFtSRkM0MjM0XSBpczpcbiAqXG4gKiAgIExhbmd1YWdlLVRhZyAgPSBsYW5ndGFnXG4gKiAgICAgICAgICAgICAgICAgLyBwcml2YXRldXNlICAgICAgICAgICAgIDsgcHJpdmF0ZSB1c2UgdGFnXG4gKiAgICAgICAgICAgICAgICAgLyBncmFuZGZhdGhlcmVkICAgICAgICAgIDsgZ3JhbmRmYXRoZXJlZCByZWdpc3RyYXRpb25zXG4gKlxuICogICBsYW5ndGFnICAgICAgID0gKGxhbmd1YWdlXG4gKiAgICAgICAgICAgICAgICAgICAgW1wiLVwiIHNjcmlwdF1cbiAqICAgICAgICAgICAgICAgICAgICBbXCItXCIgcmVnaW9uXVxuICogICAgICAgICAgICAgICAgICAgICooXCItXCIgdmFyaWFudClcbiAqICAgICAgICAgICAgICAgICAgICAqKFwiLVwiIGV4dGVuc2lvbilcbiAqICAgICAgICAgICAgICAgICAgICBbXCItXCIgcHJpdmF0ZXVzZV0pXG4gKlxuICogICBsYW5ndWFnZSAgICAgID0gKDIqM0FMUEhBIFsgZXh0bGFuZyBdKSA7IHNob3J0ZXN0IElTTyA2MzkgY29kZVxuICogICAgICAgICAgICAgICAgIC8gNEFMUEhBICAgICAgICAgICAgICAgICA7IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlXG4gKiAgICAgICAgICAgICAgICAgLyA1KjhBTFBIQSAgICAgICAgICAgICAgIDsgcmVnaXN0ZXJlZCBsYW5ndWFnZSBzdWJ0YWdcbiAqXG4gKiAgIGV4dGxhbmcgICAgICAgPSAqMyhcIi1cIiAzQUxQSEEpICAgICAgICAgOyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZVxuICpcbiAqICAgc2NyaXB0ICAgICAgICA9IDRBTFBIQSAgICAgICAgICAgICAgICAgOyBJU08gMTU5MjQgY29kZVxuICpcbiAqICAgcmVnaW9uICAgICAgICA9IDJBTFBIQSAgICAgICAgICAgICAgICAgOyBJU08gMzE2NiBjb2RlXG4gKiAgICAgICAgICAgICAgICAgLyAzRElHSVQgICAgICAgICAgICAgICAgIDsgVU4gTS40OSBjb2RlXG4gKlxuICogICB2YXJpYW50ICAgICAgID0gNSo4YWxwaGFudW0gICAgICAgICAgICA7IHJlZ2lzdGVyZWQgdmFyaWFudHNcbiAqICAgICAgICAgICAgICAgICAvIChESUdJVCAzYWxwaGFudW0pXG4gKlxuICogICBleHRlbnNpb24gICAgID0gc2luZ2xldG9uIDEqKFwiLVwiICgyKjhhbHBoYW51bSkpXG4gKlxuICogICBzaW5nbGV0b24gICAgID0gJXg0MS01NyAvICV4NTktNUEgLyAleDYxLTc3IC8gJXg3OS03QSAvIERJR0lUXG4gKiAgICAgICAgICAgICAgICAgOyBcImFcIi1cIndcIiAvIFwieVwiLVwielwiIC8gXCJBXCItXCJXXCIgLyBcIllcIi1cIlpcIiAvIFwiMFwiLVwiOVwiXG4gKiAgICAgICAgICAgICAgICAgOyBTaW5nbGUgbGV0dGVyczogeC9YIGlzIHJlc2VydmVkIGZvciBwcml2YXRlIHVzZVxuICpcbiAqICAgcHJpdmF0ZXVzZSAgICA9IChcInhcIi9cIlhcIikgMSooXCItXCIgKDEqOGFscGhhbnVtKSlcbiAqXG4gKiAgIGdyYW5kZmF0aGVyZWQgPSAxKjNBTFBIQSAxKjIoXCItXCIgKDIqOGFscGhhbnVtKSlcbiAqICAgICAgICAgICAgICAgICAgIDsgZ3JhbmRmYXRoZXJlZCByZWdpc3RyYXRpb25cbiAqICAgICAgICAgICAgICAgICAgIDsgTm90ZTogaSBpcyB0aGUgb25seSBzaW5nbGV0b25cbiAqICAgICAgICAgICAgICAgICAgIDsgdGhhdCBzdGFydHMgYSBncmFuZGZhdGhlcmVkIHRhZ1xuICpcbiAqICAgYWxwaGFudW0gICAgICA9IChBTFBIQSAvIERJR0lUKSAgICAgICA7IGxldHRlcnMgYW5kIG51bWJlcnNcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIEZpZ3VyZSAxOiBMYW5ndWFnZSBUYWcgQUJORlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZVxuICogQHJldHVybnMge0xvY2FsZX1cbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTQuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkkxOG5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgc3RyaW5nXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgbG9jYWxlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTG9jYWxlKGxvY2FsZSkge1xuXG4gICAgbG9jYWxlID0gdmFsaWRhdGVTdHJpbmcobG9jYWxlKS5yZXBsYWNlKC9fL2csIFwiLVwiKTtcblxuICAgIGxldCBsYW5ndWFnZSwgcmVnaW9uLCB2YXJpYW50cywgcGFydHMsIHNjcmlwdCwgZXh0bGFuZyxcbiAgICAgICAgcmVnZXhSZWd1bGFyID0gXCIoYXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby1ib2t8bm8tbnlufHpoLWd1b3l1fHpoLWhha2thfHpoLW1pbnx6aC1taW4tbmFufHpoLXhpYW5nKVwiLFxuICAgICAgICByZWdleElycmVndWxhciA9IFwiKGVuLUdCLW9lZHxpLWFtaXxpLWJubnxpLWRlZmF1bHR8aS1lbm9jaGlhbnxpLWhha3xpLWtsaW5nb258aS1sdXh8aS1taW5nb3xpLW5hdmFqb3xpLXB3bnxpLXRhb3xpLXRheXxpLXRzdXxzZ24tQkUtRlJ8c2duLUJFLU5MfHNnbi1DSC1ERSlcIixcbiAgICAgICAgcmVnZXhHcmFuZGZhdGhlcmVkID0gXCIoXCIgKyByZWdleElycmVndWxhciArIFwifFwiICsgcmVnZXhSZWd1bGFyICsgXCIpXCIsXG4gICAgICAgIHJlZ2V4UHJpdmF0ZVVzZSA9IFwiKHgoLVtBLVphLXowLTldezEsOH0pKylcIixcbiAgICAgICAgcmVnZXhTaW5nbGV0b24gPSBcIlswLTlBLVdZLVphLXd5LXpdXCIsXG4gICAgICAgIHJlZ2V4RXh0ZW5zaW9uID0gXCIoXCIgKyByZWdleFNpbmdsZXRvbiArIFwiKC1bQS1aYS16MC05XXsyLDh9KSspXCIsXG4gICAgICAgIHJlZ2V4VmFyaWFudCA9IFwiKFtBLVphLXowLTldezUsOH18WzAtOV1bQS1aYS16MC05XXszfSlcIixcbiAgICAgICAgcmVnZXhSZWdpb24gPSBcIihbQS1aYS16XXsyfXxbMC05XXszfSlcIixcbiAgICAgICAgcmVnZXhTY3JpcHQgPSBcIihbQS1aYS16XXs0fSlcIixcbiAgICAgICAgcmVnZXhFeHRsYW5nID0gXCIoW0EtWmEtel17M30oLVtBLVphLXpdezN9KXswLDJ9KVwiLFxuICAgICAgICByZWdleExhbmd1YWdlID0gXCIoKFtBLVphLXpdezIsM30oLVwiICsgcmVnZXhFeHRsYW5nICsgXCIpPyl8W0EtWmEtel17NH18W0EtWmEtel17NSw4fSlcIixcbiAgICAgICAgcmVnZXhMYW5ndGFnID0gXCIoXCIgKyByZWdleExhbmd1YWdlICsgXCIoLVwiICsgcmVnZXhTY3JpcHQgKyBcIik/XCIgKyBcIigtXCIgKyByZWdleFJlZ2lvbiArIFwiKT9cIiArIFwiKC1cIiArIHJlZ2V4VmFyaWFudCArIFwiKSpcIiArIFwiKC1cIiArIHJlZ2V4RXh0ZW5zaW9uICsgXCIpKlwiICsgXCIoLVwiICsgcmVnZXhQcml2YXRlVXNlICsgXCIpP1wiICsgXCIpXCIsXG4gICAgICAgIHJlZ2V4TGFuZ3VhZ2VUYWcgPSBcIl4oXCIgKyByZWdleEdyYW5kZmF0aGVyZWQgKyBcInxcIiArIHJlZ2V4TGFuZ3RhZyArIFwifFwiICsgcmVnZXhQcml2YXRlVXNlICsgXCIpJFwiLFxuICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhMYW5ndWFnZVRhZyksIG1hdGNoO1xuXG5cbiAgICBpZiAoKG1hdGNoID0gcmVnZXguZXhlYyhsb2NhbGUpKSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobWF0Y2guaW5kZXggPT09IHJlZ2V4Lmxhc3RJbmRleCkge1xuICAgICAgICAgICAgcmVnZXgubGFzdEluZGV4Kys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWF0Y2ggPT09IHVuZGVmaW5lZCB8fCBtYXRjaCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGxvY2FsZScpO1xuICAgIH1cblxuICAgIGlmIChtYXRjaFs2XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhbmd1YWdlID0gbWF0Y2hbNl07XG5cbiAgICAgICAgcGFydHMgPSBsYW5ndWFnZS5zcGxpdCgnLScpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGFuZ3VhZ2UgPSBwYXJ0c1swXTtcbiAgICAgICAgICAgIGV4dGxhbmcgPSBwYXJ0c1sxXTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKG1hdGNoWzE0XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlZ2lvbiA9IG1hdGNoWzE0XTtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hbMTJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NyaXB0ID0gbWF0Y2hbMTJdO1xuICAgIH1cblxuICAgIGlmIChtYXRjaFsxNl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXJpYW50cyA9IG1hdGNoWzE2XTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExvY2FsZShsYW5ndWFnZSwgcmVnaW9uLCBzY3JpcHQsIHZhcmlhbnRzLCBleHRsYW5nKTtcblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtwYXJzZUxvY2FsZX0gZnJvbSBcIi4uL2kxOG4vbG9jYWxlLm1qc1wiO1xuXG5pbXBvcnQge2dldERvY3VtZW50fSBmcm9tIFwiLi91dGlsLm1qc1wiO1xuXG5leHBvcnQge2dldExvY2FsZU9mRG9jdW1lbnR9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IERFRkFVTFRfTEFOR1VBR0UgPSAnZW4nO1xuXG4vKipcbiAqIFdpdGggdGhpcyBmdW5jdGlvbiB5b3UgY2FuIHJlYWQgdGhlIGxhbmd1YWdlIHZlcnNpb24gc2V0IGJ5IHRoZSBkb2N1bWVudC5cbiAqIEZvciB0aGlzIHRoZSBhdHRyaWJ1dGUgYGxhbmdgIGluIHRoZSBodG1sIHRhZyBpcyByZWFkLiBJZiBubyBhdHRyaWJ1dGUgaXMgc2V0LCBgZW5gIGlzIHVzZWQgYXMgZGVmYXVsdC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8aHRtbCBsYW5nPVwiZW5cIj5cbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgbmV3IE1vbnN0ZXIuRE9NLmdldExvY2FsZU9mRG9jdW1lbnQoKWAuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIGxvY2FsZVxuICogQHN1bW1hcnkgVHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBsb2NhbGUgdXNlZFxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVPZkRvY3VtZW50KCkge1xuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuXG4gICAgbGV0IGh0bWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJylcbiAgICBpZiAoaHRtbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGh0bWwuaGFzQXR0cmlidXRlKCdsYW5nJykpIHtcbiAgICAgICAgbGV0IGxvY2FsZSA9IGh0bWwuZ2V0QXR0cmlidXRlKCdsYW5nJyk7XG4gICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgcGFyc2VMb2NhbGUobG9jYWxlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlTG9jYWxlKERFRkFVTFRfTEFOR1VBR0UpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuaW1wb3J0IHtnZXRMb2NhbGVPZkRvY3VtZW50fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9sb2NhbGUubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmRlc2NyaWJlKCdBdHRyaWJ1dGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRMb2NhbGVPZkRvY3VtZW50JywgZnVuY3Rpb24gKCkge1xuXG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW1wiZGVcIl0sXG4gICAgICAgICAgICBbXCJzbC1JVC1uZWRpc1wiXSxcbiAgICAgICAgICAgIFtcImVuLUdCXCJdLFxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgICAgIGl0KCdyZXR1cm4gbGFuZ3VhZ2UgJyArIGEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJyk7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBodG1sLml0ZW0oMCk7XG5cbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnbGFuZycsIGEpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChnZXRMb2NhbGVPZkRvY3VtZW50KCkudG9TdHJpbmcoKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxufSkiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2dldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS91dGlsLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7VGhlbWUsIGdldERvY3VtZW50VGhlbWV9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3RoZW1lLm1qc1wiO1xuXG5kZXNjcmliZSgnVGhlbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25ldyBUaGVtZSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBUaGVtZSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRoZW1lKCdteS10aGVtZScpKS5pcy5hLmluc3RhbmNlT2YoVGhlbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gVGhlbWUtTmFtZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgVGhlbWUoJ215LXRoZW1lJykuZ2V0TmFtZSgpKS5pcy5lcXVhbCgnbXktdGhlbWUnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgRXJyb3IgYmVjYXVzZSBlbXB0eSBhcmd1bWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgVGhlbWUoKSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBFcnJvciBiZWNhdXNlIG5vIHN0cmluZyBhcmd1bWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgVGhlbWUoMikpLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0RG9jdW1lbnRUaGVtZSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBUaGVtZSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoZ2V0RG9jdW1lbnRUaGVtZSgpKS5pcy5hLmluc3RhbmNlT2YoVGhlbWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBEZWZhdWx0IFRoZW1lIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoZ2V0RG9jdW1lbnRUaGVtZSgpLmdldE5hbWUoKSkuaXMuZXF1YWwoJ21vbnN0ZXInKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXREb2N1bWVudFRoZW1lKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJykuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItdGhlbWUtbmFtZScsICd0ZXN0dGhlbWUnKTtcbiAgICAgICAgfSlcblxuICAgICAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyLXRoZW1lLW5hbWUnKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0ZXN0dGhlbWUgVGhlbWUgbmFtZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChnZXREb2N1bWVudFRoZW1lKCkuZ2V0TmFtZSgpKS5pcy5lcXVhbCgndGVzdHRoZW1lJyk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG59KTtcblxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtCYXNlV2l0aE9wdGlvbnN9IGZyb20gXCIuLi90eXBlcy9iYXNld2l0aG9wdGlvbnMubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbE9iamVjdH0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7aXNBcnJheX0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtBVFRSSUJVVEVfSFJFRiwgQVRUUklCVVRFX1NSQ30gZnJvbSBcIi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtSZXNvdXJjZX0gZnJvbSBcIi4vcmVzb3VyY2UubWpzXCI7XG5pbXBvcnQge0RhdGF9IGZyb20gXCIuL3Jlc291cmNlL2RhdGEubWpzXCI7XG5pbXBvcnQge1N0eWxlc2hlZXR9IGZyb20gXCIuL3Jlc291cmNlL2xpbmsvc3R5bGVzaGVldC5tanNcIjtcbmltcG9ydCB7U2NyaXB0fSBmcm9tIFwiLi9yZXNvdXJjZS9zY3JpcHQubWpzXCI7XG5cbmV4cG9ydCB7UmVzb3VyY2VNYW5hZ2VyfVxuXG4vKipcbiAqIFRoZSBSZXNvdXJjZU1hbmFnZXIgaXMgYSBzaW5nbGV0b24gdGhhdCBtYW5hZ2VzIGFsbCByZXNvdXJjZXMuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAc3VtbWFyeSBBIFJlc291cmNlIGNsYXNzXG4gKi9cbiBjbGFzcyBSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBCYXNlV2l0aE9wdGlvbnMge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIHRocm93IHtFcnJvcn0gdW5zdXBwb3J0ZWQgZG9jdW1lbnQgdHlwZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKCEodGhpcy5nZXRPcHRpb24oJ2RvY3VtZW50JykgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgZG9jdW1lbnQgdHlwZScpXG4gICAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGJhc2V1cmxcbiAgICAgKi9cbiAgICBnZXRCYXNlVVJMKCkge1xuICAgICAgICB0aGlzLmdldE9wdGlvbignZG9jdW1lbnQnKT8uYmFzZVVSTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7SFRNTERvY3VtZW50fSBkb2N1bWVudD1kb2N1bWVudCBEb2N1bWVudFxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSByZXNvdXJjZXNcbiAgICAgKiBAcHJvcGVydHkge0FycmF5fSByZXNvdXJjZXMuc2NyaXB0cz1bXSBhcnJheSB3aXRoIHtAbGluayBNb25zdGVyLkRPTS5SZXNvdXJjZS5TY3JpcHR9IG9iamVjdHNcbiAgICAgKiBAcHJvcGVydHkge0FycmF5fSByZXNvdXJjZXMuc3R5bGVzaGVldHM9W10gYXJyYXkgd2l0aCB7QGxpbmsgTW9uc3Rlci5ET00uUmVzb3VyY2UuTGluay5TdHlsZXNoZWV0fSBvYmplY3RzXG4gICAgICogQHByb3BlcnR5IHtBcnJheX0gcmVzb3VyY2VzLmRhdGE9W10gYXJyYXkgd2l0aCB7QGxpbmsgTW9uc3Rlci5ET00uUmVzb3VyY2UuRGF0YX0gb2JqZWN0c1xuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0R2xvYmFsT2JqZWN0KCdkb2N1bWVudCcpLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgICAgICAgICAgc2NyaXB0czogW10sXG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldHM6IFtdLFxuICAgICAgICAgICAgICAgIGRhdGE6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kIFRhZ3MgdG8gRE9NXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZU1hbmFnZXJ9XG4gICAgICogQHRocm93cyB7RXJyb3J9IHVuc3VwcG9ydGVkIHJlc291cmNlIGRlZmluaXRpb25cbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuICAgICAgICBydW5SZXNvdXJjZU1ldGhvZC5jYWxsKHRoaXMsICdjb25uZWN0Jyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGF2YWlsYWJsZVxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgcmVzb3VyY2UgZGVmaW5pdGlvblxuICAgICAqL1xuICAgIGF2YWlsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJ1blJlc291cmNlTWV0aG9kLmNhbGwodGhpcywgJ2F2YWlsYWJsZScpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBzY3JpcHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gICAgICogQHBhcmFtIFtPYmplY3R8dW5kZWZpbmVkfSBvcHRpb25zXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uUmVzb3VyY2VNYW5hZ2VyfVxuICAgICAqIEBzZWUgTW9uc3Rlci5ET00uUmVzb3VyY2UuU2NyaXB0XG4gICAgICovXG4gICAgYWRkU2NyaXB0KHVybCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYWRkUmVzb3VyY2UuY2FsbCh0aGlzLCAnc2NyaXB0cycsIHVybCwgb3B0aW9ucyk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBBZGQgU3R5bGVzaGVldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcbiAgICAgKiBAcGFyYW0gW09iamVjdHx1bmRlZmluZWR9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZU1hbmFnZXJ9XG4gICAgICogQHNlZSBNb25zdGVyLkRPTS5SZXNvdXJjZS5MaW5rLlN0eWxlc2hlZXRcbiAgICAgKi9cbiAgICBhZGRTdHlsZXNoZWV0KHVybCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYWRkUmVzb3VyY2UuY2FsbCh0aGlzLCAnc3R5bGVzaGVldHMnLCB1cmwsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBEYXRhIFRhZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VVJMfSB1cmxcbiAgICAgKiBAcGFyYW0gW09iamVjdHx1bmRlZmluZWR9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZU1hbmFnZXJ9XG4gICAgICogQHNlZSBNb25zdGVyLkRPTS5SZXNvdXJjZS5EYXRhXG4gICAgICovXG4gICAgYWRkRGF0YSh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGFkZFJlc291cmNlLmNhbGwodGhpcywgJ2RhdGEnLCB1cmwsIG9wdGlvbnMpO1xuICAgIH1cblxuXG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBydW5SZXNvdXJjZU1ldGhvZChtZXRob2QpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFsnc2NyaXB0cycsICdzdHlsZXNoZWV0cycsICdkYXRhJ10pIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gc2VsZi5nZXRPcHRpb24oJ3Jlc291cmNlcy4nICsgdHlwZSk7XG4gICAgICAgIGlmICghaXNBcnJheShyZXNvdXJjZXMpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIFJlc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgcmVzb3VyY2UgZGVmaW5pdGlvbicpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJlc291cmNlW21ldGhvZF0oKSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICogQHBhcmFtIFtPYmplY3R8dW5kZWZpbmVkfSBvcHRpb25zXG4gKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5SZXNvdXJjZU1hbmFnZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRSZXNvdXJjZSh0eXBlLCB1cmwsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmICh1cmwgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICAgICAgdXJsID0gdXJsLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICAgIGxldCByZXNvdXJjZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2NyaXB0cyc6XG4gICAgICAgICAgICByZXNvdXJjZSA9IG5ldyBTY3JpcHQoZXh0ZW5kKHt9LCBvcHRpb25zLCB7W0FUVFJJQlVURV9TUkNdOiB1cmx9KSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdHlsZXNoZWV0cyc6XG4gICAgICAgICAgICByZXNvdXJjZSA9IG5ldyBTdHlsZXNoZWV0KGV4dGVuZCh7fSwgb3B0aW9ucywge1tBVFRSSUJVVEVfSFJFRl06IHVybH0pKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICAgICAgcmVzb3VyY2UgPSBuZXcgRGF0YShleHRlbmQoe30sIG9wdGlvbnMsIHtbQVRUUklCVVRFX1NSQ106IHVybH0pKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHR5cGUgJyArIHR5cGUpXG4gICAgfVxuXG4gICAgKHNlbGYuZ2V0T3B0aW9uKCdyZXNvdXJjZXMnKT8uW3R5cGVdKS5wdXNoKHJlc291cmNlKTtcbiAgICByZXR1cm4gc2VsZjtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmltcG9ydCB7UmVzb3VyY2VNYW5hZ2VyfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9yZXNvdXJjZW1hbmFnZXIubWpzXCI7XG5pbXBvcnQge2NsZWFudXBET01Gcm9tVGVzdGluZywgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nfSBmcm9tIFwiLi4vLi4vdXRpbC9jbGVhbnVwZG9tLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5kZXNjcmliZSgnUmVzb3VyY2VNYW5hZ2VyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IGZldGNoUmVmZXJlbmNlLCByZXR1cm5TdGF0dXM7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFRoaXNbJ2ZldGNoJ10gPSBmZXRjaFJlZmVyZW5jZTtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgfSlcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZygpXG5cbiAgICAgICAgcmV0dXJuU3RhdHVzID0gMjAwO1xuICAgICAgICBmZXRjaFJlZmVyZW5jZSA9IGdsb2JhbFRoaXNbJ2ZldGNoJ107XG4gICAgICAgIGdsb2JhbFRoaXNbJ2ZldGNoJ10gPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG5cbiAgICAgICAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXJsJylcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiBcInRlc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXR1cm5TdGF0dXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnbmV3JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IFJlc291cmNlTWFuYWdlcigpIHNob3VsZCByZXR1cm4gUmVzb3VyY2VNYW5hZ2VyIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gbmV3IFJlc291cmNlTWFuYWdlcigpO1xuICAgICAgICAgICAgZXhwZWN0KGQpLnRvLmJlLmluc3RhbmNlT2YoUmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbG9hZCByZXNvdXJjZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IG1hbmFnZXI7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBtYW5hZ2VyID0gbmV3IFJlc291cmNlTWFuYWdlcigpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdhZGQgc2NyaXB0IHNob3VsZCBpbnN0YW5jZSBvZiBSZXNvdXJjZU1hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGRTY3JpcHQoJy9leGFtcGxlLmpzJykpLnRvLmJlLmluc3RhbmNlT2YoUmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FkZCBzdHlsZSBzaG91bGQgaW5zdGFuY2Ugb2YgUmVzb3VyY2VNYW5hZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkU3R5bGVzaGVldCgnL3N0eWxlLmpzJykpLnRvLmJlLmluc3RhbmNlT2YoUmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FkZCBkYXRhIHNob3VsZCBpbnN0YW5jZSBvZiBSZXNvdXJjZU1hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGREYXRhKCcvZGF0YS5qc29uJykpLnRvLmJlLmluc3RhbmNlT2YoUmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2Nvbm5lY3QgcmVzb3VyY2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2FkZCBzY3JpcHQgYW5kIGNvbm5lY3Qgc2hvdWxkIGluc3RhbmNlIG9mIFJlc291cmNlTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGRTY3JpcHQoJy9leGFtcGxlLmpzJykuY29ubmVjdCgpKS50by5iZS5pbnN0YW5jZU9mKFJlc291cmNlTWFuYWdlcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ2FkZCBzdHlsZSBhbmQgY29ubmVjdCBzaG91bGQgaW5zdGFuY2Ugb2YgUmVzb3VyY2VNYW5hZ2VyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZFN0eWxlc2hlZXQoJy9zdHlsZS5qcycpLmNvbm5lY3QoKSkudG8uYmUuaW5zdGFuY2VPZihSZXNvdXJjZU1hbmFnZXIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdhZGQgZGF0YSBhbmQgY29ubmVjdCAgc2hvdWxkIGluc3RhbmNlIG9mIFJlc291cmNlTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobWFuYWdlci5hZGREYXRhKCcvZGF0YS5qc29uJykuY29ubmVjdCgpKS50by5iZS5pbnN0YW5jZU9mKFJlc291cmNlTWFuYWdlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuXG4gICAgICAgIGRlc2NyaWJlKCdjaGVjayBhdmFpbGFiaWxpdHkgcmVzb3VyY2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2FkZCBzY3JpcHQgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eSBzaG91bGQgcmV0dXJuIFByb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuYWRkU2NyaXB0KCcvZXhhbXBsZS5qcycpLmF2YWlsYWJsZSgpKS50by5iZS5pbnN0YW5jZU9mKFByb21pc2UpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdhZGQgc3R5bGUgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eSBzaG91bGQgc2hvdWxkIHJldHVybiBQcm9taXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZFN0eWxlc2hlZXQoJy9zdHlsZS5qcycpLmF2YWlsYWJsZSgpKS50by5iZS5pbnN0YW5jZU9mKFByb21pc2UpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdhZGQgZGF0YSBhbmQgY2hlY2sgYXZhaWxhYmlsaXR5ICBzaG91bGQgc2hvdWxkIHJldHVybiBQcm9taXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmFkZERhdGEoJy9kYXRhLmpzb24nKS5hdmFpbGFibGUoKSkudG8uYmUuaW5zdGFuY2VPZihQcm9taXNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdjaGVjayBhdmFpbGFiaWxpdHkgZXhhbXBsZS5qc29uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ2FkZCBkYXRhIGFuZCBjaGVjayBjb250ZW50JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBtYW5hZ2VyLmFkZERhdGEoJ2h0dHBzOi8vZXhhbXBsZS5jb20vZXhhbXBsZS5qc29uJykuY29ubmVjdCgpLmF2YWlsYWJsZSgpLnRoZW4ociA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJykub3V0ZXJIVE1MKS5jb250YWlucygnPntcImFcIjpcInRlc3RcIn08L3NjcmlwdD48L2hlYWQ+Jyk7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcblxuICAgIH0pO1xuXG5cbn0pOyIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7XG4gICAgZ2V0RG9jdW1lbnQsIGdldFdpbmRvdywgZ2V0RG9jdW1lbnRGcmFnbWVudEZyb21TdHJpbmdcbn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vdXRpbC5tanNcIjtcblxuXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cblxuZGVzY3JpYmUoJ0RPTScsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBpbml0SlNET00oKTtcbiAgICB9KVxuICAgIGRlc2NyaWJlKCdnZXREb2N1bWVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBkb2N1bWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IGdldERvY3VtZW50KCk7XG4gICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0V2luZG93KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGRvY3VtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gZ2V0V2luZG93KCk7XG4gICAgICAgICAgICBleHBlY3QodHlwZW9mIGQpLmlzLmVxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0RG9jdW1lbnRGcmFnbWVudEZyb21TdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcblxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsnPGRpdj48L2Rpdj4nXSxcbiAgICAgICAgICAgIFsnPGRpdj48ZGl2PjI8L2Rpdj48L2Rpdj4nXSxcbiAgICAgICAgICAgIFsnPGRpdj48ZGl2PjI8L2Rpdj4nLCAnPGRpdj48ZGl2PjI8L2Rpdj48L2Rpdj4nXSwgLy8gdGVzdCBpbnZhbGlkIGh0bWxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpZiAoIWIpIGIgPSBhO1xuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBkb2N1bWVudEZyYWdtZW50IG9iamVjdCAnICsgYSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBmcmFnbWVudCA9IGdldERvY3VtZW50RnJhZ21lbnRGcm9tU3RyaW5nKGEpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChmcmFnbWVudCkudG8uYmUuaW5zdGFuY2VPZihEb2N1bWVudEZyYWdtZW50KTtcblxuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZGl2LmlubmVySFRNTCkudG8uYmUuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGNoYWkgZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge0FUVFJJQlVURV9PUFRJT05TfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2dldERvY3VtZW50fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS91dGlsLm1qc1wiO1xuaW1wb3J0IHtjaGFpRG9tfSBmcm9tIFwiLi4vLi4vdXRpbC9jaGFpLWRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuXG5sZXQgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpRG9tKTtcblxubGV0IGh0bWwxID0gYFxuICAgIDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgIDwvZGl2PlxuYDtcblxuXG5kZXNjcmliZSgnRE9NJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IEN1c3RvbUVsZW1lbnQsIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCwgVGVzdENvbXBvbmVudCwgZG9jdW1lbnQsIFRlc3RDb21wb25lbnQyO1xuXG4gICAgZGVzY3JpYmUoJ0N1c3RvbUVsZW1lbnQoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgaW1wb3J0KFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9jdXN0b21lbGVtZW50Lm1qc1wiKS50aGVuKChtKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbUVsZW1lbnQgPSBtWydDdXN0b21FbGVtZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQgPSBtWydyZWdpc3RlckN1c3RvbUVsZW1lbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb21wb25lbnQgPSBjbGFzcyBleHRlbmRzIEN1c3RvbUVsZW1lbnQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm1vbnN0ZXItdGVzdGNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudChUZXN0Q29tcG9uZW50KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29tcG9uZW50MiA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFRhZygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibW9uc3Rlci10ZXN0Y2xhc3MyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZGVmYXVsdHMoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vdGVzdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbjogJzxoMT48L2gxPjxhcnRpY2xlPjxwPnRlc3Q8L3A+PGRpdiBpZD1cImNvbnRhaW5lclwiPjwvZGl2PjwvYXJ0aWNsZT4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVzdENvbXBvbmVudDIpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnQ3VzdG9tRWxlbWVudCgpIHdpdGggQ29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJ3Nob3VsZCByZWFkIGNvbmZpZyBmcm9tIHRhZycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8c2NyaXB0IGlkPVwiY29uZmlnMVwiIHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCI+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImRlbW90ZXN0XCI6MTQyNVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8bW9uc3Rlci10ZXN0Y2xhc3MyIGlkPVwidGhpc2lzYXRlc3RcIiBkYXRhLW1vbnN0ZXItb3B0aW9ucy1zZWxlY3Rvcj1cIiNjb25maWcxXCI+XG4gICAgICAgICAgICAgICAgPC9tb25zdGVyLXRlc3RjbGFzczI+XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBtb25zdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoaXNpc2F0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG1vbnN0ZXIuZ2V0T3B0aW9uKCdkZW1vdGVzdCcpKS5pcy5lcWwoMTQyNSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2NyZWF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGN1c3RvbS1lbGVtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IG5ldyBUZXN0Q29tcG9uZW50KCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBkKS5pcy5lcXVhbCgnb2JqZWN0Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2Nvbm5lY3QgZW1wdHkgZWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdkb2N1bWVudCBzaG91bGQgY29udGFpbiBtb25zdGVyLXRlc3RjbGFzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdGVzdGNsYXNzJyk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJykuYXBwZW5kQ2hpbGQoZCk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdtb25zdGVyLXRlc3RjbGFzcycpLmxlbmd0aCkuaXMuZXF1YWwoMSk7XG4gICAgICAgICAgICAgICAgLy8gbm8gZGF0YS1tb25zdGVyLW9iamVjdGxpbms9XCJTeW1ib2wobW9uc3RlclVwZGF0ZXIpXCIgYmVjYXVzZSBpdCBoYXMgbm90aGluZyB0byB1cGRhdGVcbiAgICAgICAgICAgICAgICBleHBlY3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJykpLmNvbnRhaW4uaHRtbCgnPG1vbnN0ZXItdGVzdGNsYXNzPjwvbW9uc3Rlci10ZXN0Y2xhc3M+Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2Nvbm5lY3QgZWxlbWVudCB3aXRoIGh0bWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdCgnZG9jdW1lbnQgc2hvdWxkIGNvbnRhaW4gbW9uc3Rlci10ZXN0Y2xhc3MyJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21vbnN0ZXItdGVzdGNsYXNzMicpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpLmFwcGVuZENoaWxkKGQpO1xuXG4gICAgICAgICAgICAgICAgLy8gaW5zZXJ0IERPTSBydW4gaW4gZXh0cmEgcHJvY2VzcyB2aWEgc2V0VGltZW91dCFcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbW9uc3Rlci10ZXN0Y2xhc3MyJykubGVuZ3RoKS5pcy5lcXVhbCgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbW9uc3Rlci10ZXN0Y2xhc3MyJykuaXRlbSgwKS5zaGFkb3dSb290LmlubmVySFRNTCkuaXMuZXF1YWwoJzxoMT48L2gxPjxhcnRpY2xlPjxwPnRlc3Q8L3A+PGRpdiBpZD1cImNvbnRhaW5lclwiPjwvZGl2PjwvYXJ0aWNsZT4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKSkuY29udGFpbi5odG1sKCc8bW9uc3Rlci10ZXN0Y2xhc3MyIGRhdGEtbW9uc3Rlci1vYmplY3RsaW5rPVwiU3ltYm9sKG1vbnN0ZXJVcGRhdGVyKVwiPjwvbW9uc3Rlci10ZXN0Y2xhc3MyPicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSwgMTApO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ09wdGlvbnMgY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpdCgnZGVsZWdhdGVzRm9jdXMgc2hvdWxkIGNoYW5nZSBmcm9tIHRydWUgdG8gZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRlc3RjbGFzcycpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBvID0gZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0ucmVhbFN1YmplY3Q7XG4gICAgICAgICAgICAgICAgZXhwZWN0KE9iamVjdC5pcyhlbGVtZW50W2ludGVybmFsU3ltYm9sXS5yZWFsU3ViamVjdCwgbykpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0ucmVhbFN1YmplY3Qub3B0aW9ucy5kZWxlZ2F0ZXNGb2N1cykudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0uc3ViamVjdC5vcHRpb25zLmRlbGVnYXRlc0ZvY3VzKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldE9wdGlvbignZGVsZWdhdGVzRm9jdXMnKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoT2JqZWN0LmlzKGVsZW1lbnRbaW50ZXJuYWxTeW1ib2xdLnJlYWxTdWJqZWN0LCBvKSkudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9PUFRJT05TLCBKU09OLnN0cmluZ2lmeSh7ZGVsZWdhdGVzRm9jdXM6IGZhbHNlfSkpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChPYmplY3QuaXMoZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0ucmVhbFN1YmplY3QsIG8pKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0T3B0aW9uKCdkZWxlZ2F0ZXNGb2N1cycpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZWxlbWVudFtpbnRlcm5hbFN5bWJvbF0ucmVhbFN1YmplY3Qub3B0aW9ucy5kZWxlZ2F0ZXNGb2N1cykudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KE9iamVjdC5pcyhlbGVtZW50W2ludGVybmFsU3ltYm9sXS5yZWFsU3ViamVjdCwgbykpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICB9KVxuXG4gICAgICAgIGRlc2NyaWJlKCdzZXRPcHRpb25zKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydzaGFkb3dNb2RlJywgJ3gxJ10sXG4gICAgICAgICAgICAgICAgWyd0ZW1wbGF0ZXMubWFpbicsICd4MiddLCAvLyBpcyBleHBsaWNpdGx5IHNldCB0byB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBbJ2RlbGVnYXRlc0ZvY3VzJywgJ3g0J10sXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBuZXdWYWx1ZSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICAgICAgbGV0IHRleHQgPSBrZXkgKyAnIHNob3VsZCByZXR1cm4gJyArIG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBrZXkgKyAnIHdhcyBub3Qgc2V0LCB0aGVyZWZvcmUgZGVmYXVsdCAnICsgbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICBpdCh0ZXh0LCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRlc3RjbGFzcycpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZC5nZXRPcHRpb24oa2V5KSkudG8uYmUubm90LmVxdWFsKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHggPSBkLnNldE9wdGlvbihrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KGQuZ2V0T3B0aW9uKGtleSkpLnRvLmJlLmVxdWFsKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCdnZXRPcHRpb25zKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbJ3NoYWRvd01vZGUnLCAnb3BlbiddLFxuICAgICAgICAgICAgICAgIFsndGVtcGxhdGVzLm1haW4nLCB1bmRlZmluZWRdLCAvLyBpcyBleHBsaWNpdGx5IHNldCB0byB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBbJ2RlbGVnYXRlc0ZvY3VzJywgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgWyd4LnkueicsIHRydWUsIHRydWVdLCAvLyB4LnkueiBpc250IHNldCwgZGVmYXVsdFZhbHVlIGlzIHVzZWRcbiAgICAgICAgICAgICAgICBbJ3gnLCB0cnVlLCB0cnVlXSAvLyB4IGlzbnQgc2V0LCBkZWZhdWx0VmFsdWUgaXMgdXNlZFxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cblxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IGtleSArICcgc2hvdWxkIHJldHVybiAnICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBrZXkgKyAnIHdhcyBub3Qgc2V0LCB0aGVyZWZvcmUgZGVmYXVsdCAnICsgZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgaXQodGV4dCwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHggPSBkLmdldE9wdGlvbihrZXksIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh4KS50by5iZS5lcXVhbCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSlcblxuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMTNcbiAgICAgICAgICovXG4gICAgICAgIGRlc2NyaWJlKCdBc3NpZ24gQ1NTU3R5bGUgYXMgQXJyYXkgd2l0aCB3cm9uZyB0eXBlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCBodG1sVEFHID0gJ21vbnN0ZXItdGVzdGNsYXNzLXgxJztcblxuICAgICAgICAgICAgbGV0IG1vY2tzLCBUZXN0Q29tcG9uZW50WDE7XG4gICAgICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcblxuICAgICAgICAgICAgICAgIG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG5cblxuICAgICAgICAgICAgICAgIFRlc3RDb21wb25lbnRYMSA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbFRBR1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldENTU1N0eWxlU2hlZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RydWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGdldCBkZWZhdWx0cygpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW46ICc8aDE+dGVzdDwvaDE+J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVzdENvbXBvbmVudFgxKVxuXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KGh0bWxUQUcgKyBcIiBzaG91bGQgdGhyb3cgRXhjZXB0aW9uXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGh0bWxUQUcpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmQoZCk7XG5cblxuICAgICAgICAgICAgICAgIGV4cGVjdChkaXYpLmNvbnRhaW4uaHRtbCgnZGF0YS1tb25zdGVyLWVycm9yPVwiVHlwZUVycm9yOiB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQ1NTU3R5bGVTaGVldFwiJyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSlcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMTNcbiAgICAgICAgICovXG4gICAgICAgIGRlc2NyaWJlKCdBc3NpZ24gQ1NTU3R5bGUgYXMgQXJyYXkgYW5kIENTU1N0eWxlc2hlZXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWxUQUcgPSAnbW9uc3Rlci10ZXN0Y2xhc3MteDExMy0yJztcblxuICAgICAgICAgICAgbGV0IG1vY2tzLCBUZXN0Q29tcG9uZW50WDExM1gyO1xuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuXG4gICAgICAgICAgICAgICAgVGVzdENvbXBvbmVudFgxMTNYMiA9IGNsYXNzIGV4dGVuZHMgQ3VzdG9tRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUYWcoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbFRBR1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlczoge21haW46ICc8aDE+dGVzdDwvaDE+J30sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0Q1NTU3R5bGVTaGVldCgpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IChuZXcgQ1NTU3R5bGVTaGVldCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcy5pbnNlcnRSdWxlKCdhIHsgY29sb3IgOiByZWR9Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbc107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVzdENvbXBvbmVudFgxMTNYMilcblxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdChodG1sVEFHICsgXCIgc2hvdWxkIHRocm93IEV4Y2VwdGlvbiAyXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGh0bWxUQUcpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmQoZCk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZC5zaGFkb3dSb290LmlubmVySFRNTCkuaXMuZXEoJzxoMT50ZXN0PC9oMT4nKTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0bGFiLnNjaHVrYWkuY29tL29zcy9saWJyYXJpZXMvamF2YXNjcmlwdC9tb25zdGVyLy0vaXNzdWVzLzExM1xuICAgICAgICAgKi9cbiAgICAgICAgZGVzY3JpYmUoJ0Fzc2lnbiBDU1NTdHlsZSBhcyBBcnJheSBhbmQgQ1NTIGFzIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgY29uc3QgaHRtbFRBRyA9ICdtb25zdGVyLXRlc3RjbGFzcy14MTEzLTIxJztcblxuICAgICAgICAgICAgbGV0IG1vY2tzLCBUZXN0Q29tcG9uZW50WDExM1gyMjtcbiAgICAgICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBodG1sMTtcblxuICAgICAgICAgICAgICAgIFRlc3RDb21wb25lbnRYMTEzWDIyID0gY2xhc3MgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFRhZygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sVEFHXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzOiB7bWFpbjogJzxoMT50ZXN0PC9oMT4nfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhIHsgY29sb3I6cmVkIH0nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KFRlc3RDb21wb25lbnRYMTEzWDIyKVxuXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KGh0bWxUQUcgKyBcIiBzaG91bGQgZXEgPHN0eWxlPmEgeyBjb2xvcjpyZWQgfTwvc3R5bGU+PGgxPnRlc3Q8L2gxPlwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChodG1sVEFHKTtcblxuICAgICAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kKGQpO1xuXG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZC5zaGFkb3dSb290LmlubmVySFRNTCkuaXMuZXEoJzxzdHlsZT5hIHsgY29sb3I6cmVkIH08L3N0eWxlPjxoMT50ZXN0PC9oMT4nKTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGxhYi5zY2h1a2FpLmNvbS9vc3MvbGlicmFyaWVzL2phdmFzY3JpcHQvbW9uc3Rlci8tL2lzc3Vlcy8xMTNcbiAgICAgICAgICovXG4gICAgICAgIGRlc2NyaWJlKCdBc3NpZ24gQ1NTU3R5bGUgYXMgQXJyYXkgYW5kIENTUyBhcyBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWxUQUcgPSAnbW9uc3Rlci10ZXN0Y2xhc3MteDExMy0yMic7XG5cbiAgICAgICAgICAgIGxldCBtb2NrcywgVGVzdENvbXBvbmVudFgxMTNYMjIzO1xuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuXG4gICAgICAgICAgICAgICAgVGVzdENvbXBvbmVudFgxMTNYMjIzID0gY2xhc3MgZXh0ZW5kcyBDdXN0b21FbGVtZW50IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFRhZygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sVEFHXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzOiB7bWFpbjogJzxoMT50ZXN0PC9oMT4nfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRDU1NTdHlsZVNoZWV0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsnYSB7IGNvbG9yOnJlZCB9J107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoVGVzdENvbXBvbmVudFgxMTNYMjIzKVxuXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0KGh0bWxUQUcgKyBcIiBzaG91bGQgZXEgPHN0eWxlPmEgeyBjb2xvcjpyZWQgfTwvc3R5bGU+PGgxPnRlc3Q8L2gxPlwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChodG1sVEFHKTtcblxuICAgICAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kKGQpO1xuXG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZC5zaGFkb3dSb290LmlubmVySFRNTCkuaXMuZXEoJzxzdHlsZT5hIHsgY29sb3I6cmVkIH08L3N0eWxlPjxoMT50ZXN0PC9oMT4nKTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ2hhc05vZGUoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IG1vY2tzO1xuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdChcImhhc05vZGUgbW9uc3Rlci10ZXN0Y2xhc3Mgc2hvdWxkIHJldHVybiAuLi5cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbW9uc3Rlci10ZXN0Y2xhc3MnKTtcblxuICAgICAgICAgICAgICAgIGxldCBwMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcbiAgICAgICAgICAgICAgICBsZXQgdDEgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgndGVzdDEnKTtcbiAgICAgICAgICAgICAgICBwMS5hcHBlbmRDaGlsZCh0MSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ3Rlc3QnKTtcbiAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKHAxKTtcbiAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKHQpO1xuICAgICAgICAgICAgICAgIGQuYXBwZW5kQ2hpbGQocCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZChkKTtcblxuXG4gICAgICAgICAgICAgICAgbGV0IG4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZShuMSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUodCkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZShwKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHAxKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHQxKSkudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoXCJoYXNOb2RlIG1vbnN0ZXItdGVzdGNsYXNzMiBzaG91bGQgcmV0dXJuIC4uLlwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtb25zdGVyLXRlc3RjbGFzczInKTtcblxuICAgICAgICAgICAgICAgIGxldCBwMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcbiAgICAgICAgICAgICAgICBsZXQgdDEgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgndGVzdDEnKTtcbiAgICAgICAgICAgICAgICBwMS5hcHBlbmRDaGlsZCh0MSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ3Rlc3QnKTtcbiAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKHAxKTtcbiAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKHQpO1xuXG5cbiAgICAgICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QxJyk7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZChkKTtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZC5zaGFkb3dSb290LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKTtcblxuICAgICAgICAgICAgICAgIGQuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJykuYXBwZW5kQ2hpbGQocCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKG4xKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGQuaGFzTm9kZSh0KSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICBleHBlY3QoZC5oYXNOb2RlKHApKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUocDEpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIGV4cGVjdChkLmhhc05vZGUodDEpKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSlcblxuICAgIH0pO1xufSk7XG5cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuaW1wb3J0IHtcbiAgICBhZGRBdHRyaWJ1dGVUb2tlbixcbiAgICBhZGRUb09iamVjdExpbmssXG4gICAgY2xlYXJBdHRyaWJ1dGVUb2tlbnMsXG4gICAgY29udGFpbnNBdHRyaWJ1dGVUb2tlbixcbiAgICBmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlLFxuICAgIGZpbmRDbG9zZXN0T2JqZWN0TGluayxcbiAgICBnZXRMaW5rZWRPYmplY3RzLFxuICAgIGhhc09iamVjdExpbmssXG4gICAgcmVtb3ZlQXR0cmlidXRlVG9rZW4sXG4gICAgcmVtb3ZlT2JqZWN0TGluayxcbiAgICByZXBsYWNlQXR0cmlidXRlVG9rZW4sXG4gICAgdG9nZ2xlQXR0cmlidXRlVG9rZW4sXG4gICAgZmluZENsb3Nlc3RCeUNsYXNzXG59IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2F0dHJpYnV0ZXMubWpzXCI7XG5cbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxubGV0IGh0bWwxLCBodG1sMiwgaHRtbDM7XG5cbmRlc2NyaWJlKCdBdHRyaWJ1dGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGh0bWwxID0gYDxkaXYgaWQ9XCJ0ZXN0MVwiPjwvZGl2PmA7XG4gICAgICAgIGh0bWwyID0gYDxkaXYgaWQ9XCJ0ZXN0MVwiPlxuICAgIDxkaXYgaWQ9XCJzdWIxXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzdWIyXCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic3ViM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzdWI0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJzdWI1XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbmA7XG4gICAgICAgIFxuICAgICAgICBodG1sMyA9IGA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwidGVzdDFcIj5cbiAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwic3ViMVwiIGlkPVwiYTFcIiBjbGFzcz1cInN1YjFcIj5cbiAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cInN1YjJcIiBpZD1cImEyXCIgY2xhc3M9XCJzdWIyXCI+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwic3ViM1wiIGlkPVwiYTNcIiBjbGFzcz1cInN1YjNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtbW9uc3Rlci1yb2xlPVwic3ViNFwiIGlkPVwiYTRcIiBjbGFzcz1cInN1YjRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW1vbnN0ZXItcm9sZT1cInN1YjVcIiBpZD1cImE1XCIgY2xhc3M9XCJzdWI1XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbmA7XG5cblxuICAgICAgICBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ09iamVjdExpbmsnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sKCdteXRlc3QnKTtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDE7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBvYmplY3QtbGlua3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JqID0ge2E6IDF9O1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgIGV4cGVjdChoYXNPYmplY3RMaW5rKGVsZW1lbnQsIHN5bWJvbCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgYWRkVG9PYmplY3RMaW5rKGVsZW1lbnQsIHN5bWJvbCwgb2JqKTtcbiAgICAgICAgICAgIGV4cGVjdChoYXNPYmplY3RMaW5rKGVsZW1lbnQsIHN5bWJvbCkpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgIGxldCBvID0gZ2V0TGlua2VkT2JqZWN0cyhlbGVtZW50LCBzeW1ib2wpLm5leHQoKTtcbiAgICAgICAgICAgIGV4cGVjdChvLnZhbHVlKS50by5lcXVhbChvYmopO1xuXG4gICAgICAgICAgICByZW1vdmVPYmplY3RMaW5rKGVsZW1lbnQsIHN5bWJvbCk7XG4gICAgICAgICAgICBleHBlY3QoaGFzT2JqZWN0TGluayhlbGVtZW50LCBzeW1ib2wpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBnZXRMaW5rZWRPYmplY3RzKGVsZW1lbnQsIHN5bWJvbCkpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgfSlcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZmluZENsb3Nlc3RPYmplY3RMaW5rKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sKCdteXRlc3QnKTtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gaHRtbDI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBvYmplY3RsaW5rJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgc3ViNCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWI0JylcbiAgICAgICAgICAgIGxldCBzdWIyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YjInKVxuXG4gICAgICAgICAgICBsZXQgb2JqID0ge307XG5cbiAgICAgICAgICAgIGV4cGVjdChoYXNPYmplY3RMaW5rKHN1YjIsIHN5bWJvbCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgYWRkVG9PYmplY3RMaW5rKHN1YjIsIHN5bWJvbCwgb2JqKTtcbiAgICAgICAgICAgIGV4cGVjdChoYXNPYmplY3RMaW5rKHN1YjIsIHN5bWJvbCkpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gZmluZENsb3Nlc3RPYmplY3RMaW5rKHN1YjQpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQpLmlzLmluc3RhbmNlT2YoSFRNTERpdkVsZW1lbnQpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpKS50by5iZS5lcXVhbCgnc3ViMicpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnQXR0cmlidXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwzO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVzY3JpYmUoJ2ZpbmQgY2xvc2VzdCBBdHRyaWJ1dGVzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydhNScsICdkYXRhLW1vbnN0ZXItcm9sZScsIHVuZGVmaW5lZCwgJ3N1YjUnXSxcbiAgICAgICAgICAgICAgICBbJ2E1JywgJ2RhdGEtbW9uc3Rlci1yb2xlJywgJ3N1YjMnLCAnc3ViMyddLFxuICAgICAgICAgICAgICAgIFsnYTUnLCAnZGF0YS1tb25zdGVyLXJvbGUnLCAnc3ViMScsICdzdWIxJ10sXG4gICAgICAgICAgICAgICAgWydhNCcsICdkYXRhLW1vbnN0ZXItcm9sZScsICdzdWIxJywgJ3N1YjEnXSxcbiAgICAgICAgICAgICAgICBbJ2EzJywgJ2RhdGEtbW9uc3Rlci1yb2xlJywgJ3N1YjEnLCAnc3ViMSddLFxuICAgICAgICAgICAgICAgIFsnYTInLCAnZGF0YS1tb25zdGVyLXJvbGUnLCB1bmRlZmluZWQsICdzdWIyJ10sXG4gICAgICAgICAgICAgICAgWydhNScsICdkYXRhLW1vbnN0ZXItcm9sZScsICdzdWI1JywgJ3N1YjUnXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICAgICAgaXQoJ2ZpbmRDbG9zZXN0QnlBdHRyaWJ1dGUoJyArIGEgKyAnLCAnICsgYiArICcsJyArIGMgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChmaW5kQ2xvc2VzdEJ5QXR0cmlidXRlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLCBiLCBjKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9uc3Rlci1yb2xlJykpLnRvLmJlLmVxdWFsKGQpO1xuICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pOyBcbiAgICAgICAgXG4gICAgICAgIGRlc2NyaWJlKCdmaW5kIGNsb3Nlc3QgRWxlbWVudCB3aXRoIGNsYXNzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydhNScsICAnc3ViMycsICdzdWIzJ10sXG4gICAgICAgICAgICAgICAgWydhNScsICAnc3ViMScsICdzdWIxJ10sXG4gICAgICAgICAgICAgICAgWydhNCcsICAnc3ViMScsICdzdWIxJ10sXG4gICAgICAgICAgICAgICAgWydhMycsICAnc3ViMScsICdzdWIxJ10sXG4gICAgICAgICAgICAgICAgWydhNScsICAnc3ViNScsICdzdWI1J11cbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICAgICAgaXQoJ2ZpbmRDbG9zZXN0QnlDbGFzcygnICsgYSArICcsICcgKyBiICsgJykgc2hvdWxkIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoZmluZENsb3Nlc3RCeUNsYXNzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpLCBiKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvLmJlLmVxdWFsKGMpO1xuICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0F0dHJpYnV0ZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGh0bWwxO1xuICAgICAgICB9KVxuXG4gICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbW9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKTtcbiAgICAgICAgICAgIG1vY2tzLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgYXRyaWJ1dGVLZXkgPSAnZGF0YS10ZXN0JztcblxuICAgICAgICBpdCgndG9nZ2xlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCB2YWx1ZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSwgJ2FwcGxlIGJhbmFubmEnKVxuICAgICAgICAgICAgdG9nZ2xlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdwaW5hcHBsZScpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJ2FwcGxlIGJhbmFubmEgcGluYXBwbGUnKTtcbiAgICAgICAgICAgIHRvZ2dsZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAncGluYXBwbGUnKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCdhcHBsZSBiYW5hbm5hJyk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2FkZEF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdmFsdWUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgYWRkQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdwaW5hcHBsZScpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJ3BpbmFwcGxlJyk7XG4gICAgICAgICAgICBhZGRBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ2JhbmFubmEnKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCdwaW5hcHBsZSBiYW5hbm5hJyk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3JlbW92ZUF0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdmFsdWUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0cmlidXRlS2V5LCAnYXBwbGUgYmFuYW5uYSBsZW1tb24nKVxuICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdwaW5hcHBsZScpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJ2FwcGxlIGJhbmFubmEgbGVtbW9uJyk7XG4gICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ2JhbmFubmEnKTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCdhcHBsZSBsZW1tb24nKTtcblxuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdjb250YWluc0F0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGtleSwgdmFsdWUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdDEnKTtcbiAgICAgICAgICAgIGV4cGVjdChjb250YWluc0F0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAncGluYXBwbGUnKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSwgJ2FwcGxlIGJhbmFubmEnKVxuICAgICAgICAgICAgZXhwZWN0KGNvbnRhaW5zQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdwaW5hcHBsZScpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChjb250YWluc0F0dHJpYnV0ZVRva2VuKGVsZW1lbnQsIGF0cmlidXRlS2V5LCAnYmFuYW5uYScpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KGNvbnRhaW5zQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICdhcHBsZScpKS50by5iZS50cnVlO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJyByZXBsYWNlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwga2V5LCB2YWx1ZSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXksICdhcHBsZSBiYW5hbm5hIHRvbWF0bycpXG4gICAgICAgICAgICByZXBsYWNlQXR0cmlidXRlVG9rZW4oZWxlbWVudCwgYXRyaWJ1dGVLZXksICd0b21hdG8nLCAnbGVtbW9uJyk7XG4gICAgICAgICAgICBleHBlY3QoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXkpKS50by5iZS5lcXVhbCgnYXBwbGUgYmFuYW5uYSBsZW1tb24nKTtcbiAgICAgICAgICAgIHJlcGxhY2VBdHRyaWJ1dGVUb2tlbihlbGVtZW50LCBhdHJpYnV0ZUtleSwgJ2JhbmFubmEnLCAncGVhcicpO1xuICAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0cmlidXRlS2V5KSkudG8uYmUuZXF1YWwoJ2FwcGxlIHBlYXIgbGVtbW9uJyk7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ2NsZWFyQXR0cmlidXRlVG9rZW5zKGVsZW1lbnQsIGtleSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0MScpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXRyaWJ1dGVLZXksICdhcHBsZSBiYW5hbm5hJylcbiAgICAgICAgICAgIGNsZWFyQXR0cmlidXRlVG9rZW5zKGVsZW1lbnQsIGF0cmlidXRlS2V5KTtcbiAgICAgICAgICAgIGV4cGVjdChlbGVtZW50LmdldEF0dHJpYnV0ZShhdHJpYnV0ZUtleSkpLnRvLmJlLmVxdWFsKCcnKTtcblxuICAgICAgICB9KVxuXG5cbiAgICB9KVxufSkiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5pbXBvcnQge2ZpcmVFdmVudCwgZmluZFRhcmdldEVsZW1lbnRGcm9tRXZlbnQsIGZpcmVDdXN0b21FdmVudH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vZXZlbnRzLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5kZXNjcmliZSgnRXZlbnRzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5pdEpTRE9NKCk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdmaW5kIG9iamVjdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXInLCAnaGVsbG8nKTtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSBmaW5kVGFyZ2V0RWxlbWVudEZyb21FdmVudChldmVudCwgJ2RhdGEtbW9uc3RlcicpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChlLmdldEF0dHJpYnV0ZSgnZGF0YS1tb25zdGVyJykpLnRvLmJlLmVxdWFsKCdoZWxsbycpXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQoZGl2LCAnY2xpY2snKTtcbiAgICAgICAgICAgIH0sMClcbiAgICAgICAgICAgIFxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2ZpcmVFdmVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSBjbGljayBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGZpcmVFdmVudChkaXYsICdjbGljaycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGZpcmVFdmVudChkaXYsICd0b3VjaCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCBvbiBjb2xsZWN0aW9uJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCd0b3VjaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgICAgICAgICAgbGV0IGNvbGxlY3Rpb24gPSBkaXYucXVlcnlTZWxlY3RvckFsbCgnZGl2Jyk7XG5cblxuICAgICAgICAgICAgZmlyZUV2ZW50KGNvbGxlY3Rpb24sICd0b3VjaCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICAgICAgICAgIGxldCBjb2xsZWN0aW9uID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdicpO1xuXG5cbiAgICAgICAgICAgIGZpcmVFdmVudChjb2xsZWN0aW9uLCAndG91Y2gnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBmaXJlRXZlbnQoe30sICd0b3VjaCcpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgICAgICBcbiAgICAgICAgfSk7XG4gICAgfSk7ICAgXG4gICAgXG4gICAgZGVzY3JpYmUoJ2ZpcmVDdXN0b21FdmVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSBjbGljayBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGZpcmVDdXN0b21FdmVudChkaXYsICdjbGljaycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGZpcmVDdXN0b21FdmVudChkaXYsICd0b3VjaCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZpcmUgYSB0b3VjaCBldmVudCBvbiBjb2xsZWN0aW9uMScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2gnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKGUuZGV0YWlsLmRldGFpbCE9PSdoZWxsbyB3b3JsZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgnZXJyb3InKTsgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgICAgICAgICBsZXQgY29sbGVjdGlvbiA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdkaXYnKTtcblxuICAgICAgICAgICAgZmlyZUN1c3RvbUV2ZW50KGNvbGxlY3Rpb24sICd0b3VjaCcsIFwiaGVsbG8gd29ybGRcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaXQoJ3Nob3VsZCBmaXJlIGEgdG91Y2ggZXZlbnQgb24gY29sbGVjdGlvbjInLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZihlLmRldGFpbC5hIT09J2hlbGxvIHdvcmxkJykge1xuICAgICAgICAgICAgICAgICAgICBkb25lKCdlcnJvcicpOyAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICAgICAgICAgIGxldCBjb2xsZWN0aW9uID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdicpO1xuXG4gICAgICAgICAgICBmaXJlQ3VzdG9tRXZlbnQoY29sbGVjdGlvbiwgJ3RvdWNoJywge2E6XCJoZWxsbyB3b3JsZFwifSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmlyZSBhIHRvdWNoIGV2ZW50JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKCd0b3VjaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgICAgICAgICAgbGV0IGNvbGxlY3Rpb24gPSBkaXYucXVlcnlTZWxlY3RvckFsbCgnZGl2Jyk7XG5cblxuICAgICAgICAgICAgZmlyZUN1c3RvbUV2ZW50KGNvbGxlY3Rpb24sICd0b3VjaCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IGZpcmVDdXN0b21FdmVudCh7fSwgJ3RvdWNoJykpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxufSk7IiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7QmFzZX0gZnJvbSBcIi4uLy4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbCwgZ2V0R2xvYmFsRnVuY3Rpb259IGZyb20gXCIuLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2lzRnVuY3Rpb259IGZyb20gXCIuLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi8uLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtGYWN0b3J5fVxuXG4vKipcbiAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgd29ya2VyIGluc3RhbmNlcy5cbiAqIFxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NLldvcmtlclxuICogQHN1bW1hcnkgQSBzbWFsbCBmYWN0b3J5IHRvIGNyZWF0ZSB3b3JrZXJcbiAqL1xuY2xhc3MgRmFjdG9yeSBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSB7XG4gICAgICAgICAgICB3b3JrZXI6IG5ldyBXZWFrTWFwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgd29ya2VyIGZyb20gYSBVUkxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWVzc2FnZUhhbmRsZXJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlcnJvckhhbmRsZXJcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9XG4gICAgICovXG4gICAgY3JlYXRlRnJvbVVSTCA9IGZ1bmN0aW9uICh1cmwsIG1lc3NhZ2VIYW5kbGVyLCBlcnJvckhhbmRsZXIpIHtcblxuICAgICAgICBpZiAodXJsIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdvcmtlckNsYXNzID0gZ2V0R2xvYmFsRnVuY3Rpb24oJ1dvcmtlcicpO1xuICAgICAgICB2YXIgd29ya2VyID0gbmV3IHdvcmtlckNsYXNzKHZhbGlkYXRlU3RyaW5nKHVybCkpO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKG1lc3NhZ2VIYW5kbGVyKSkge1xuICAgICAgICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLmNhbGwod29ya2VyLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihlcnJvckhhbmRsZXIpKSB7XG4gICAgICAgICAgICB3b3JrZXIub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5jYWxsKHdvcmtlciwgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHdvcmtlciBmcm9tIGEgc2NyaXB0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1lc3NhZ2VIYW5kbGVyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZXJyb3JIYW5kbGVyXG4gICAgICogQHJldHVybiB7V29ya2VyfVxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZGUvZG9jcy9XZWIvQVBJL1VSTC9jcmVhdGVPYmplY3RVUkxcbiAgICAgKi9cbiAgICBjcmVhdGVGcm9tU2NyaXB0ID0gZnVuY3Rpb24gKGNvbnRlbnQsIG1lc3NhZ2VIYW5kbGVyLCBlcnJvckhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgYmxvYkZ1bmN0aW9uID0gbmV3IGdldEdsb2JhbEZ1bmN0aW9uKCdCbG9iJylcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBibG9iRnVuY3Rpb24oW3ZhbGlkYXRlU3RyaW5nKGNvbnRlbnQpXSwge3R5cGU6ICdzY3JpcHQvamF2YXNjcmlwdCd9KTtcblxuICAgICAgICBjb25zdCB1cmwgPSBnZXRHbG9iYWxGdW5jdGlvbignVVJMJykuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmNyZWF0ZUZyb21VUkwodXJsLCBtZXNzYWdlSGFuZGxlciwgZXJyb3JIYW5kbGVyKTtcblxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXVsnd29ya2VyJ10uc2V0KHdvcmtlciwgdXJsKTtcblxuICAgICAgICByZXR1cm4gd29ya2VyO1xuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlcm1pbmF0ZSB0aGUgd29ya2VyIGFuZCBjYWxsIHJldm9rZU9iamVjdFVSTCBpZiBuZWNlc3NhcnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd29ya2VyXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uV29ya2VyLkZhY3Rvcnl9XG4gICAgICovXG4gICAgdGVybWluYXRlKHdvcmtlcikge1xuXG4gICAgICAgIGNvbnN0IHdvcmtlckNsYXNzID0gZ2V0R2xvYmFsRnVuY3Rpb24oJ1dvcmtlcicpO1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKHdvcmtlciwgd29ya2VyQ2xhc3MpO1xuXG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcblxuICAgICAgICBpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF1bJ3dvcmtlciddLmhhcyh3b3JrZXIpKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzW2ludGVybmFsU3ltYm9sXVsnd29ya2VyJ10uZ2V0KHdvcmtlcik7XG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmltcG9ydCB7RmFjdG9yeX0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vd29ya2VyL2ZhY3RvcnkubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTSwgaXNOb2RlfSBmcm9tIFwiLi4vLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cbmRlc2NyaWJlKCdXb3JrZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxbJ1VSTCddLCAnY3JlYXRlT2JqZWN0VVJMJywge1xuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIi9leGFtcGxlLm1qc1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZ2xvYmFsWydXb3JrZXInXSA9IGNsYXNzIHtcbiAgICAgICAgICAgICAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG9uZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG9ubWVzc2FnZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYSA9IHR5cGVvZiBnbG9iYWxbJ1dvcmtlciddO1xuICAgICAgICAgICAgbGV0IGExID0gdHlwZW9mIFdvcmtlcjtcblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QganNkb20gPSBpbml0SlNET00oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnRmFjdG9yeScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnY3JlYXRlIHdvcmtlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXIgPSBmYWN0b3J5LmNyZWF0ZUZyb21TY3JpcHQoJ2NvbnNvbGUubG9nKFwiaGVsbG8gd29ybGRcIik7JylcbiAgICAgICAgICAgIGV4cGVjdCh3b3JrZXIpLmlzLmluc3RhbmNlb2YoV29ya2VyKTtcblxuICAgICAgICAgICAgZXhwZWN0KGZhY3RvcnkudGVybWluYXRlKHdvcmtlcikpLmlzLmluc3RhbmNlb2YoRmFjdG9yeSlcblxuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7QVRUUklCVVRFX1RIRU1FX05BTUV9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHtmaW5kRG9jdW1lbnRUZW1wbGF0ZSwgVGVtcGxhdGV9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3RlbXBsYXRlLm1qc1wiO1xuaW1wb3J0IHtpbml0SlNET019IGZyb20gXCIuLi8uLi91dGlsL2pzZG9tLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdUZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGluaXRKU0RPTSgpO1xuICAgIH0pXG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgIG1vY2tzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD1cIm15dGVtcGxhdGVcIj48L3RlbXBsYXRlPmA7XG4gICAgfSlcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGxldCBtb2NrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpO1xuICAgICAgICBtb2Nrcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnY3JlYXRlIEhUTUxGcmFnbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgW1xuICAgICAgICAgICAgW1wiPGRpdj5maXJzdDwvZGl2PjxkaXY+c2Vjb25kPC9kaXY+XCJdLFxuICAgICAgICAgICAgW1wiPGRpdj5maXJzdDwvZGl2PlwiXSxcbiAgICAgICAgICAgIFtcIjxkaXY+Zmlyc3Q8L2Rpdj48cD5zZWNvbmQ8L3A+XCJdXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCduZXcgVGVtcGxhdGUoKS5nZXROZXdEb2N1bWVudEZyYWdtZW50QXNTdHJpbmcoKSBzaG91bGQgcmV0dXJuIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGE7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBuZXcgVGVtcGxhdGUodGVtcGxhdGUpO1xuXG5cbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgICAgICAgICAgICBleHBlY3QoY29udGFpbmVyLmlubmVySFRNTCkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY3JlYXRlIGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IFRlbXBsYXRlKCkgc2hvdWxkIHJldHVybiBkb2N1bWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG5ldyBUZW1wbGF0ZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpKTtcbiAgICAgICAgICAgIGV4cGVjdChkKS50by5iZS5pbnN0YW5jZU9mKFRlbXBsYXRlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmdldFRlbXBsYXRlRWxlbWVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnbmV3IFRlbXBsYXRlKCkuZ2V0VGVtcGxhdGVFbGVtZW50KCkgc2hvdWxkIHJldHVybiBIVE1MVGVtcGxhdGVFbGVtZW50IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gbmV3IFRlbXBsYXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJykpO1xuICAgICAgICAgICAgZXhwZWN0KGQuZ2V0VGVtcGxhdGVFbGVtZW50KCkpLnRvLmJlLmluc3RhbmNlT2YoSFRNTFRlbXBsYXRlRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5maW5kRG9jdW1lbnRUZW1wbGF0ZSgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93IFRlbXBsYXRlIG5vdCBmb3VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm5vd2F5XCIsIGRpdilcbiAgICAgICAgICAgIH0pLnRvLnRocm93cyhFcnJvcik7XG4gICAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmZpbmREb2N1bWVudFRlbXBsYXRlKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCdUZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGl0KCdzaG91bGQgZmluZCB0ZW1wbGF0ZSBvdmVyIG93bmVyRG9jdW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgZGl2LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGxldCB0ID0gZmluZERvY3VtZW50VGVtcGxhdGUoXCJteXRlbXBsYXRlXCIsIGRpdik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQpLmlzLmluc3RhbmNlb2YoVGVtcGxhdGUpO1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnVGhtZW5lZCBUZW1wbGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBtZW1BdHRyaWJ1dGVWYWx1ZTtcblxuICAgICAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9XCJteXRlbXBsYXRlXCI+PHA+MTwvcD48L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9XCJteXRlbXBsYXRlLW1vbnN0ZXJcIj48cD4yPC9wPjwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD1cIm15dGVtcGxhdGUtdGVzdHRoZW1lXCI+PHA+NDwvcD48L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9XCJteXByZWZpeC1teXRlbXBsYXRlLW1vbnN0ZXJcIj48cD4zPC9wPjwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBodG1sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpO1xuICAgICAgICAgICAgICAgIGlmIChodG1sLmhhc0F0dHJpYnV0ZShBVFRSSUJVVEVfVEhFTUVfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVtQXR0cmlidXRlVmFsdWUgPSBodG1sLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfVEhFTUVfTkFNRSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vY2tzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vY2tzJyk7XG4gICAgICAgICAgICAgICAgbW9ja3MuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgICAgICAgICAgICAgIGxldCBodG1sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGh0bWwuaGFzQXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FKSkge1xuICAgICAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUF0dHJpYnV0ZShBVFRSSUJVVEVfVEhFTUVfTkFNRSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lbUF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FLCBtZW1BdHRyaWJ1dGVWYWx1ZSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBmaW5kIHRlbXBsYXRlIG92ZXIgb3duZXJEb2N1bWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItdGVtcGxhdGUtcHJlZml4JywgJ215cHJlZml4JylcbiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgbGV0IHQxID0gZmluZERvY3VtZW50VGVtcGxhdGUoXCJteXRlbXBsYXRlXCIsIGRpdik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQxKS5pcy5pbnN0YW5jZW9mKFRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodDEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLnRleHRDb250ZW50KS5pcy5lcXVhbChcIjNcIik7XG5cbiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW1vbnN0ZXItdGVtcGxhdGUtcHJlZml4JylcbiAgICAgICAgICAgICAgICBsZXQgdDIgPSBmaW5kRG9jdW1lbnRUZW1wbGF0ZShcIm15dGVtcGxhdGVcIiwgZGl2KTtcbiAgICAgICAgICAgICAgICBleHBlY3QodDIpLmlzLmluc3RhbmNlb2YoVGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0Mi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkudGV4dENvbnRlbnQpLmlzLmVxdWFsKFwiMlwiKTtcblxuICAgICAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKEFUVFJJQlVURV9USEVNRV9OQU1FLCd0ZXN0dGhlbWUnKTtcbiAgICAgICAgICAgICAgICBsZXQgYT0gaHRtbC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgbGV0IHQzID0gZmluZERvY3VtZW50VGVtcGxhdGUoXCJteXRlbXBsYXRlXCIsIGRpdik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQzKS5pcy5pbnN0YW5jZW9mKFRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodDMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLnRleHRDb250ZW50KS5pcy5lcXVhbChcIjRcIik7XG5cblxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmxldCB3aW5kb3dSZWFkeTtcbmxldCBkb21SZWFkeTtcblxuZGVzY3JpYmUoJ1JlYWR5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgIGluaXRKU0RPTSgpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICBpbXBvcnQoXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZG9tL3JlYWR5Lm1qc1wiKS50aGVuKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9tUmVhZHkgPSBtWydkb21SZWFkeSddO1xuICAgICAgICAgICAgICAgIHdpbmRvd1JlYWR5ID0gbVsnd2luZG93UmVhZHknXTtcbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ2RvbVJlYWR5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZXNvbHZlIHByb21pc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgZG9tUmVhZHkudGhlbihkb25lKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dpbmRvd1JlYWR5JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZXNvbHZlIHByb21pc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgd2luZG93UmVhZHkudGhlbihkb25lKS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pOyIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5pbXBvcnQge0Jhc2VXaXRoT3B0aW9uc30gZnJvbSBcIi4uL3R5cGVzL2Jhc2V3aXRob3B0aW9ucy5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsT2JqZWN0fSBmcm9tIFwiLi4vdHlwZXMvZ2xvYmFsLm1qc1wiO1xuaW1wb3J0IHtpc0FycmF5fSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge1N0YWNrfSBmcm9tIFwiLi4vdHlwZXMvc3RhY2subWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlSW5zdGFuY2UsIHZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7Rm9jdXNNYW5hZ2VyfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBLRVlfRE9DVU1FTlQgPSAnZG9jdW1lbnQnO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBLRVlfQ09OVEVYVCA9ICdjb250ZXh0JztcblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7U3ltYm9sfVxuICovXG5jb25zdCBzdGFja1N5bWJvbCA9IFN5bWJvbCgnc3RhY2snKTtcblxuXG4vKipcbiAqIFdpdGggdGhlIGZvY3VzbWFuYWdlciB0aGUgZm9jdXMgY2FuIGJlIHN0b3JlZCBpbiBhIGRvY3VtZW50LCByZWNhbGxlZCBhbmQgbW92ZWQuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNS4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuRE9NXG4gKiBAdGhyb3dzIHtFcnJvcn0gdW5zdXBwb3J0ZWQgbG9jYWxlXG4gKiBAc3VtbWFyeSBIYW5kbGUgdGhlIGZvY3VzXG4gKi9cbiBjbGFzcyBGb2N1c01hbmFnZXIgZXh0ZW5kcyBCYXNlV2l0aE9wdGlvbnMge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdHx1bmRlZmluZWR9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB2YWxpZGF0ZUluc3RhbmNlKHRoaXMuZ2V0T3B0aW9uKEtFWV9ET0NVTUVOVCksIEhUTUxEb2N1bWVudCk7XG5cbiAgICAgICAgdGhpc1tzdGFja1N5bWJvbF0gPSBuZXcgU3RhY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge0hUTUxEb2N1bWVudH0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IG9iamVjdCBpbnRvIHdoaWNoIHRoZSBub2RlIGlzIHRvIGJlIGFwcGVuZGVkXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgW0tFWV9ET0NVTUVOVF06IGdldEdsb2JhbE9iamVjdCgnZG9jdW1lbnQnKSxcbiAgICAgICAgICAgIFtLRVlfQ09OVEVYVF06IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1lbWJlcnMgdGhlIGN1cnJlbnQgZm9jdXMgb24gYSBzdGFjay5cbiAgICAgKiBTZXZlcmFsIGZvY3VzIGNhbiBiZSBzdG9yZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Gb2N1c01hbmFnZXJ9XG4gICAgICovXG4gICAgc3RvcmVGb2N1cygpIHtcblxuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmdldEFjdGl2ZSgpO1xuICAgICAgICBpZiAoYWN0aXZlIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgICAgdGhpc1tzdGFja1N5bWJvbF0ucHVzaChhY3RpdmUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgZm9jdXMgb24gdGhlIHN0YWNrIGlzIHNldCBhZ2FpblxuICAgICAqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5ET00uRm9jdXNNYW5hZ2VyfVxuICAgICAqL1xuICAgIHJlc3RvcmVGb2N1cygpIHtcblxuICAgICAgICBjb25zdCBsYXN0ID0gdGhpc1tzdGFja1N5bWJvbF0ucG9wKCk7XG4gICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1cyhsYXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBwcmV2ZW50U2Nyb2xsXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2ZcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Gb2N1c01hbmFnZXJ9XG4gICAgICovXG4gICAgZm9jdXMoZWxlbWVudCwgcHJldmVudFNjcm9sbCkge1xuXG4gICAgICAgIHZhbGlkYXRlSW5zdGFuY2UoZWxlbWVudCwgTm9kZSlcblxuICAgICAgICBlbGVtZW50LmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHByZXZlbnRTY3JvbGwgPz8gZmFsc2VcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAgICovXG4gICAgZ2V0QWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb24oS0VZX0RPQ1VNRU5UKS5hY3RpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhbGwgZWxlbWVudHMgdGhhdCBjYW4gYmUgZm9jdXNlZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSBxdWVyeVxuICAgICAqIEByZXR1cm4ge2FycmF5fVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mXG4gICAgICovXG4gICAgZ2V0Rm9jdXNhYmxlKHF1ZXJ5KSB7XG5cbiAgICAgICAgbGV0IGNvbnRleHRFbGVtZW50ID0gdGhpcy5nZXRPcHRpb24oS0VZX0NPTlRFWFQpO1xuICAgICAgICBpZiAoY29udGV4dEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQgPSB0aGlzLmdldE9wdGlvbihLRVlfRE9DVU1FTlQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdGVJbnN0YW5jZShjb250ZXh0RWxlbWVudCwgTm9kZSlcblxuICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocXVlcnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFsuLi5jb250ZXh0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgJ2RldGFpbHMsIGJ1dHRvbiwgaW5wdXQsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKSwgc2VsZWN0LCB0ZXh0YXJlYSwgYVtocmVmXSwgYm9keSdcbiAgICAgICAgKV0uZmlsdGVyKChlbGVtZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkICYmICFlbGVtZW50Lm1hdGNoZXMocXVlcnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSAndHJ1ZScpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBpZihyZWN0LndpZHRoPT09MCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYocmVjdC5oZWlnaHQ9PT0wKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLkRPTS5Gb2N1c01hbmFnZXJ9XG4gICAgICovXG4gICAgZm9jdXNOZXh0KHF1ZXJ5KSB7XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0QWN0aXZlKCk7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IHRoaXMuZ2V0Rm9jdXNhYmxlKHF1ZXJ5KTtcblxuICAgICAgICBpZiAoIWlzQXJyYXkoZm9jdXNhYmxlKSB8fCBmb2N1c2FibGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gZm9jdXNhYmxlLmluZGV4T2YoY3VycmVudCk7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1cyhmb2N1c2FibGVbaW5kZXggKyAxXSB8fCBmb2N1c2FibGVbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKGZvY3VzYWJsZVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKGZvY3VzYWJsZVswXSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVxuICAgICAqIEByZXR1cm4ge01vbnN0ZXIuRE9NLkZvY3VzTWFuYWdlcn1cbiAgICAgKi9cbiAgICBmb2N1c1ByZXYocXVlcnkpIHtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXRBY3RpdmUoKTtcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gdGhpcy5nZXRGb2N1c2FibGUocXVlcnkpO1xuXG4gICAgICAgIGlmICghaXNBcnJheShmb2N1c2FibGUpIHx8IGZvY3VzYWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBmb2N1c2FibGUuaW5kZXhPZihjdXJyZW50KTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKGZvY3VzYWJsZVtpbmRleCAtIDFdIHx8IGZvY3VzYWJsZVtmb2N1c2FibGUubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKGZvY3VzYWJsZVtmb2N1c2FibGUubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1cyhmb2N1c2FibGVbZm9jdXNhYmxlLmxlbmd0aCAtIDFdKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbn1cblxuXG5cblxuXG5cblxuIiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCI7XG5pbXBvcnQge0ZvY3VzTWFuYWdlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kb20vZm9jdXNtYW5hZ2VyLm1qc1wiO1xuaW1wb3J0IHtjbGVhbnVwRE9NRnJvbVRlc3RpbmcsIGluaXRNdXRhdGlvbk9ic2VydmVyRm9yVGVzdGluZ30gZnJvbSBcIi4uLy4uL3V0aWwvY2xlYW51cGRvbS5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0ZvY3VzTWFuYWdlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgaW5pdEpTRE9NKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW5pdE11dGF0aW9uT2JzZXJ2ZXJGb3JUZXN0aW5nKClcbiAgICB9KVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgY2xlYW51cERPTUZyb21UZXN0aW5nKCk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2NrcycpLmlubmVySFRNTCA9ICcnXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCduZXcnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBGb2N1c01hbmFnZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEZvY3VzTWFuYWdlcigpKS5pcy5pbnN0YW5jZW9mKEZvY3VzTWFuYWdlcik7XG4gICAgICAgIH0pXG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ3N0b3JlIGFuZCByZXN0b3JlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbWFuYWdlcjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG1hbmFnZXIgPSBuZXcgRm9jdXNNYW5hZ2VyKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9ja3MnKS5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4MVwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidGVzdGl0XCIgaWQ9XCJ0eDJcIj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInRlc3RpdFwiIGlkPVwidHgzXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4NFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXN0aXRcIiB0YWJpbmRleD1cIjJcIiBpZD1cInR4NVwiPmhlbGxvPC9wPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwidGVzdGl0XCIgaWQ9XCJ0eDZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0ZXN0aXRcIiBpZD1cInR4N1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGVzdGl0JykpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206IDIwMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgIH0pXG5cbiAgICAgICAgaXQoJ3J1biBpc3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIG1hbmFnZXIuZm9jdXMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R4MScpKTtcbiAgICAgICAgICAgIG1hbmFnZXIuc3RvcmVGb2N1cygpO1xuXG4gICAgICAgICAgICBjb25zdCBlMSA9IG1hbmFnZXIuZ2V0QWN0aXZlKCk7XG4gICAgICAgICAgICBleHBlY3QoZTEuZ2V0QXR0cmlidXRlKCdpZCcpLCAnZXJyb3IxJykudG8uYmUuZXF1YWwoJ3R4MScpO1xuXG4gICAgICAgICAgICBtYW5hZ2VyLmZvY3VzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0eDInKSk7XG5cbiAgICAgICAgICAgIG1hbmFnZXIuc3RvcmVGb2N1cygpO1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuZ2V0QWN0aXZlKCkuZ2V0QXR0cmlidXRlKCdpZCcpLCAnZXJyb3IyJykudG8uYmUuZXF1YWwoJ3R4MicpO1xuICAgICAgICAgICAgbWFuYWdlci5mb2N1c05leHQoKTtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmdldEFjdGl2ZSgpLmdldEF0dHJpYnV0ZSgnaWQnKSwgJ2Vycm9yMycpLnRvLmJlLmVxdWFsKCd0eDQnKTtcbiAgICAgICAgICAgIG1hbmFnZXIuZm9jdXNOZXh0KCk7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5nZXRBY3RpdmUoKS5nZXRBdHRyaWJ1dGUoJ2lkJyksICdlcnJvcjQnKS50by5iZS5lcXVhbCgndHg1Jyk7XG4gICAgICAgICAgICBtYW5hZ2VyLnJlc3RvcmVGb2N1cygpO1xuICAgICAgICAgICAgZXhwZWN0KG1hbmFnZXIuZ2V0QWN0aXZlKCkuZ2V0QXR0cmlidXRlKCdpZCcpLCAnZXJyb3I1JykudG8uYmUuZXF1YWwoJ3R4MicpO1xuICAgICAgICAgICAgbWFuYWdlci5yZXN0b3JlRm9jdXMoKTtcbiAgICAgICAgICAgIGV4cGVjdChtYW5hZ2VyLmdldEFjdGl2ZSgpLmdldEF0dHJpYnV0ZSgnaWQnKSwgJ2Vycm9yNicpLnRvLmJlLmVxdWFsKCd0eDEnKTtcbiAgICAgICAgICAgIG1hbmFnZXIucmVzdG9yZUZvY3VzKCk7XG4gICAgICAgICAgICBleHBlY3QobWFuYWdlci5nZXRBY3RpdmUoKS5nZXRBdHRyaWJ1dGUoJ2lkJyksICdlcnJvcjcnKS50by5iZS5lcXVhbCgndHgxJyk7XG4gICAgICAgIH0pXG5cblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgncmV0dXJudHlwZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZm9jdXNtYW5hZ2VyO1xuXG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgICAgZm9jdXNtYW5hZ2VyID0gbmV3IEZvY3VzTWFuYWdlcigpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdjaGVjayByZXR1cm5zJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBleHBlY3QoZm9jdXNtYW5hZ2VyLmdldEZvY3VzYWJsZSgpKS5pcy5pbnN0YW5jZW9mKEFycmF5KTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIuZ2V0QWN0aXZlKCkpLmlzLmluc3RhbmNlb2YoSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgZXhwZWN0KGZvY3VzbWFuYWdlci5mb2N1c05leHQoKSkuaXMuaW5zdGFuY2VvZihGb2N1c01hbmFnZXIpO1xuICAgICAgICAgICAgZXhwZWN0KGZvY3VzbWFuYWdlci5mb2N1c1ByZXYoKSkuaXMuaW5zdGFuY2VvZihGb2N1c01hbmFnZXIpO1xuICAgICAgICAgICAgZXhwZWN0KGZvY3VzbWFuYWdlci5zdG9yZUZvY3VzKCkpLmlzLmluc3RhbmNlb2YoRm9jdXNNYW5hZ2VyKTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIuZm9jdXMoZG9jdW1lbnQuYm9keSkpLmlzLmluc3RhbmNlb2YoRm9jdXNNYW5hZ2VyKTtcbiAgICAgICAgICAgIGV4cGVjdChmb2N1c21hbmFnZXIucmVzdG9yZUZvY3VzKCkpLmlzLmluc3RhbmNlb2YoRm9jdXNNYW5hZ2VyKTtcblxuICAgICAgICB9KVxuXG4gICAgfSlcblxuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcbmltcG9ydCB7Z2V0R2xvYmFsRnVuY3Rpb259IGZyb20gXCIuLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge1Byb3h5T2JzZXJ2ZXJ9IGZyb20gXCIuLi90eXBlcy9wcm94eW9ic2VydmVyLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge0FUVFJJQlVURVBSRUZJWCxBc3NlbWJsZXJ9XG5cbi8qKlxuICogYXR0cmlidXRlIHByZWZpeFxuICpcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqL1xuY29uc3QgQVRUUklCVVRFUFJFRklYID0gXCJkYXRhLW1vbnN0ZXItXCI7XG5cbi8qKlxuICogQXNzZW1ibGVyIGNsYXNzXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS42LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5ET01cbiAqIEBzdW1tYXJ5IEFsbG93cyB5b3UgdG8gYnVpbGQgYW4gaHRtbCBmcmFnbWVudFxuICovXG5jbGFzcyBBc3NlbWJsZXIgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZlxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZnJhZ21lbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVQcmVmaXggPSBBVFRSSUJVVEVQUkVGSVg7XG4gICAgICAgIHZhbGlkYXRlSW5zdGFuY2UoZnJhZ21lbnQsIGdldEdsb2JhbEZ1bmN0aW9uKCdEb2N1bWVudEZyYWdtZW50JykpO1xuICAgICAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAgICogQHJldHVybnMge0Fzc2VtYmxlcn1cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqL1xuICAgIHNldEF0dHJpYnV0ZVByZWZpeChwcmVmaXgpIHtcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocHJlZml4KTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVQcmVmaXggPSBwcmVmaXg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRBdHRyaWJ1dGVQcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZVByZWZpeDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJveHlPYnNlcnZlcnx1bmRlZmluZWR9IGRhdGFcbiAgICAgKiBAcmV0dXJuIHtEb2N1bWVudEZyYWdtZW50fVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mXG4gICAgICovXG4gICAgY3JlYXRlRG9jdW1lbnRGcmFnbWVudChkYXRhKSB7XG5cbiAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBQcm94eU9ic2VydmVyKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkYXRlSW5zdGFuY2UoZGF0YSwgUHJveHlPYnNlcnZlcik7XG4gICAgICAgIGxldCBmcmFnbWVudCA9IHRoaXMuZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgfVxuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5pbXBvcnQge0FUVFJJQlVURVBSRUZJWCwgQXNzZW1ibGVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RvbS9hc3NlbWJsZXIubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmRlc2NyaWJlKCdBc3NlbWJsZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5pdEpTRE9NKCk7XG4gICAgfSlcbiAgICBkZXNjcmliZSgnY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiA8ZGl2Pk9uZTwvZGl2PjxkaXY+VHdvPC9kaXY+JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCgnPGRpdj5PbmU8L2Rpdj48ZGl2PlR3bzwvZGl2PicpO1xuXG4gICAgICAgICAgICBsZXQgZiA9IG5ldyBBc3NlbWJsZXIoZnJhZ21lbnQpO1xuXG4gICAgICAgICAgICAvLyBjb252ZXJ0IHRvIHN0cmluZ1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGYuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChjb250YWluZXIuaW5uZXJIVE1MKS50by5iZS5lcXVhbCgnPGRpdj5PbmU8L2Rpdj48ZGl2PlR3bzwvZGl2PicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGVEb2N1bWVudEZyYWdtZW50KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIERvY3VtZW50RnJhZ21lbnQgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBuZXcgQXNzZW1ibGVyKGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gICAgICAgICAgICBleHBlY3QoZC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpLnRvLmJlLmluc3RhbmNlT2YoRG9jdW1lbnRGcmFnbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25ldycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ25ldyBSZW5kZXJlcigpIHNob3VsZCByZXR1cm4gQXNzZW1ibGVyIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gbmV3IEFzc2VtYmxlcihkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICAgICAgICAgICAgZXhwZWN0KGQpLnRvLmJlLmluc3RhbmNlT2YoQXNzZW1ibGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0QXR0cmlidXRlUHJlZml4KCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuICcgKyBBVFRSSUJVVEVQUkVGSVgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkID0gbmV3IEFzc2VtYmxlcihkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICAgICAgICAgICAgZXhwZWN0KGQuZ2V0QXR0cmlidXRlUHJlZml4KCkpLnRvLmJlLmVxdWFsKEFUVFJJQlVURVBSRUZJWCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldEF0dHJpYnV0ZVByZWZpeCgpLmdldEF0dHJpYnV0ZVByZWZpeCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBzYW1lIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBuZXcgQXNzZW1ibGVyKGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gICAgICAgICAgICBleHBlY3QoZC5zZXRBdHRyaWJ1dGVQcmVmaXgoJ3Rlc3QwMScpLmdldEF0dHJpYnV0ZVByZWZpeCgpKS50by5iZS5lcXVhbCgndGVzdDAxJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbn0pOyIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QmFzZX0gZnJvbSBcIi4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQge2lzT2JqZWN0LCBpc1N0cmluZ30gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUluc3RhbmNlLCB2YWxpZGF0ZUludGVnZXIsIHZhbGlkYXRlT2JqZWN0LCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtMb2NhbGUsIHBhcnNlTG9jYWxlfSBmcm9tIFwiLi9sb2NhbGUubWpzXCI7XG5cbmV4cG9ydCB7VHJhbnNsYXRpb25zfVxuXG4vKipcbiAqIFdpdGggdGhpcyBjbGFzcyB5b3UgY2FuIG1hbmFnZSB0cmFuc2xhdGlvbnMgYW5kIGFjY2VzcyB0aGUga2V5cy5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvaTE4bi90cmFuc2xhdGlvbnMubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5JMThuXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzA2NlxuICovXG5jbGFzcyBUcmFuc2xhdGlvbnMgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMb2NhbGV9IGxvY2FsZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmIChpc1N0cmluZyhsb2NhbGUpKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBwYXJzZUxvY2FsZShsb2NhbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2NhbGUgPSB2YWxpZGF0ZUluc3RhbmNlKGxvY2FsZSwgTG9jYWxlKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlID0gbmV3IE1hcCgpO1xuXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIGEgdGV4dCB1c2luZyB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKiBJZiBubyBzdWl0YWJsZSBrZXkgaXMgZm91bmQsIGBkZWZhdWx0VGV4dGAgaXMgdGFrZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSBkZWZhdWx0VGV4dFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0ga2V5IG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGdldFRleHQoa2V5LCBkZWZhdWx0VGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmFnZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRUZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleSAnICsga2V5ICsgJyBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKGRlZmF1bHRUZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByID0gdGhpcy5zdG9yYWdlLmdldChrZXkpO1xuICAgICAgICBpZiAoaXNPYmplY3QocikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFBsdXJhbFJ1bGVUZXh0KGtleSwgJ290aGVyJywgZGVmYXVsdFRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBgY291bnRgIGNhbiBiZSBwYXNzZWQgdG8gdGhpcyBtZXRob2QuIEluIGFkZGl0aW9uIHRvIGEgbnVtYmVyLCBvbmUgb2YgdGhlIGtleXdvcmRzIGNhbiBhbHNvIGJlIHBhc3NlZCBkaXJlY3RseS5cbiAgICAgKiBcInplcm9cIiwgXCJvbmVcIiwgXCJ0d29cIiwgXCJmZXdcIiwgXCJtYW55XCIgYW5kIFwib3RoZXJcIi4gUmVtZW1iZXI6IG5vdCBldmVyeSBsYW5ndWFnZSBoYXMgYWxsIHJ1bGVzLlxuICAgICAqXG4gICAgICogVGhlIGFwcHJvcHJpYXRlIHRleHQgZm9yIHRoaXMgbnVtYmVyIGlzIHRoZW4gc2VsZWN0ZWQuIElmIG5vIHN1aXRhYmxlIGtleSBpcyBmb3VuZCwgYGRlZmF1bHRUZXh0YCBpcyB0YWtlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ8Y291bnR9IGNvdW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd8dW5kZWZpbmVkfSBkZWZhdWx0VGV4dFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRQbHVyYWxSdWxlVGV4dChrZXksIGNvdW50LCBkZWZhdWx0VGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmFnZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKGRlZmF1bHRUZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByID0gdmFsaWRhdGVPYmplY3QodGhpcy5zdG9yYWdlLmdldChrZXkpKTtcblxuICAgICAgICBsZXQga2V5d29yZDtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGNvdW50KSkge1xuICAgICAgICAgICAga2V5d29yZCA9IGNvdW50LnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb3VudCA9IHZhbGlkYXRlSW50ZWdlcihjb3VudCk7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGhhbmRsaWcgZm9yIHplcm8gY291bnRcbiAgICAgICAgICAgICAgICBpZiAoci5oYXNPd25Qcm9wZXJ0eSgnemVybycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVN0cmluZyhyWyd6ZXJvJ10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAga2V5d29yZCA9IG5ldyBJbnRsLlBsdXJhbFJ1bGVzKHRoaXMubG9jYWxlLnRvU3RyaW5nKCkpLnNlbGVjdCh2YWxpZGF0ZUludGVnZXIoY291bnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyLmhhc093blByb3BlcnR5KGtleXdvcmQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTdHJpbmcocltrZXl3b3JkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoci5oYXNPd25Qcm9wZXJ0eShERUZBVUxUX0tFWSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVN0cmluZyhyW0RFRkFVTFRfS0VZXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsaWRhdGVTdHJpbmcoZGVmYXVsdFRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhIHRleHQgZm9yIGEga2V5XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiB0cmFuc2xhdGlvbnMuc2V0VGV4dChcInRleHQxXCI6IFwiTWFrZSBteSBkYXkhXCIpO1xuICAgICAqIC8vIHBsdXJhbCBydWxlc1xuICAgICAqIHRyYW5zbGF0aW9ucy5zZXRUZXh0KFwidGV4dDZcIjoge1xuICAgICAqICAgICBcInplcm9cIjogXCJUaGVyZSBhcmUgbm8gZmlsZXMgb24gRGlzay5cIixcbiAgICAgKiAgICAgXCJvbmVcIjogXCJUaGVyZSBpcyBvbmUgZmlsZSBvbiBEaXNrLlwiLFxuICAgICAqICAgICBcIm90aGVyXCI6IFwiVGhlcmUgYXJlIGZpbGVzIG9uIERpc2suXCJcbiAgICAgKiAgICAgXCJkZWZhdWx0XCI6IFwiVGhlcmUgYXJlIGZpbGVzIG9uIERpc2suXCJcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHRleHRcbiAgICAgKiBAcmV0dXJuIHtUcmFuc2xhdGlvbnN9XG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcgb3Igb2JqZWN0XG4gICAgICovXG4gICAgc2V0VGV4dChrZXksIHRleHQpIHtcblxuICAgICAgICBpZiAoaXNTdHJpbmcodGV4dCkgfHwgaXNPYmplY3QodGV4dCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXQodmFsaWRhdGVTdHJpbmcoa2V5KSwgdGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbHVlIGlzIG5vdCBhIHN0cmluZyBvciBvYmplY3QnKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIG92ZXJsYXlzIGZyb20gYW4gb2JqZWN0LiBUaGUga2V5cyBhcmUgdHJhbnNmZXJyZWQgYW5kIHRoZSB2YWx1ZXMgYXJlIGVudGVyZWQgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIFRoZSB2YWx1ZXMgY2FuIGVpdGhlciBiZSBjaGFyYWN0ZXIgc3RyaW5ncyBvciwgaW4gdGhlIGNhc2Ugb2YgdGV4dHMgd2l0aCBwbHVyYWwgZm9ybXMsIG9iamVjdHMuIFRoZSBwbHVyYWwgZm9ybXMgbXVzdCBiZSBzdG9yZWQgYXMgdGV4dCB2aWEgYSBzdGFuZGFyZCBrZXkgXCJ6ZXJvXCIsIFwib25lXCIsIFwidHdvXCIsIFwiZmV3XCIsIFwibWFueVwiIGFuZCBcIm90aGVyXCIuXG4gICAgICpcbiAgICAgKiBBZGRpdGlvbmFsbHksIHRoZSBrZXkgZGVmYXVsdCBjYW4gYmUgc3BlY2lmaWVkLCB3aGljaCB3aWxsIGJlIHVzZWQgaWYgbm8gb3RoZXIga2V5IGZpdHMuXG4gICAgICpcbiAgICAgKiBJbiBzb21lIGxhbmd1YWdlcywgbGlrZSBmb3IgZXhhbXBsZSBpbiBnZXJtYW4sIHRoZXJlIGlzIG5vIG93biBtb3JlIG51bWJlciBhdCB0aGUgdmFsdWUgMC4gSW4gdGhlc2UgbGFuZ3VhZ2VzIHRoZSBmdW5jdGlvbiBhcHBsaWVzIGFkZGl0aW9uYWxseSB6ZXJvLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogdHJhbnNsYXRpb25zLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gICAgICogICBcInRleHQxXCI6IFwiTWFrZSBteSBkYXkhXCIsXG4gICAgICogICBcInRleHQyXCI6IFwiSSdsbCBiZSBiYWNrIVwiLFxuICAgICAqICAgXCJ0ZXh0NlwiOiB7XG4gICAgICogICAgIFwiemVyb1wiOiBcIlRoZXJlIGFyZSBubyBmaWxlcyBvbiBEaXNrLlwiLFxuICAgICAqICAgICBcIm9uZVwiOiBcIlRoZXJlIGlzIG9uZSBmaWxlIG9uIERpc2suXCIsXG4gICAgICogICAgIFwib3RoZXJcIjogXCJUaGVyZSBhcmUgZmlsZXMgb24gRGlzay5cIlxuICAgICAqICAgICBcImRlZmF1bHRcIjogXCJUaGVyZSBhcmUgZmlsZXMgb24gRGlzay5cIlxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHRyYW5zbGF0aW9uc1xuICAgICAqIEByZXR1cm4ge1RyYW5zbGF0aW9uc31cbiAgICAgKi9cbiAgICBhc3NpZ25UcmFuc2xhdGlvbnModHJhbnNsYXRpb25zKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KHRyYW5zbGF0aW9ucyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModHJhbnNsYXRpb25zKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRUZXh0KGssIHYpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB9XG5cbn1cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtwYXJzZUxvY2FsZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9pMThuL2xvY2FsZS5tanNcIjtcbmltcG9ydCB7VHJhbnNsYXRpb25zfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vdHJhbnNsYXRpb25zLm1qc1wiO1xuXG5kZXNjcmliZSgnVHJhbnNsYXRpb25zJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ0luc3RhbmNlIGFuZCBJbml0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCB0cmFuc2xhdGlvbjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gbmV3IFRyYW5zbGF0aW9ucyhwYXJzZUxvY2FsZSgnZW4tR0InKSk7XG5cbiAgICAgICAgICAgIHRyYW5zbGF0aW9uLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gICAgICAgICAgICAgICAgdGVzdDE6IFwiYWJjXCIsXG4gICAgICAgICAgICAgICAgdGVzdDI6IHsnb3RoZXInOiAneHl6J31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgICAgIGl0KCdjcmVhdGUgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRyYW5zbGF0aW9ucyhwYXJzZUxvY2FsZSgnZW4tR0InKSkpLmlzLmluc3RhbmNlb2YoVHJhbnNsYXRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2luaXQgdHJhbnNsYXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHRyYW5zbGF0aW9uLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gICAgICAgICAgICAgICAgdGVzdDE6IFwiYWJjXCIsXG4gICAgICAgICAgICAgICAgdGVzdDI6IHsnb3RoZXInOiAneHl6J31cbiAgICAgICAgICAgIH0pKS5pcy5pbnN0YW5jZW9mKFRyYW5zbGF0aW9ucyk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0VGV4dCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgdHJhbnNsYXRpb247XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICB0cmFuc2xhdGlvbiA9IG5ldyBUcmFuc2xhdGlvbnMocGFyc2VMb2NhbGUoJ2VuLUdCJykpO1xuXG4gICAgICAgICAgICB0cmFuc2xhdGlvbi5hc3NpZ25UcmFuc2xhdGlvbnMoe1xuICAgICAgICAgICAgICAgIHRlc3QxOiBcImFiY1wiLFxuICAgICAgICAgICAgICAgIHRlc3QyOiB7J290aGVyJzogJ3h5eid9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBpdCgnY3JlYXRlLCBzZXQgYW5kIGdldCBlbi1HQicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCh0cmFuc2xhdGlvbi5nZXRUZXh0KCd0ZXN0MScpKS5pcy5lcXVhbCgnYWJjJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdjcmVhdGUsIHNldCBhbmQgZ2V0ICBlbi1HQiB3aXRoIHBsdXJhbHJ1bGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHRyYW5zbGF0aW9uLmdldFRleHQoJ3Rlc3QyJykpLmlzLmVxdWFsKCd4eXonKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG5cbn0pOyIsICJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7cGFyc2VMb2NhbGUsIExvY2FsZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9pMThuL2xvY2FsZS5tanNcIjtcblxuXG5kZXNjcmliZSgnTG9jYWxlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ25ldyBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICAvLyBsYW5ndWFnZSwgcmVnaW9uLCBzY3JpcHQsIHZhcmlhbnRzLCBleHRsYW5nLCBwcml2YXRlVXNlXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNTY0Ni5odG1sXG4gICAgICAgICAgICBbJ3poJywgdW5kZWZpbmVkLCAnSGFudCcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICd6aC1IYW50J10sIC8vIHpoLUhhbnQgKENoaW5lc2Ugd3JpdHRlbiB1c2luZyB0aGUgVHJhZGl0aW9uYWwgQ2hpbmVzZSBzY3JpcHQpXG4gICAgICAgICAgICBbJ2RlJywgJ0NIJywgdW5kZWZpbmVkLCAnMTkwMScsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAnZGUtQ0gtMTkwMSddLCAgLy8gZGUtQ0gtMTkwMSAoR2VybWFuIGFzIHVzZWQgaW4gU3dpdHplcmxhbmQgdXNpbmcgdGhlIDE5MDEgdmFyaWFudCBbb3J0aG9ncmFwaHldKVxuICAgICAgICAgICAgWydzbCcsICdJVCcsIHVuZGVmaW5lZCwgJ25lZGlzJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdzbC1JVC1uZWRpcyddLCAgLy8gc2wtSVQtbmVkaXMgKFNsb3ZlbmlhbiBhcyB1c2VkIGluIEl0YWx5LCBOYWRpemEgZGlhbGVjdClcbiAgICAgICAgICAgIFsnaHknLCAnSVQnLCAnTGF0bicsICdhcmV2ZWxhJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdoeS1MYXRuLUlULWFyZXZlbGEnXSwgLy8gaHktTGF0bi1JVC1hcmV2ZWxhIChFYXN0ZXJuIEFybWVuaWFuIHdyaXR0ZW4gaW4gTGF0aW4gc2NyaXB0LCBhcyB1c2VkIGluIEl0YWx5KVxuICAgICAgICAgICAgWyd6aCcsICdDTicsICdIYW5zJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3poLUhhbnMtQ04nXSwgLy8gemgtSGFucy1DTiAoQ2hpbmVzZSB3cml0dGVuIHVzaW5nIHRoZSBTaW1wbGlmaWVkIHNjcmlwdCBhcyB1c2VkIGluICBtYWlubGFuZCBDaGluYSlcbiAgICAgICAgICAgIFsnc3InLCAnUlMnLCAnTGF0bicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdzci1MYXRuLVJTJ10sIC8vIHNyLUxhdG4tUlMgKFNlcmJpYW4gd3JpdHRlbiB1c2luZyB0aGUgTGF0aW4gc2NyaXB0IGFzIHVzZWQgaW4gU2VyYmlhKVxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGUgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBmID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnbmV3IExvY2FsZSgnICsgYSArICcsJyArIGIgKyAnLCcgKyBjICsgJywnICsgZCArICcsJyArIGUgKyAnLCcgKyBmICsgJykgc2hvdWxkIHJldHVybiAnICsgZywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBMb2NhbGUoYSwgYiwgYywgZCwgZSwgZikudG9TdHJpbmcoKSkuaXMuZXF1YWwoZylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3BhcnNlTG9jYWxlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuXG4gICAgICAgICAgICAvLyBsYW5ndWFnZSwgcmVnaW9uLCBzY3JpcHQsIHZhcmlhbnRzLCBleHRsYW5nLCBwcml2YXRlVXNlXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNTY0Ni5odG1sXG4gICAgICAgICAgICBbJ3poJywgdW5kZWZpbmVkLCAnSGFudCcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICd6aC1IYW50J10sIC8vIHpoLUhhbnQgKENoaW5lc2Ugd3JpdHRlbiB1c2luZyB0aGUgVHJhZGl0aW9uYWwgQ2hpbmVzZSBzY3JpcHQpXG4gICAgICAgICAgICBbJ2RlJywgJ0NIJywgdW5kZWZpbmVkLCAnMTkwMScsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAnZGUtQ0gtMTkwMSddLCAgLy8gZGUtQ0gtMTkwMSAoR2VybWFuIGFzIHVzZWQgaW4gU3dpdHplcmxhbmQgdXNpbmcgdGhlIDE5MDEgdmFyaWFudCBbb3J0aG9ncmFwaHldKVxuICAgICAgICAgICAgWydzbCcsICdJVCcsIHVuZGVmaW5lZCwgJ25lZGlzJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdzbC1JVC1uZWRpcyddLCAgLy8gc2wtSVQtbmVkaXMgKFNsb3ZlbmlhbiBhcyB1c2VkIGluIEl0YWx5LCBOYWRpemEgZGlhbGVjdClcbiAgICAgICAgICAgIFsnaHknLCAnSVQnLCAnTGF0bicsICdhcmV2ZWxhJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdoeS1MYXRuLUlULWFyZXZlbGEnXSwgLy8gaHktTGF0bi1JVC1hcmV2ZWxhIChFYXN0ZXJuIEFybWVuaWFuIHdyaXR0ZW4gaW4gTGF0aW4gc2NyaXB0LCBhcyB1c2VkIGluIEl0YWx5KVxuICAgICAgICAgICAgWyd6aCcsICdDTicsICdIYW5zJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgJ3poLUhhbnMtQ04nXSwgLy8gemgtSGFucy1DTiAoQ2hpbmVzZSB3cml0dGVuIHVzaW5nIHRoZSBTaW1wbGlmaWVkIHNjcmlwdCBhcyB1c2VkIGluICBtYWlubGFuZCBDaGluYSlcbiAgICAgICAgICAgIFsnc3InLCAnUlMnLCAnTGF0bicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICdzci1MYXRuLVJTJ10sIC8vIHNyLUxhdG4tUlMgKFNlcmJpYW4gd3JpdHRlbiB1c2luZyB0aGUgTGF0aW4gc2NyaXB0IGFzIHVzZWQgaW4gU2VyYmlhKVxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGUgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBmID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnbmV3IExvY2FsZSgnICsgYSArICcsJyArIGIgKyAnLCcgKyBjICsgJywnICsgZCArICcsJyArIGUgKyAnLCcgKyBmICsgJykgc2hvdWxkIHJldHVybiAnICsgZywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxlID0gcGFyc2VMb2NhbGUoZylcbiAgICAgICAgICAgICAgICBleHBlY3QobG9jYWxlLmxvY2FsZVN0cmluZykudG8uYmUuZXF1YWwoZyk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxvY2FsZS5sYW5ndWFnZSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGxvY2FsZS5yZWdpb24pLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChsb2NhbGUuc2NyaXB0KS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgICAgICBleHBlY3QobG9jYWxlLnZhcmlhbnRzKS50by5iZS5lcXVhbChkKTtcbiAgICAgICAgICAgICAgICBleHBlY3QobG9jYWxlLmV4dGxhbmcpLnRvLmJlLmVxdWFsKGUpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChsb2NhbGUucHJpdmF0ZVVzZSkudG8uYmUuZXF1YWwoZik7XG5cbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IExvY2FsZShhLCBiLCBjLCBkLCBlLCBmKS50b1N0cmluZygpKS5pcy5lcXVhbChnKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vZGF0YS9leHRlbmQubWpzXCI7XG5cbmltcG9ydCB7Rm9ybWF0dGVyIGFzIFRleHRGb3JtYXR0ZXJ9IGZyb20gXCIuLi90ZXh0L2Zvcm1hdHRlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZSwgdmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7VHJhbnNsYXRpb25zfSBmcm9tIFwiLi90cmFuc2xhdGlvbnMubWpzXCI7XG5cbmV4cG9ydCB7Rm9ybWF0dGVyfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbFRyYW5zbGF0aW9uU3ltYm9sID0gU3ltYm9sKCdpbnRlcm5hbFRyYW5zbGF0aW9uJylcblxuLyoqXG4gKiBUaGUgRm9ybWF0dGVyIGV4dGVuZHMgdGhlIFRleHQuRm9ybWF0dGVyIHdpdGggdGhlIHBvc3NpYmlsaXR5IHRvIHJlcGxhY2UgdGhlIGtleSBieSBhIHRyYW5zbGF0aW9uLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9pMThuL2Zvcm1hdHRlci5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkkxOG5cbiAqL1xuY2xhc3MgRm9ybWF0dGVyIGV4dGVuZHMgVGV4dEZvcm1hdHRlciB7XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG1hcmtlcnMgYXJlIGAke2AgYW5kIGB9YFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob2JqZWN0LCB0cmFuc2xhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihvYmplY3QsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzW2ludGVybmFsVHJhbnNsYXRpb25TeW1ib2xdID0gdmFsaWRhdGVJbnN0YW5jZSh0cmFuc2xhdGlvbiwgVHJhbnNsYXRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gbWFya2VyXG4gICAgICogQHByb3BlcnR5IHthcnJheX0gbWFya2VyLm9wZW49W1wiaTE4bntcIixcIiR7XCJdXG4gICAgICogQHByb3BlcnR5IHthcnJheX0gbWFya2VyLmNsb3NlPVtcIiR7XCJdXG4gICAgICogQHByb3BlcnR5IHtvYmplY3R9IHBhcmFtZXRlclxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJhbWV0ZXIuZGVsaW1pdGVyPVwiOjpcIlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJhbWV0ZXIuYXNzaWdubWVudD1cIj1cIlxuICAgICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBjYWxsYmFja3NcbiAgICAgKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBjYWxsYmFja3MuaTE4bj0oKT0+e31cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBzdXBlci5kZWZhdWx0cywge1xuICAgICAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICAgICAgaTE4bjogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmW2ludGVybmFsVHJhbnNsYXRpb25TeW1ib2xdLmdldFRleHQodmFsaWRhdGVTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWFya2VyOiB7XG4gICAgICAgICAgICAgICAgb3BlbjogWydpMThueycsICckeyddLFxuICAgICAgICAgICAgICAgIGNsb3NlOiBbJ30nXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0b28gZGVlcCBuZXN0aW5nXG4gICAgICogQHRocm93cyB7RXJyb3J9IGtleSBub3QgZm91bmRcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIGNsb3NpbmcgbWFya2VyIGlzIG1pc3NpbmdcbiAgICAgKi9cbiAgICBmb3JtYXQodGV4dCkge1xuICAgICAgICB2YWxpZGF0ZVN0cmluZyh0ZXh0KVxuXG4gICAgICAgIGNvbnN0IG9wZW5NYXJrZXIgPSB0aGlzW2ludGVybmFsU3ltYm9sXVsnbWFya2VyJ11bJ29wZW4nXT8uWzBdO1xuICAgICAgICBjb25zdCBjbG9zZU1hcmtlciA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdWydtYXJrZXInXVsnY2xvc2UnXT8uWzBdO1xuXG4gICAgICAgIGlmICh0ZXh0LmluZGV4T2Yob3Blbk1hcmtlcikgPT09IDApIHtcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyhvcGVuTWFya2VyLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmICh0ZXh0LmluZGV4T2YoY2xvc2VNYXJrZXIpID09PSB0ZXh0Lmxlbmd0aCAtIGNsb3NlTWFya2VyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIGNsb3NlTWFya2VyLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoZSBjbG9zaW5nIG1hcmtlciBpcyBtaXNzaW5nXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsaWRhdGVTdHJpbmcodGV4dCkuc3BsaXQoJzo6JylcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25LZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKTsgLy8ga2V5IHZhbHVlIGRlbGltaXRlclxuICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSBwYXJ0cy5qb2luKCc6OicpLnRyaW0oKTtcblxuXG4gICAgICAgIGxldCBhc3NlbWJsZWRUZXh0ID0gb3Blbk1hcmtlciArICdzdGF0aWM6JyArIHRyYW5zbGF0aW9uS2V5ICsgJyB8IGNhbGw6aTE4bic7XG4gICAgICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXNzZW1ibGVkVGV4dCArPSAnOjonICsgcGFyYW1ldGVyO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VtYmxlZFRleHQgKz0gY2xvc2VNYXJrZXI7XG4gICAgICAgIHJldHVybiBzdXBlci5mb3JtYXQoYXNzZW1ibGVkVGV4dCk7XG4gICAgfVxuXG5cbn1cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi9mb3JtYXR0ZXIubWpzXCI7XG5pbXBvcnQge1RyYW5zbGF0aW9uc30gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9pMThuL3RyYW5zbGF0aW9ucy5tanNcIjtcblxuXG5kZXNjcmliZSgnRm9ybWF0dGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ2V4YW1wbGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBydW4gd2l0aCBtYXJrZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG5ldyBUcmFuc2xhdGlvbnMoJ2VuJylcbiAgICAgICAgICAgICAgICAuYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgdGhla2V5OiBcIiR7YW5pbWFsfSBoYXMgZWF0ZW4gdGhlICR7Zm9vZH0hXCJcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZiA9IG5ldyBGb3JtYXR0ZXIoe30sIHRyYW5zbGF0aW9ucyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGV4cGVjdChmLmZvcm1hdChcImkxOG57dGhla2V5OjphbmltYWw9ZG9nOjpmb29kPWNha2V9XCIpKS50by5iZS5lcXVhbCgnZG9nIGhhcyBlYXRlbiB0aGUgY2FrZSEnKTtcbiAgICAgICAgICAgIC8vIFx1MjFBNiBkb2cgaGFzIGVhdGVuIHRoZSBjYWtlISAgICAgICAgICAgICAgICBcblxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIHdpdGhvdXQgbWFya2VyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBuZXcgVHJhbnNsYXRpb25zKCdlbicpXG4gICAgICAgICAgICAgICAgLmFzc2lnblRyYW5zbGF0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgIHRoZWtleTogXCIke2FuaW1hbH0gaGFzIGVhdGVuIHRoZSAke2Zvb2R9IVwiXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIG1pc3NpbmcgbWFya2VyXG4gICAgICAgICAgICBleHBlY3QobmV3IEZvcm1hdHRlcih7fSwgdHJhbnNsYXRpb25zKS5mb3JtYXQoXCJ0aGVrZXk6OmFuaW1hbD1kb2c6OmZvb2Q9Y2FrZVwiKSkudG8uYmUuZXF1YWwoJ2RvZyBoYXMgZWF0ZW4gdGhlIGNha2UhJyk7XG4gICAgICAgICAgICAvLyBcdTIxQTYgZG9nIGhhcyBlYXRlbiB0aGUgY2FrZSEgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCdmb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydpMThue3RyYW5zbGF0aW9ua2V5OjphPTM6OmI9NX0nLCAndGVzdCBpcyAzIGFuZCA1J10sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnZm9ybWF0ICcgKyBhICsgJyBzaG91bGQgJyArIGIsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG5ldyBUcmFuc2xhdGlvbnMoJ2RlJykuYXNzaWduVHJhbnNsYXRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25rZXk6IFwidGVzdCBpcyAke2F9IGFuZCAke2J9XCJcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgZXhwZWN0KFxuICAgICAgICAgICAgICAgICAgICBuZXcgRm9ybWF0dGVyKHt9LCB0cmFuc2xhdGlvbnMpLmZvcm1hdChhKVxuICAgICAgICAgICAgICAgICkudG8uZXF1YWwoYilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KVxuOyIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi8uLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtGb3JtYXR0ZXJ9IGZyb20gXCIuLi8uLi90ZXh0L2Zvcm1hdHRlci5tanNcIjtcbmltcG9ydCB7Z2V0R2xvYmFsRnVuY3Rpb259IGZyb20gXCIuLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2lzSW5zdGFuY2UsIGlzU3RyaW5nfSBmcm9tIFwiLi4vLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlT2JqZWN0LCB2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uLy4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtwYXJzZUxvY2FsZX0gZnJvbSBcIi4uL2xvY2FsZS5tanNcIjtcbmltcG9ydCB7UHJvdmlkZXJ9IGZyb20gXCIuLi9wcm92aWRlci5tanNcIjtcbmltcG9ydCB7VHJhbnNsYXRpb25zfSBmcm9tIFwiLi4vdHJhbnNsYXRpb25zLm1qc1wiO1xuXG5leHBvcnQge0ZldGNofVxuXG4vKipcbiAqIFRoZSBmZXRjaCBwcm92aWRlciByZXRyaWV2ZXMgYSBKU09OIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCByZXR1cm5zIGEgdHJhbnNsYXRpb24gb2JqZWN0LlxuICogXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uLy4uL2V4YW1wbGUvaTE4bi9wcm92aWRlcnMvZmV0Y2gubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5JMThuLlByb3ZpZGVyc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzMDY2fVxuICogQHR1dG9yaWFsIGkxOG4tbG9jYWxlLWFuZC1mb3JtYXR0ZXJcbiAqL1xuIGNsYXNzIEZldGNoIGV4dGVuZHMgUHJvdmlkZXIge1xuXG4gICAgLyoqXG4gICAgICogQXMgb3B0aW9ucyB0aGUga2V5IGBmZXRjaGAgY2FuIGJlIHBhc3NlZC4gVGhpcyBjb25maWcgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgZmV0Y2ggbWV0aG9kIGFzIGluaXQuXG4gICAgICogXG4gICAgICogVGhlIHVybCBtYXkgY29udGFpbiBwbGFjZWhvbGRlcnMgKGxhbmd1YWdlLCBzY3JpcHQsIHJlZ2lvbiwgdmFyaWFudHMsIGV4dGxhbmcsIHByaXZhdGVVc2UpLCBzbyB5b3UgY2FuIHNwZWNpZnkgb25lIHVybCBmb3IgYWxsIHRyYW5zbGF0aW9ucy5cbiAgICAgKiBcbiAgICAgKiBgYGBcbiAgICAgKiBuZXcgRmV0Y2goJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2Fzc2V0cy8ke2xhbmd1YWdlfS5qc29uJylcbiAgICAgKiBgYGBcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHNlZSB7QGxpbmsgTW9uc3Rlci5JMThuLlByb3ZpZGVycy5GZXRjaCNkZWZhdWx0c31cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvZmV0Y2h9XG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChpc0luc3RhbmNlKHVybCwgVVJMKSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZVN0cmluZyh1cmwpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJvcGVydHkge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBleHRlbmQoe30sIHN1cGVyLmRlZmF1bHRzLCB0aGlzLmRlZmF1bHRzLCB2YWxpZGF0ZU9iamVjdChvcHRpb25zKSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0c1xuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IGZldGNoXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLm1ldGhvZD1HRVRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gubW9kZT1jb3JzXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLmNhY2hlPW5vLWNhY2hlXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLmNyZWRlbnRpYWxzPW9taXRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gZmV0Y2gucmVkaXJlY3Q9Zm9sbG93XG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGZldGNoLnJlZmVycmVyUG9saWN5PW5vLXJlZmVycmVyXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJfVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLCAvLyAqR0VULCBQT1NULCBQVVQsIERFTEVURSwgZXRjLlxuICAgICAgICAgICAgICAgIG1vZGU6ICdjb3JzJywgLy8gbm8tY29ycywgKmNvcnMsIHNhbWUtb3JpZ2luXG4gICAgICAgICAgICAgICAgY2FjaGU6ICduby1jYWNoZScsIC8vICpkZWZhdWx0LCBuby1jYWNoZSwgcmVsb2FkLCBmb3JjZS1jYWNoZSwgb25seS1pZi1jYWNoZWRcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ29taXQnLCAvLyBpbmNsdWRlLCAqc2FtZS1vcmlnaW4sIG9taXRcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIG1hbnVhbCwgKmZvbGxvdywgZXJyb3JcbiAgICAgICAgICAgICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJywgLy8gbm8tcmVmZXJyZXIsICpuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSwgb3JpZ2luLCBvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4sIHNhbWUtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLCBzdHJpY3Qtb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luLCB1bnNhZmUtdXJsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMb2NhbGV8c3RyaW5nfSBsb2NhbGVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGdldFRyYW5zbGF0aW9ucyhsb2NhbGUpIHtcblxuICAgICAgICBpZiAoaXNTdHJpbmcobG9jYWxlKSkge1xuICAgICAgICAgICAgbG9jYWxlID0gcGFyc2VMb2NhbGUobG9jYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKGxvY2FsZS5nZXRNYXAoKSlcblxuICAgICAgICByZXR1cm4gZ2V0R2xvYmFsRnVuY3Rpb24oJ2ZldGNoJykoZm9ybWF0dGVyLmZvcm1hdCh0aGlzLnVybCksIHRoaXMuZ2V0T3B0aW9uKCdmZXRjaCcsIHt9KSlcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNsYXRpb25zKGxvY2FsZSkuYXNzaWduVHJhbnNsYXRpb25zKGRhdGEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICB9XG5cblxufVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2VXaXRoT3B0aW9uc30gZnJvbSBcIi4uL3R5cGVzL2Jhc2V3aXRob3B0aW9ucy5tanNcIjtcbmltcG9ydCB7TG9jYWxlfSBmcm9tIFwiLi9sb2NhbGUubWpzXCJcbmltcG9ydCB7VHJhbnNsYXRpb25zfSBmcm9tIFwiLi90cmFuc2xhdGlvbnMubWpzXCJcblxuZXhwb3J0IHtQcm92aWRlcn1cblxuLyoqXG4gKiBBIHByb3ZpZGVyIG1ha2VzIGEgdHJhbnNsYXRpb24gb2JqZWN0IGF2YWlsYWJsZS5cbiAqXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjEzLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5JMThuXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzMwNjZ9XG4gKi9cbmNsYXNzIFByb3ZpZGVyIGV4dGVuZHMgQmFzZVdpdGhPcHRpb25zIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TG9jYWxlfHN0cmluZ30gbG9jYWxlXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBnZXRUcmFuc2xhdGlvbnMobG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFRyYW5zbGF0aW9ucyhsb2NhbGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuXG5pbXBvcnQge0ZldGNofSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2kxOG4vcHJvdmlkZXJzL2ZldGNoLm1qc1wiO1xuaW1wb3J0IHtUcmFuc2xhdGlvbnN9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi90cmFuc2xhdGlvbnMubWpzXCI7XG5pbXBvcnQge2dldEdsb2JhbH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5cblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5sZXQgZmV0Y2hSZWZlcmVuY2U7XG5cblxuZGVzY3JpYmUoJ1RyYW5zbGF0aW9uIFByb3ZpZGVyIEZldGNoJywgZnVuY3Rpb24gKCkge1xuXG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmZXRjaFJlZmVyZW5jZTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgIGZldGNoUmVmZXJlbmNlID0gZ2xvYmFsWydmZXRjaCddO1xuICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBqc29uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnZmV0Y2ggbW9jayBkYXRhIGFuZCBjcmVhdGUgdHJhbnNsYXRpb24nLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2ZldGNoJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IHAgPSAobmV3IEZldGNoKG5ldyBVUkwoJ2h0dHA6Ly9leGFtcGxlLmNvbScpKSkuZ2V0VHJhbnNsYXRpb25zKCdlbicpO1xuXG4gICAgICAgICAgICBleHBlY3QocCkuaXMuaW5zdGFuY2VvZihQcm9taXNlKTtcblxuICAgICAgICAgICAgcC50aGVuKHIgPT4ge1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIpLmlzLmluc3RhbmNlb2YoVHJhbnNsYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShlKTtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvaTE4bi9wcm92aWRlci5tanNcIjtcblxuZGVzY3JpYmUoJ1Byb3ZpZGVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ0luc3RhbmNlIGFuZCBJbml0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdjcmVhdGUgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKG5ldyBQcm92aWRlcigpKS5nZXRUcmFuc2xhdGlvbnMoJ2VuJykpLmlzLmluc3RhbmNlb2YoUHJvbWlzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7TWVkaWFUeXBlLCBwYXJzZU1lZGlhVHlwZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9tZWRpYXR5cGUubWpzXCI7XG5cbmRlc2NyaWJlKCdEYXRhdXJsJywgZnVuY3Rpb24gKCkge1xuXG4gICAgW1xuICAgICAgICBbXCIqLypcIixcIipcIiwnKiddLFxuICAgICAgICBbXCJ0ZXh0LypcIixcInRleHRcIiwnKiddLFxuICAgICAgICBbXCIqL3Rlc3RcIixcIipcIiwndGVzdCddLFxuICAgICAgICBbXCJpbWFnZS9wbmdcIiwgXCJpbWFnZVwiLCBcInBuZ1wiXSxcbiAgICAgICAgW1wiYXVkaW8vbXAzXCIsIFwiYXVkaW9cIiwgXCJtcDNcIl0sXG4gICAgICAgIFtcInZpZGVvL21wZWdcIiwgXCJ2aWRlb1wiLCBcIm1wZWdcIl0sXG4gICAgICAgIFtcInRleHQvcGxhaW5cIiwgXCJ0ZXh0XCIsIFwicGxhaW5cIl0sXG4gICAgICAgIFtcInRleHQvaHRtbFwiLCBcInRleHRcIiwgXCJodG1sXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWw7Y2hhcnNldD1VUy1BU0NJSVwiLCBcInRleHRcIiwgXCJodG1sXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWw7Y2hhcnNldD1cXFwiVVMtQVNDSUlcXFwiXCIsIFwidGV4dFwiLCBcImh0bWxcIl0sXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgaXQoJ3BhcnNlTWVkaWFUeXBlKCcgKyBhICsgJyknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGQgPSBwYXJzZU1lZGlhVHlwZShhKTtcblxuICAgICAgICAgICAgZXhwZWN0KGQpLmlzLmluc3RhbmNlb2YoTWVkaWFUeXBlKTtcbiAgICAgICAgICAgIGV4cGVjdChkLnRvU3RyaW5nKCkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgZXhwZWN0KGQudHlwZSkudG8uYmUuZXF1YWwoYik7XG4gICAgICAgICAgICBleHBlY3QoZC5zdWJ0eXBlKS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgIGV4cGVjdChkLnBhcmFtZXRlcikuaXMuaW5zdGFuY2VvZihNYXApXG4gICAgICAgIH0pXG5cbiAgICB9KTtcblxuICAgIFtcbiAgICAgICAgW1widmlkZW8vXCJdLFxuICAgICAgICBbXCJ0ZXh0XCJdLFxuICAgICAgICBbXCIvbXAzXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWw7Y2hhcnNldFVTLUFTQ0lJXCJdLFxuICAgICAgICBbXCJ0ZXh0L2h0bWw7Y2hhcnNldFxcXCJVUy1BU0NJSVxcXCJcIl0sXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgIGl0KCcnICsgYSArICcgc2hvdWxkIHRocm93IGV4Y2VwdGlvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgZXhwZWN0KCgpPT57cGFyc2VNZWRpYVR5cGUoYSl9KS50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgXG4gICAgICAgIH0pXG5cbiAgICB9KTtcblxuXG59KTsiLCAiaW1wb3J0IHtTdGFja30gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9zdGFjay5tanNcIjtcbmltcG9ydCB7XG4gICAgdHlwZU9mXG59IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdHlwZW9mLm1qc1wiXG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCd0eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLnR5cGVPZigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFt0cnVlLCAnYm9vbGVhbiddLFxuICAgICAgICAgICAgW251bGwsICdudWxsJ10sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCAndW5kZWZpbmVkJ10sXG4gICAgICAgICAgICBbUHJvbWlzZS5yZXNvbHZlKCksICdwcm9taXNlJ10sXG4gICAgICAgICAgICBbbmV3IFdlYWtNYXAoKSwgJ3dlYWttYXAnXSxcbiAgICAgICAgICAgIFtuZXcgTWFwKCksICdtYXAnXSxcbiAgICAgICAgICAgIFtOYU4sICdudW1iZXInXSxcbiAgICAgICAgICAgIFtmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgfSwgJ2dlbmVyYXRvcmZ1bmN0aW9uJ10sXG4gICAgICAgICAgICBbNSwgJ251bWJlciddLFxuICAgICAgICAgICAgW2Z1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIH0sICdmdW5jdGlvbiddLFxuICAgICAgICAgICAgWy9hLywgJ3JlZ2V4cCddLFxuICAgICAgICAgICAgW25ldyBEYXRlKCksICdkYXRlJ10sXG4gICAgICAgICAgICBbe30sICdvYmplY3QnXSxcbiAgICAgICAgICAgIFtbXSwgJ2FycmF5J10sXG4gICAgICAgICAgICBbJycsICdzdHJpbmcnXSxcbiAgICAgICAgICAgIFtuZXcgRXJyb3IsICdlcnJvciddLFxuICAgICAgICAgICAgW25ldyBTdGFjaywgJ3N0YWNrJ11cblxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuICcgKyBiICsgJyB3aGVuIHRoZSB2YWx1ZSAnICsgdHlwZU9mKGEpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHR5cGVPZihhKSkudG8uYmUuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTtcblxuIiwgImltcG9ydCB7T2JzZXJ2ZXJMaXN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL29ic2VydmVybGlzdC5tanNcIjtcbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnT2JzZXJ2ZXJMaXN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5hdHRhY2goKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIE9ic2VydmVyTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvYnNlcnZlckxpc3QgPSBuZXcgT2JzZXJ2ZXJMaXN0KClcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBvYnNlcnZlckxpc3QuYXR0YWNoKG5ldyBPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmJlLmluc3RhbmNlT2YoT2JzZXJ2ZXJMaXN0KVxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmRldGFjaCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgT2JzZXJ2ZXJMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG9ic2VydmVyTGlzdCA9IG5ldyBPYnNlcnZlckxpc3QoKVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG9ic2VydmVyTGlzdC5kZXRhY2gobmV3IE9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uYmUuaW5zdGFuY2VPZihPYnNlcnZlckxpc3QpXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcubm90aWZ5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBcIlllcyFcIjtcbiAgICAgICAgbGV0IG87XG4gICAgICAgIGxldCBvYnNlcnZlckxpc3Q7XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBvID0gbmV3IE9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0VmFsdWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBvYnNlcnZlckxpc3QgPSBuZXcgT2JzZXJ2ZXJMaXN0KClcbiAgICAgICAgICAgIG9ic2VydmVyTGlzdC5hdHRhY2gobylcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGluc3RhbmNlb2YgUHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3Qubm90aWZ5KHt9KSkudG8uYmUuaW5zdGFuY2VPZihQcm9taXNlKVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiAnICsgcmVzdWx0VmFsdWUsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7fVxuXG4gICAgICAgICAgICBvYnNlcnZlckxpc3Qubm90aWZ5KG9iaikudGhlbihyID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QocikudG8uYmUuYW4oJ2FycmF5JykudGhhdC5pbmNsdWRlcyhyZXN1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuY29udGFpbnMoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbzEgPSBuZXcgT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IG8yID0gbmV3IE9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBub3QgY29udGFpbiBvMSBhbmQgbzInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXJMaXN0ID0gbmV3IE9ic2VydmVyTGlzdCgpXG5cbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzEpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzIpKS50by5iZS5mYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjb250YWluIG8yIGFuZCBub3QgbzEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXJMaXN0ID0gbmV3IE9ic2VydmVyTGlzdCgpXG4gICAgICAgICAgICBvYnNlcnZlckxpc3QuYXR0YWNoKG8yKVxuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMikpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgY29udGFpbiBvMSBhbmQgbm90IG8yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IG9ic2VydmVyTGlzdCA9IG5ldyBPYnNlcnZlckxpc3QoKVxuICAgICAgICAgICAgb2JzZXJ2ZXJMaXN0LmF0dGFjaChvMSlcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzEpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyTGlzdC5jb250YWlucyhvMikpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGl0KCdzaG91bGQgY29udGFpbiBvMiBhbmQgbzEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgb2JzZXJ2ZXJMaXN0ID0gbmV3IE9ic2VydmVyTGlzdCgpXG4gICAgICAgICAgICBvYnNlcnZlckxpc3QuYXR0YWNoKG8yKS5hdHRhY2gobzEpXG4gICAgICAgICAgICBleHBlY3Qob2JzZXJ2ZXJMaXN0LmNvbnRhaW5zKG8xKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlckxpc3QuY29udGFpbnMobzIpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnUmFuZG9tSUQnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBjbGFzcyBSYW5kb21JRCB7fVxuICAgIFxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIGlmKCFnbG9iYWxUaGlzWydjcnlwdG8nXSkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpc1snY3J5cHRvJ10gPSBuZXcgbS5DcnlwdG8oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcmFuZG9taWQubWpzXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICBSYW5kb21JRCA9IG0uUmFuZG9tSUQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkpXG5cbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7ICAgIFxuICAgIFxuICAgIGRlc2NyaWJlKCcudG9TdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGlkID0gbmV3IFJhbmRvbUlEKClcbiAgICAgICAgbGV0IHJlc3VsdCA9IGlkLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS5pcy5hKCdzdHJpbmcnKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdVVUlEJywgZnVuY3Rpb24gKCkge1xuXG4gICAgY2xhc3MgVVVJRCB7fVxuICAgIFxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIFxuICAgICAgICBpZighZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3V1aWQubWpzXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICBVVUlEID0gbS5VVUlEO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pKVxuICAgICAgICBcbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7ICAgIFxuICAgIFxuICAgIGRlc2NyaWJlKCcudG9TdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdXVpZCA9IG5ldyBVVUlEKClcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB1dWlkLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLmlzLmEoJ3N0cmluZycpXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0Lmxlbmd0aCkuaXMuZXF1YWwoMzYpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd0ZXN0IGZvcm1hdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgdXVpZCA9IG5ldyBVVUlEKClcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB1dWlkLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4RXhwID0gL15bQS1GXFxkXXs4fS1bQS1GXFxkXXs0fS00W0EtRlxcZF17M30tWzg5QUJdW0EtRlxcZF17M30tW0EtRlxcZF17MTJ9JC9pO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwMDA7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVVJRCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHJlZ2V4RXhwLnRlc3QodSk7XG5cbiAgICAgICAgICAgICAgICBpZiAociAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lKCdubyB1dWlkICcgKyB1ICsgJyA9PiAnICsgcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5cblxuZGVzY3JpYmUoJ09ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG5cbiAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIoY2FsbGJhY2spXG5cbiAgICBkZXNjcmliZSgnLmFkZFRhZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnXSxcbiAgICAgICAgICAgIFsndGVzdDInXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdhZGRUYWcoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgT2JzZXJ2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG9ic2VydmVyLmFkZFRhZyhhKSkuaXMuaW5zdGFuY2VPZihPYnNlcnZlcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5yZW1vdmVUYWcoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJ10sXG4gICAgICAgICAgICBbJ3Rlc3QyJ10sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgncmVtb3ZlVGFnKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIE9ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChvYnNlcnZlci5yZW1vdmVUYWcoYSkpLmlzLmluc3RhbmNlT2YoT2JzZXJ2ZXIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaGFzVGFnKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIHRydWVdLFxuICAgICAgICAgICAgWyd0ZXN0MicsIHRydWVdLFxuICAgICAgICAgICAgWyd0ZXN0MycsIGZhbHNlXSxcbiAgICAgICAgICAgIFsndGVzdDQnLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGNhbGxiYWNrKVxuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ29ic2VydmVyLmhhc3RUYWcoJyArIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoYiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIuYWRkVGFnKGEpXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuaGFzVGFnKGEpKS5pcy5iZS50cnVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHRlbXBPYnNlcnZlci5oYXNUYWcoYSkpLmlzLmJlLmZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnVwZGF0ZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBvYmogPSB7fVxuICAgICAgICBpdCgnb2JzZXJ2ZXIudXBkYXRlKCcgKyBvYmogKyAnKSBpcyAnICsgMSArIDMgKyA2LCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiICsgY1xuICAgICAgICAgICAgfSwgMSwgMywgNilcblxuXG4gICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIudXBkYXRlKG9iaikudGhlbihhID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QoYSkuaXMuZXF1YWwoMSArIDMgKyA2KVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3J1biBmdW5jdGlvbiAudXBkYXRlKCkgc2V2ZXJhbCB0aW1lcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgb2JqID0ge31cbiAgICAgICAgaXQoJ29ic2VydmVyLnVwZGF0ZSgnICsgb2JqICsgJykgaXMgJyArIDEgKyAzICsgNiwgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgbGV0IHRlbXBPYnNlcnZlciA9IG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKTtcbiAgICAgICAgICAgIHRlbXBPYnNlcnZlci51cGRhdGUob2JqKS50aGVuKF8gPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZ2V0VGFncygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtbJ3Rlc3QxJywgJ3Rlc3QyJywgJ3Rlc3QzJywgJ3Rlc3Q0J10sIDRdLFxuICAgICAgICAgICAgW1sndGVzdDEnLCAndGVzdDEnLCAndGVzdDMnLCAndGVzdDQnXSwgM10sIC8vIGRvdWJsZSB0ZXN0MSAoc2V0IGlzIHVuaXF1ZXVlKVxuICAgICAgICAgICAgW1sndGVzdDEnLCAndGVzdDEnLCAndGVzdDEnLCAndGVzdDQnXSwgMl0sIC8vIG11bHRpcGxlIHRlc3QxIChzZXQgaXMgdW5pcXVldWUpXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgdGVtcE9ic2VydmVyID0gbmV3IE9ic2VydmVyKGNhbGxiYWNrKVxuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGEubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wT2JzZXJ2ZXIuYWRkVGFnKGFbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdCgnb2JzZXJ2ZXIuZ2V0VGFncygnICsgYSArICcpIGlzIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuZ2V0VGFncygpKS50by5iZS5hbignYXJyYXknKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdvYnNlcnZlci5nZXRUYWdzKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiArIFwiIHRhZ3NcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0ZW1wT2JzZXJ2ZXIuZ2V0VGFncygpLmxlbmd0aCkuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtUb2tlbkxpc3R9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdG9rZW5saXN0Lm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdUb2tlbkxpc3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLnRvU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCB0b2tlbkxpc3QgPSBuZXcgVG9rZW5MaXN0KClcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRva2VuTGlzdC50b1N0cmluZygpO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uYmUuYSgnc3RyaW5nJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzZXQgYW5kIHJlbW92ZSByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnaW5pdCB3aXRoIHN0cmluZyBpdGVyYWJsZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgnICsgdHlwZW9mIGEgKyAnKSB0aHJvdyBUeXBlRXJyb3IgJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgdG9rZW5zID0gW1wiYWJjXCIsIFwiZGVmXCIsIFwiZ2hpXCJdXG4gICAgICAgICAgICBsZXQgbGlzdCA9IG5ldyBUb2tlbkxpc3QodG9rZW5zKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwiYWJjIGRlZiBnaGlcIik7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaW5pdCB3aXRoIGl0ZXJhYmxlIHdpdGhvdXQgc3RyaW5nIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgnICsgdHlwZW9mIGEgKyAnKSB0aHJvdyBUeXBlRXJyb3IgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHRva2VucyA9IFtcImFiY1wiLCA0LCBcImdoaVwiXVxuICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBUb2tlbkxpc3QodG9rZW5zKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdpbml0IHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICAvLyBjdXJyZW50LCBleHBlY3RlZCwgdHlwZXJyb3JcbiAgICAgICAgICAgIFsndGVzdDEnLCBcInRlc3QxXCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFsndGVzdDEgdGVzdDInLCBcInRlc3QxIHRlc3QyXCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIFwiXCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgdW5kZWZpbmVkLCB0cnVlXSwgLy8gTmFOXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCB0cnVlXSxcbiAgICAgICAgICAgIFsyLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW2ZhbHNlLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbNC41LCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW3t9LCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW1tcIjFcIiwgXCIyXCIsIFwiM1wiXSwgJzEgMiAzJywgZmFsc2VdLCAvLyBpdGVyYWJsZSBzdHJpbmdzXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCB1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2UsIHRydWVdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpZiAoYyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KCcgKyB0eXBlb2YgYSArICcpIHRocm93IFR5cGVFcnJvciAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgVG9rZW5MaXN0KGEpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgVG9rZW5MaXN0KGEpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2l0ZXJhdG9yIHByb3RvY29sJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBsaXN0O1xuICAgICAgICBpdCgnLmFkZCgnICsgXCJzZWNvbmRcIiArICcpIHNob3VsZCByZXR1cm4gVG9rZW5MaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmdldEl0ZXJhdG9yKCkpLnRvLmJlLmFuKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJy5hZGQoJyArIFwic2Vjb25kXCIgKyAnKSBzaG91bGQgcmV0dXJuIFRva2VuTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KFsuLi5saXN0XSkudG8uYmUuYW4oJ2FycmF5Jyk7XG4gICAgICAgICAgICBleHBlY3QoWy4uLmxpc3RdKS50by5iZS5hbignYXJyYXknKS50by5pbmNsdWRlKCdzdGFydCcpLnRvLmluY2x1ZGUoJ2VuZCcpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmVudHJpZXMoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbGlzdDtcbiAgICAgICAgaXQoJy5lbnRyaWVzKCkgc2hvdWxkIHJldHVybiBBcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5lbnRyaWVzKCkpLnRvLmJlLmFuKCdhcnJheScpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnLmVudHJpZXMoKSBzaG91bGQgcmV0dXJuIEFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBlbmRcIikuZW50cmllcygpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QpLnRvLmJlLmFuKCdhcnJheScpLnRvLmluY2x1ZGUoJ3N0YXJ0JykudG8uaW5jbHVkZSgnZW5kJyk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuZm9yRWFjaCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBsaXN0O1xuICAgICAgICBpdCgnLmZvckVhY2goKSBzaG91bGQgaXRlcmF0ZSBvdmVyIHRva2VubGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwiYWFhIGJiYiBjY2MgZGRkIGVlZSBmZmZcIik7XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBcIlwiXG4gICAgICAgICAgICBsaXN0LmZvckVhY2goKGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIhXCIgKyBhICsgXCIhXCI7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGEpLnRvLmJlLmFuKCdzdHJpbmcnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkuaXMuZXF1YWwoXCIhYWFhISFiYmIhIWNjYyEhZGRkISFlZWUhIWZmZiFcIilcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJy5lbnRyaWVzKCkgc2hvdWxkIHJldHVybiBBcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgZW5kXCIpLmVudHJpZXMoKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0KS50by5iZS5hbignYXJyYXknKS50by5pbmNsdWRlKCdzdGFydCcpLnRvLmluY2x1ZGUoJ2VuZCcpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY29udGFpbnMgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbGlzdFxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChzdGFydCwgbWlkZGxlIGVuZCkgc2hvdWxkIGNvbnRhaW4gbWlkZGxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBtaWRkbGUgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMoJ3N0YXJ0JykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucygnbWlkZGxlJykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucygnZW5kJykpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5jb250YWlucyhbJ2VuZCcsICdzdGFydCcsICdtaWRkbGUnXSkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KHN0YXJ0LCBtaWRkbGUgZW5kKSBzaG91bGQgbm90IGNvbnRhaW4geHl6JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBtaWRkbGUgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMoJ3h5eicpKS50by5iZS5mYWxzZTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmNvbnRhaW5zKFsnZW5kJywgJ3N0YXJ0JywgJ21pZGRsZScsICd4eXonXSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChzdGFydCwgbWlkZGxlIGVuZCkgc2hvdWxkIG5vdCBjb250YWluIHVuZGVmaW5lZCBudWxsIE5hTicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgbWlkZGxlIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmNvbnRhaW5zKHVuZGVmaW5lZCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMocGFyc2VJbnQoXCJhXCIpKSkudG8uYmUuZmFsc2U7IC8vIE5hTlxuICAgICAgICAgICAgZXhwZWN0KGxpc3QuY29udGFpbnMobnVsbCkpLnRvLmJlLmZhbHNlOyAvLyBOYU5cbiAgICAgICAgfSk7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCd0b2dnbGUgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbGlzdFxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChzdGFydCBtaWRkbGUgZW5kKS50b2dnbGUobmV3LXZhbHVlKSBzaG91bGQgY29udGFpbiBuZXctdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IG1pZGRsZSBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b2dnbGUoJ25ldy12YWx1ZScpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgbWlkZGxlIGVuZCBuZXctdmFsdWVcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KHN0YXJ0IG1pZGRsZSBlbmQpLnRvZ2dsZShtaWRkbGUpIHNob3VsZCBub3QgY29udGFpbiBtaWRkbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IG1pZGRsZSBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b2dnbGUoJ21pZGRsZScpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgZW5kXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgpLnRvZ2dsZSgpIHNob3VsZCAuLi4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRva2VuTGlzdChcImFiYyBkZWYgZ2hpXCIpLnRvZ2dsZShcImRlZiB4eXpcIikudG9TdHJpbmcoKSkudG8uZXF1YWwoXCJhYmMgZ2hpIHh5elwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoKS50b2dnbGUoKSBzaG91bGQgLi4uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBUb2tlbkxpc3QoXCJhYmMgZGVmIGdoaVwiKS50b2dnbGUoW1wiYWJjXCIsIFwieHl6XCJdKS50b1N0cmluZygpKS50by5lcXVhbChcImRlZiBnaGkgeHl6XCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdCgpLnRvZ2dsZSgpIHNob3VsZCAuLi4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRva2VuTGlzdChcImFiYyBkZWYgZ2hpXCIpLnRvZ2dsZSh1bmRlZmluZWQpLnRvU3RyaW5nKCkpLnRvLmVxdWFsKFwiYWJjIGRlZiBnaGlcIik7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdtYW5pcHVsYXRlIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgbGlzdFxuXG4gICAgICAgIGl0KCdyZXN1bHQgVG9rZW5MaXN0KFwiJyArIFwic3RhcnRcIiArICdcIikgc2hvdWxkIGJlIFwiJyArIFwic3RhcnRcIiArICdcIicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0XCIpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcuYWRkKCcgKyBcInNlY29uZFwiICsgJykgc2hvdWxkIHJldHVybiBUb2tlbkxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuYWRkKFwic2Vjb25kXCIpKS50by5iZS5hbi5pbnN0YW5jZW9mKFRva2VuTGlzdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcuYWRkKCcgKyBcInNlY29uZFwiICsgJykudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgc2Vjb25kXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmFkZChcInNlY29uZFwiKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IHNlY29uZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJy5hZGQoJyArIFwic2Vjb25kIHRoaXJkXCIgKyAnKS50b1N0cmluZygpIHNob3VsZCByZXR1cm4gXCJzdGFydCBzZWNvbmQgdGhpcmRcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0XCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QuYWRkKFwic2Vjb25kIHRoaXJkXCIpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKFwic3RhcnQgc2Vjb25kIHRoaXJkXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnLmFkZCgnICsgXCJbc2Vjb25kLHRoaXJkXVwiICsgJykudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgc2Vjb25kIHRoaXJkXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmFkZChbXCJzZWNvbmRcIiwgXCJ0aGlyZFwiXSkudG9TdHJpbmcoKSkuaXMuZXF1YWwoXCJzdGFydCBzZWNvbmQgdGhpcmRcIik7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgaXQoJy5jbGVhcigpLnRvU3RyaW5nKCkgc2hvdWxkIFwiXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LmFkZChbXCJzZWNvbmRcIiwgXCJ0aGlyZFwiXSkuY2xlYXIoKS50b1N0cmluZygpKS5pcy5lcXVhbChcIlwiKTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBpdCgnbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIikucmVtb3ZlKCcgKyBcInNlY29uZFwiICsgJykgc2hvdWxkIHJldHVybiBUb2tlbkxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5yZW1vdmUoXCJzZWNvbmRcIikpLnRvLmJlLmFuLmluc3RhbmNlb2YoVG9rZW5MaXN0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlbW92ZSgnICsgXCJzZWNvbmRcIiArICcpLnRvU3RyaW5nKCkgc2hvdWxkIHJldHVybiBcInN0YXJ0IHRoaXJkIGVuZFwiICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnJlbW92ZShcInNlY29uZFwiKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IHRoaXJkIGVuZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlbW92ZSgnICsgXCJzZWNvbmQgdGhpcmRcIiArICcpLnRvU3RyaW5nKCkgc2hvdWxkIHJldHVybiBcInN0YXJ0IGVuZFwiICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3QgPSBuZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXN0LnJlbW92ZShcInNlY29uZCB0aGlyZFwiKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IGVuZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlbW92ZSgnICsgXCJbc2Vjb25kLHRoaXJkXVwiICsgJykudG9TdHJpbmcoKSBzaG91bGQgcmV0dXJuIFwic3RhcnQgZW5kXCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QucmVtb3ZlKFtcInNlY29uZFwiLCBcInRoaXJkXCJdKS50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IGVuZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ25ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpLnJlcGxhY2Uoc2Vjb25kLCB4eXopLnRvU3RyaW5nKCkgc2hvdWxkIHJldHVybiBcInN0YXJ0IHh5eiB0aGlyZCBlbmRcIiAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsaXN0ID0gbmV3IFRva2VuTGlzdChcInN0YXJ0IHNlY29uZCB0aGlyZCBlbmRcIik7XG4gICAgICAgICAgICBleHBlY3QobGlzdC5yZXBsYWNlKFwic2Vjb25kXCIsIFwieHl6XCIpKS50by5iZS5pbnN0YW5jZU9mKFRva2VuTGlzdCk7XG4gICAgICAgICAgICBleHBlY3QobGlzdC50b1N0cmluZygpKS5pcy5lcXVhbChcInN0YXJ0IHh5eiB0aGlyZCBlbmRcIik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCduZXcgVG9rZW5MaXN0KFwic3RhcnQgc2Vjb25kIHRoaXJkIGVuZFwiKS5yZXBsYWNlKGVuZCwgeHl6KS50b1N0cmluZygpIHNob3VsZCByZXR1cm4gXCJzdGFydCBzZWNvbmQgdGhpcmQgeHl6XCIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGlzdCA9IG5ldyBUb2tlbkxpc3QoXCJzdGFydCBzZWNvbmQgdGhpcmQgZW5kXCIpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QucmVwbGFjZShcImVuZFwiLCBcInh5elwiKSkudG8uYmUuaW5zdGFuY2VPZihUb2tlbkxpc3QpO1xuICAgICAgICAgICAgZXhwZWN0KGxpc3QudG9TdHJpbmcoKSkuaXMuZXF1YWwoXCJzdGFydCBzZWNvbmQgdGhpcmQgeHl6XCIpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtRdWV1ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9xdWV1ZS5tanNcIjtcblxuZGVzY3JpYmUoJ1F1ZXVlJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBxdWV1ZTtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgcXVldWUgPSBuZXcgUXVldWU7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdpc0VtcHR5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2ZpcnN0IGl0IHNob3VsZCBlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdhZGQgc2VxdWVuY2UgcGVlayBhbmQgcG9sbCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgncmVzdWx0IGEsYSxhLGInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuYWRkKCdhJykpLnRvLmJlLmluc3RhbmNlT2YoUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuYWRkKCdiJykpLnRvLmJlLmluc3RhbmNlT2YoUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCgnYycpKS50by5iZS5pbnN0YW5jZU9mKFF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wZWVrKCkpLnRvLmJlLmVxdWFsKCdhJyk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucGVlaygpKS50by5iZS5lcXVhbCgnYScpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBvbGwoKSkudG8uYmUuZXF1YWwoJ2EnKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wZWVrKCkpLnRvLmJlLmVxdWFsKCdiJyk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS5mYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuICAgIFxuICAgIGRlc2NyaWJlKCdhZGQgYW5kIGNsZWFyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCgnYScpKS50by5iZS5pbnN0YW5jZU9mKFF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmNsZWFyKCkpLnRvLmJlLmluc3RhbmNlT2YoUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxufSkiLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7U3RhY2t9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvc3RhY2subWpzXCI7XG5cblxuZGVzY3JpYmUoJ1N0YWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBzdGFjaztcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdpc0VtcHR5KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2ZpcnN0IGl0IHNob3VsZCBlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdhZGQgc2VxdWVuY2UgcGVlayBhbmQgcHVsbCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgncmVzdWx0IGEsYSxhLGInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucHVzaCgnYScpKS50by5iZS5pbnN0YW5jZU9mKFN0YWNrKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLnB1c2goJ2InKSkudG8uYmUuaW5zdGFuY2VPZihTdGFjayk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucHVzaCgnYycpKS50by5iZS5pbnN0YW5jZU9mKFN0YWNrKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5wZWVrKCkpLnRvLmJlLmVxdWFsKCdjJyk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2sucGVlaygpKS50by5iZS5lcXVhbCgnYycpO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLnBvcCgpKS50by5iZS5lcXVhbCgnYycpO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLnBlZWsoKSkudG8uYmUuZXF1YWwoJ2InKTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnYWRkIGFuZCBjbGVhcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChzdGFjay5wdXNoKCdhJykpLnRvLmJlLmluc3RhbmNlT2YoU3RhY2spO1xuICAgICAgICAgICAgZXhwZWN0KHN0YWNrLmlzRW1wdHkoKSkudG8uYmUuZmFsc2U7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2suY2xlYXIoKSkudG8uYmUuaW5zdGFuY2VPZihTdGFjayk7XG4gICAgICAgICAgICBleHBlY3Qoc3RhY2suaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG59KSIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7dmFsaWRhdGVTdHJpbmd9IGZyb20gXCIuL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge3RvQmluYXJ5LCBmcm9tQmluYXJ5fVxuXG4vKipcbiAqIFlvdSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gdmlhIHRoZSBtb25zdGVyIG5hbWVzcGFjZSBgTW9uc3Rlci5UeXBlcy50b0JpbmFyeSgpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYmluYXJ5XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMTguMFxuICovXG5mdW5jdGlvbiB0b0JpbmFyeShzdHJpbmcpIHtcbiAgICBjb25zdCBjb2RlVW5pdHMgPSBuZXcgVWludDE2QXJyYXkodmFsaWRhdGVTdHJpbmcoc3RyaW5nKS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZVVuaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvZGVVbml0c1tpXSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYXJDb2RlcyA9IG5ldyBVaW50OEFycmF5KGNvZGVVbml0cy5idWZmZXIpO1xuICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhckNvZGVzLmJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogWW91IGNhbiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgdGhlIG1vbnN0ZXIgbmFtZXNwYWNlIGBNb25zdGVyLlR5cGVzLmZyb21CaW5hcnkoKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGJpbmFyeVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjE4LjBcbiAqL1xuZnVuY3Rpb24gZnJvbUJpbmFyeShiaW5hcnkpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHZhbGlkYXRlU3RyaW5nKGJpbmFyeSkubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJ5dGVzW2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIGNvbnN0IGNoYXJDb2RlcyA9IG5ldyBVaW50MTZBcnJheShieXRlcy5idWZmZXIpO1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJDb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtmcm9tQmluYXJ5LCB0b0JpbmFyeX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9iaW5hcnkubWpzXCI7XG5cbmRlc2NyaWJlKCdCaW5hcnknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBbXG4gICAgICAgIFsnYScsICdhXFx1MDAwMCddLFxuICAgICAgICBbJ1x1MjYzOScsICc5JiddLFxuICAgICAgICBbJ0lcdTAwRjF0XHUwMEVCcm5cdTAwRTJ0aVx1MDBGNG5cdTAwRTBsaXpcdTAwRTZ0aVx1MDBGOG4nLCAnSVxcdTAwMDBcdTAwRjFcXHUwMDAwdFxcdTAwMDBcdTAwRUJcXHUwMDAwclxcdTAwMDBuXFx1MDAwMFx1MDBFMlxcdTAwMDB0XFx1MDAwMGlcXHUwMDAwXHUwMEY0XFx1MDAwMG5cXHUwMDAwXHUwMEUwXFx1MDAwMGxcXHUwMDAwaVxcdTAwMDB6XFx1MDAwMFx1MDBFNlxcdTAwMDB0XFx1MDAwMGlcXHUwMDAwXHUwMEY4XFx1MDAwMG5cXHUwMDAwJ11cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgaXQoJ2Zyb21CaW5hcnkodG9CaW5hcnkoJyArIGEgKyAnKSkgc2hvdWxkIHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgciA9IHRvQmluYXJ5KGEpO1xuICAgICAgICAgICAgZXhwZWN0KHIpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICAgICAgZXhwZWN0KGZyb21CaW5hcnkocikpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICB9KVxuXG4gICAgfSk7XG5cblxufSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtCYXNlV2l0aE9wdGlvbnN9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvYmFzZXdpdGhvcHRpb25zLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdCYXNlV2l0aE9wdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IEJhc2VXaXRoT3B0aW9ucycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnaXMgaW5zdGFuY2Ugb2YgQmFzZVdpdGhPcHRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBCYXNlV2l0aE9wdGlvbnMpLnRvLmJlLmluc3RhbmNlT2YoQmFzZVdpdGhPcHRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2lzIGluc3RhbmNlIG9mIE9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQmFzZVdpdGhPcHRpb25zKS50by5iZS5pbnN0YW5jZU9mKE9iamVjdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdnZXQgb3B0aW9uIGlzIHRydWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2VXaXRoT3B0aW9ucyh7YTogdHJ1ZX0pLmdldE9wdGlvbignYScpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbn0pIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHt2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7ZXNjYXBlU3RyaW5nfVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcHJlZml4ZXMgYWxsIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IG1heSBhcHBlYXIgaW4gYSByZWdleCB3aXRoIGEgc2xhc2guXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI2LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5UeXBlc1xuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKHZhbHVlKVxuICAgICAgICAucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCsqPy5dL2csICdcXFxcJCYnKVxuICAgICAgICAucmVwbGFjZSgvLS9nLCAnXFxcXHgyZCcpO1xufVxuIiwgIlxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7ZXNjYXBlU3RyaW5nfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3JlZ2V4Lm1qc1wiXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxuZGVzY3JpYmUoJ2VzY2FwZVN0cmluZycsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIHByb21pc2VzLnB1c2goaW5pdEpTRE9NKCkpO1xuICAgICAgICBpZighZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG5cbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG4gICAgXG4gICAgW1xuICAgICAgICBbJ3Rlc3QxJywgJ3Rlc3QxJ10sXG4gICAgICAgIFsnJHsnLCAnXFxcXCRcXFxceyddLFxuICAgICAgICBbJ2kxOG57JywgJ2kxOG5cXFxceyddLFxuICAgICAgICBbJy8vJywgJy8vJ10sXG4gICAgICAgIFsnXFxcXCcsICdcXFxcXFxcXCddLFxuICAgICAgIFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgaXQoJ2VzY2FwZVN0cmluZygnICsgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChlc2NhcGVTdHJpbmcoYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG5cbn0pO1xuXG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvZXh0ZW5kLm1qc1wiO1xuaW1wb3J0IHtpc09iamVjdH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7T2JzZXJ2ZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvb2JzZXJ2ZXIubWpzXCI7XG5cbmltcG9ydCB7UHJveHlPYnNlcnZlcn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9wcm94eW9ic2VydmVyLm1qc1wiO1xuXG5kZXNjcmliZSgnUHJveHlPYnNlcnZlcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgUHJveHlPYnNlcnZlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvID0gbmV3IFByb3h5T2JzZXJ2ZXIoe30pO1xuICAgICAgICAgICAgZXh0ZW5kKG8uZ2V0U3ViamVjdCgpLCB7YTogNH0pO1xuICAgICAgICAgICAgZXhwZWN0KG8uZ2V0UmVhbFN1YmplY3QoKSkuaXMuZXFsKHthOiA0fSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldFN1YmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcnVuIG9ic2VydmVyJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGxldCBvID0gbmV3IFByb3h5T2JzZXJ2ZXIoe2E6IDF9KTtcbiAgICAgICAgICAgIGV4cGVjdChvLmdldFJlYWxTdWJqZWN0KCkpLmlzLmVxbCh7YTogMX0pO1xuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgby5hdHRhY2hPYnNlcnZlcihuZXcgT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdCh0aGlzKSAmJiB0aGlzIGluc3RhbmNlb2YgUHJveHlPYnNlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgb25lIGNoYW5nZSBhcyBub3RpZnkgcnVucyBsYXRlclxuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoXCJjYWxsZWQgZm9yIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJ0aGlzIGlzIG5vdCBQcm94eU9ic2VydmVyXCIpKVxuICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgIG8uZ2V0U3ViamVjdCgpLmMgPSA0O1xuICAgICAgICAgICAgZXhwZWN0KG8uZ2V0UmVhbFN1YmplY3QoKSkuaXMuZXFsKHthOiAxLCBjOiA0fSk7XG5cbiAgICAgICAgICAgIG8uc2V0U3ViamVjdCh7YjogMn0pO1xuICAgICAgICAgICAgZXhwZWN0KG8uZ2V0UmVhbFN1YmplY3QoKSkuaXMuZXFsKHtiOiAyfSk7XG5cbiAgICAgICAgICAgIG8uZ2V0U3ViamVjdCgpLmQgPSA1O1xuICAgICAgICAgICAgZXhwZWN0KG8uZ2V0UmVhbFN1YmplY3QoKSkuaXMuZXFsKHtiOiAyLCBkOiA1fSk7XG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgUHJveHlPYnNlcnZlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBvID0gbmV3IFByb3h5T2JzZXJ2ZXIoe30pO1xuICAgICAgICAgICAgZXhwZWN0KG8pLmlzLmluc3RhbmNlT2YoUHJveHlPYnNlcnZlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Byb3h5IG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdQcm94eSBvYmplY3RzIHNob3VsZCBub3QgYmUgcmVjb21taXR0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG5ldyBQcm94eU9ic2VydmVyKHthOiB7YjogdHJ1ZX19KTtcbiAgICAgICAgICAgIG8uZ2V0U3ViamVjdCgpLmEuYiA9IG8uZ2V0U3ViamVjdCgpO1xuICAgICAgICAgICAgby5nZXRTdWJqZWN0KCkuYS5iLmEuYiA9IGZhbHNlO1xuICAgICAgICAgICAgLy9leHBlY3Qoby5nZXRTdWJqZWN0KCk9PT1wLmdldFN1YmplY3QoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbm90aWZ5IG9ic2VydmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGluZm9ybSBvYnNlcnZlcicsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgICAgICAvLyB0aGUgbWV0aG9kIGlzIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgZGVmaW5lUHJvcGVydHkgYW5kIGZvciBzZXQgdHJhcFxuICAgICAgICAgICAgbGV0IG8gPSBuZXcgT2JzZXJ2ZXIoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QodGhpcykgJiYgdGhpcyBpbnN0YW5jZW9mIFByb3h5T2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKG5ldyBFcnJvcihcInRoaXMgaXMgbm90IFByb3h5T2JzZXJ2ZXJcIikpXG4gICAgICAgICAgICB9LCB0cnVlKVxuXG4gICAgICAgICAgICBsZXQgcmVhbFN1YmplY3QgPSB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGQ6IDVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwID0gbmV3IFByb3h5T2JzZXJ2ZXIocmVhbFN1YmplY3QpO1xuICAgICAgICAgICAgZXhwZWN0KHApLmlzLmluc3RhbmNlT2YoUHJveHlPYnNlcnZlcik7XG4gICAgICAgICAgICBleHBlY3QocC5hdHRhY2hPYnNlcnZlcihvKSkuaXMuaW5zdGFuY2VPZihQcm94eU9ic2VydmVyKTtcblxuICAgICAgICAgICAgbGV0IHMgPSBwLmdldFN1YmplY3QoKTtcbiAgICAgICAgICAgIGxldCByID0gcC5nZXRSZWFsU3ViamVjdCgpO1xuXG4gICAgICAgICAgICBzLmEuZCA9IGZhbHNlO1xuICAgICAgICAgICAgcy5hLmIuZCA9IDI7XG5cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0bGFiLnNjaHVrYWkuY29tL29zcy9saWJyYXJpZXMvamF2YXNjcmlwdC9tb25zdGVyLy0vaXNzdWVzLzQzXG4gICAgICovXG4gICAgZGVzY3JpYmUoJ1JlZmxlY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2NoZWNrIFJlZmxlY3Quc2V0KCkgd2l0aCBTdWJqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHI7XG5cbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IChuZXcgUHJveHlPYnNlcnZlcih7fSkpLmdldFN1YmplY3QoKTtcblxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFwieWVzIVwiLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBcIm5vXCJcbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvYmpbJ2RhdGEnXSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgfSkudG8ubm90LnRocm93KCk7XG4gICAgICAgICAgICAgICAgLy9yID0gUmVmbGVjdC5zZXQob2JqLCAnZGF0YScsIHZhbHVlKVxuICAgICAgICAgICAgICAgIC8vZXhwZWN0KHIpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3RoYXQnLCB7dGhhdDogJ2NoZWNrZWQxJ31dLFxuICAgICAgICAgICAgWyd0aGF0JywgbmV3IFByb3h5KHt0aGF0OiAnY2hlY2tlZDInfSwge30pXSxcbiAgICAgICAgICAgIFsndGhhdCcsIChuZXcgUHJveHlPYnNlcnZlcih7dGhhdDogJ2NoZWNrZWQzJ30pKS5nZXRSZWFsU3ViamVjdCgpXSxcbiAgICAgICAgICAgIFsndGhhdCcsIChuZXcgUHJveHlPYnNlcnZlcih7dGhhdDogJ2NoZWNrZWQ0J30pKS5nZXRTdWJqZWN0KCldXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQga2V5ID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdjaGVjayBSZWZsZWN0LnNldCgnICsga2V5ICsgJywnICsgSlNPTi5zdHJpbmdpZnkodGFyZ2V0KSArICcpIHNob3VsZCB3cml0YWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWU7XG5cbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBrZXkpWyd3cml0YWJsZSddLCAnd3JpdGFibGUgZm9yICcgKyB2YWx1ZSArICcgc2hvdWxkIHJldHVybiB0cnVlJykudG8uYmUudHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKSwgJ3NldCBmb3IgJyArIHZhbHVlICsgJyBzaG91bGQgcmV0dXJuIHRydWUnKS50by5iZS50cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwga2V5KVsnd3JpdGFibGUnXSwgJ3dyaXRhYmxlIGZvciAnICsgdmFsdWUgKyAnIHNob3VsZCByZXR1cm4gdHJ1ZScpLnRvLmJlLnRydWU7XG5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25vdGlmeSBvYnNlcnZlciB3aXRoIGNoYW5nZXMnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IG9yaWdpbmFsLCBvYnNlcnZlciwgcHJveHk7XG5cbiAgICAgICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsID0ge307XG4gICAgICAgICAgICBwcm94eSA9IG5ldyBQcm94eU9ic2VydmVyKG9yaWdpbmFsKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ2EnLCA0LCBKU09OLnN0cmluZ2lmeSh7YTogNH0pXSxcbiAgICAgICAgICAgIFsnYicsIDksIEpTT04uc3RyaW5naWZ5KHthOiA0LCBiOiA5fSldXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzZXQga2V5ICcgKyBhICsgJyB2YWx1ZSAnICsgYiArICcgZXhwZWN0ICcgKyBjLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyID0gbmV3IE9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRSZWFsU3ViamVjdCgpKSkuaXMuZXF1YWwoYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFjaE9ic2VydmVyKG9ic2VydmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBwcm94eS5hdHRhY2hPYnNlcnZlcihvYnNlcnZlcilcbiAgICAgICAgICAgICAgICBsZXQgc3ViamVjdCA9IHByb3h5LmdldFN1YmplY3QoKVxuXG4gICAgICAgICAgICAgICAgc3ViamVjdFthXSA9IGI7XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJ25vdGlmeSBvYnNlcnZlciAnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gcHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBwcm94eSA9IG5ldyBQcm94eU9ic2VydmVyKHt9KTtcbiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcHJveHkuYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpXG4gICAgICAgICAgICBleHBlY3QocHJveHkubm90aWZ5T2JzZXJ2ZXJzKCkpLmlzLmluc3RhbmNlT2YoUHJvbWlzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KVxuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4vYmFzZS5tanMnO1xuaW1wb3J0IHtpc1ByaW1pdGl2ZX0gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tICcuL25vZGVsaXN0Lm1qcyc7XG5pbXBvcnQge3ZhbGlkYXRlSW5zdGFuY2V9IGZyb20gJy4vdmFsaWRhdGUubWpzJztcblxuZXhwb3J0IHtOb2RlfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpbnRlcm5hbFZhbHVlU3ltYm9sID0gU3ltYm9sKCdpbnRlcm5hbERhdGEnKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqL1xuY29uc3QgdHJlZVN0cnVjdHVyZVN5bWJvbCA9IFN5bWJvbCgndHJlZVN0cnVjdHVyZScpO1xuXG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgdGhlIGluc3RhbmNlIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLk5vZGUoKWAuXG4gKlxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzdW1tYXJ5IEEgTm9kZSBDbGFzc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9JdGVyYXRpb25fcHJvdG9jb2xzXG4gKi9cbmNsYXNzIE5vZGUgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF0gPSB2YWx1ZTtcblxuICAgICAgICB0aGlzW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdID0ge1xuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgY2hpbGROb2RlczogbmV3IE5vZGVMaXN0LFxuICAgICAgICAgICAgbGV2ZWw6IDBcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHsqfVxuICAgICAqL1xuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHsqfVxuICAgICAqL1xuICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzW2ludGVybmFsVmFsdWVTeW1ib2xdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtNb25zdGVyLlR5cGVzLk5vZGV8bnVsbH1cbiAgICAgKi9cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5wYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtpbnRlZ2VyfVxuICAgICAqL1xuICAgIGdldCBsZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdHJlZVN0cnVjdHVyZVN5bWJvbF0ubGV2ZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge05vZGVMaXN0fVxuICAgICAqL1xuICAgIGdldCBjaGlsZE5vZGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtOb2RlTGlzdH1cbiAgICAgKi9cbiAgICBzZXQgY2hpbGROb2RlcyhjaGlsZE5vZGVzKSB7XG4gICAgICAgIHRoaXNbdHJlZVN0cnVjdHVyZVN5bWJvbF0uY2hpbGROb2RlcyA9IHZhbGlkYXRlSW5zdGFuY2UoY2hpbGROb2RlcywgTm9kZUxpc3QpO1xuICAgICAgICBzZXRDaGlsZExldmVsQW5kUGFyZW50LmNhbGwodGhpcywgdGhpcywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlfVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqL1xuICAgIGFwcGVuZENoaWxkKG5vZGUpIHtcbiAgICAgICAgdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzLmFkZCh2YWxpZGF0ZUluc3RhbmNlKG5vZGUsIE5vZGUpKTtcbiAgICAgICAgbm9kZVt0cmVlU3RydWN0dXJlU3ltYm9sXS5wYXJlbnQgPSB0aGlzO1xuXG4gICAgICAgIG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0ubGV2ZWwgPSB0aGlzLmxldmVsICsgMTtcbiAgICAgICAgc2V0Q2hpbGRMZXZlbEFuZFBhcmVudC5jYWxsKHRoaXMsIG5vZGUsIDEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtNb25zdGVyLlR5cGVzLk5vZGV9XG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAgICovXG4gICAgcmVtb3ZlQ2hpbGQobm9kZSkge1xuICAgICAgICB0aGlzW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLmNoaWxkTm9kZXMucmVtb3ZlKHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSkpO1xuICAgICAgICBub2RlW3RyZWVTdHJ1Y3R1cmVTeW1ib2xdLnBhcmVudCA9IG51bGw7XG5cbiAgICAgICAgbm9kZVt0cmVlU3RydWN0dXJlU3ltYm9sXS5sZXZlbCA9IDA7XG4gICAgICAgIHNldENoaWxkTGV2ZWxBbmRQYXJlbnQuY2FsbCh0aGlzLCBub2RlLCAtMSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXNDaGlsZE5vZGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0cmVlU3RydWN0dXJlU3ltYm9sXS5jaGlsZE5vZGVzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlfVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqL1xuICAgIGhhc0NoaWxkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdHJlZVN0cnVjdHVyZVN5bWJvbF0uY2hpbGROb2Rlcy5oYXModmFsaWRhdGVJbnN0YW5jZShub2RlLCBOb2RlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHNpbmNlIDEuMjguMFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcblxuICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF0pIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IHRoaXNbaW50ZXJuYWxWYWx1ZVN5bWJvbF07XG4gICAgICAgICAgICBpZiAoIWlzUHJpbWl0aXZlKGxhYmVsKSkgbGFiZWwgPSBKU09OLnN0cmluZ2lmeSh0aGlzW2ludGVybmFsVmFsdWVTeW1ib2xdKVxuXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGxhYmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5jaGlsZE5vZGVzLmxlbmd0aCxcbiAgICAgICAgICAgIGNvdW50ZXIgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IChjb3VudCA9PT0gY291bnRlciA/ICdcdTI1MTQnIDogJ1x1MjUxQycpLnBhZFN0YXJ0KDIgKiBub2RlLmxldmVsLCAnIHwnKTtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gocHJlZml4ICsgbm9kZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXCIpO1xuICAgIH1cblxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEBwYXJhbSB7aW50fSBvcGVyYW5kXG4gKiBAcmV0dXJuIHtzZXRDaGlsZExldmVsQW5kUGFyZW50fVxuICovXG5mdW5jdGlvbiBzZXRDaGlsZExldmVsQW5kUGFyZW50KG5vZGUsIG9wZXJhbmQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGlmIChub2RlICE9PSB0aGlzKSB7XG4gICAgICAgIG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0ucGFyZW50ID0gdGhpc1xuICAgIH1cblxuICAgIG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0uY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZFt0cmVlU3RydWN0dXJlU3ltYm9sXS5wYXJlbnQgPSBub2RlO1xuICAgICAgICBjaGlsZFt0cmVlU3RydWN0dXJlU3ltYm9sXS5sZXZlbCA9IG5vZGVbdHJlZVN0cnVjdHVyZVN5bWJvbF0ubGV2ZWwgKyBvcGVyYW5kO1xuICAgICAgICBzZXRDaGlsZExldmVsQW5kUGFyZW50LmNhbGwoc2VsZiwgY2hpbGQsIG9wZXJhbmQpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtpc0FycmF5LCBpc0luc3RhbmNlfSBmcm9tIFwiLi9pcy5tanNcIjtcbmltcG9ydCB7Tm9kZX0gZnJvbSBcIi4vbm9kZS5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZX0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7Tm9kZUxpc3R9XG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgdGhlIGluc3RhbmNlIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLk5vZGVMaXN0KClgLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjYuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlR5cGVzXG4gKiBAc3VtbWFyeSBBIE5vZGVMaXN0IGNsYXNzXG4gKi9cbmNsYXNzIE5vZGVMaXN0IGV4dGVuZHMgU2V0IHtcblxuICAgIC8qKlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpbnZhbGlkIHZhbHVlIHR5cGVcbiAgICAgKiBAcGFyYW0ge05vZGVMaXN0fE5vZGV8QXJyYXk8Tm9kZT59dmFsdWVzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmFsdWVzKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICAgICAgICBpZiAodmFsdWVzID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiBzZWxmLmFkZCh2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSW5zdGFuY2UodmFsdWVzLCBOb2RlTGlzdCkpIHtcbiAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHNlbGYuYWRkKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNJbnN0YW5jZSh2YWx1ZXMsIE5vZGUpKSB7XG4gICAgICAgICAgICBzZWxmLmFkZCh2YWx1ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlIHR5cGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlTGlzdH1cbiAgICAgKi9cbiAgICBhZGQobm9kZSkge1xuICAgICAgICBzdXBlci5hZGQodmFsaWRhdGVJbnN0YW5jZShub2RlLCBOb2RlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH1cbiAgICAgKi9cbiAgICByZW1vdmUobm9kZSkge1xuICAgICAgICBzdXBlci5kZWxldGUodmFsaWRhdGVJbnN0YW5jZShub2RlLCBOb2RlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5oYXModmFsaWRhdGVJbnN0YW5jZShub2RlLCBOb2RlKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9XG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9XG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fVxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgcGFydHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy50b0FycmF5KCkpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gobm9kZS50b1N0cmluZygpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnNpemU7XG4gICAgfVxufVxuXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtOb2RlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qc1wiO1xuXG5kZXNjcmliZSgnTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJyNjb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0LnNpemUpLnRvLmVxdWFsKDApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIE5vZGVMaXN0IGZyb20gYW4gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoW1xuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JyksXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0LnNpemUpLnRvLmVxdWFsKDMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIE5vZGVMaXN0IGZyb20gYSBOb2RlTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBub2RlTGlzdCA9IG5ldyBOb2RlTGlzdChbXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpLFxuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JylcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QyID0gbmV3IE5vZGVMaXN0KG5vZGVMaXN0KTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0Mi5zaXplKS50by5lcXVhbCgzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgIH0pO1xuICAgIFxuICAgICBcbiAgICBpdCgnY3JlYXRlIE5vZGVMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVMaXN0KCkpLmlzLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgnYWRkIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5hZGQobmV3IE5vZGUoKSkpLnRvLmJlLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgncmVtb3ZlIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5yZW1vdmUobmV3IE5vZGUoKSkpLnRvLmJlLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgnaGFzIHVua25vd24gTm9kZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmhhcyhuZXcgTm9kZSkpLnRvLmJlLmZhbHNlO1xuICAgIH0pXG5cbiAgICBpdCgnaGFzIGFkZGVkIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTm9kZTtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmFkZChuKS5oYXMobikpLnRvLmJlLnRydWU7XG4gICAgfSlcbiAgICBcbiAgICBpdCgndG9TdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTm9kZTtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmFkZChuZXcgTm9kZSgnYScpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCdiJykpKS50b1N0cmluZygpKS50by5iZS5lcXVhbCgnYVxcbiBcdTI1MTRiJyk7XG4gICAgfSlcblxuICAgIGl0KCd0aHJvdyBleGNlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgTm9kZUxpc3QoKS5hZGQoMSkpLnRvLnRocm93KEVycm9yKTtcbiAgICB9KVxuXG5cbn0pOyIsICJpbXBvcnQge1xuICAgIFZlcnNpb25cbn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy92ZXJzaW9uLm1qc1wiXG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdWZXJzaW9uJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5jb21wYXJlVG8oKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJzEuMi4zJywgJzEuMi4zJywgMF0sXG4gICAgICAgICAgICBbJzEuMi4yJywgJzEuMi4zJywgLTFdLFxuICAgICAgICAgICAgWycyJywgJzIuMC4wJywgMF0sXG4gICAgICAgICAgICBbJzEuMi40JywgJzEuMi4zJywgMV1cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gJyArIGMgKyAnIHdoZW4gdGhlIHZhbHVlICcgKyBhICsgJyBpcyAnICsgYiArICcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBWZXJzaW9uKGEpLmNvbXBhcmVUbyhiKSkudG8uYmUuZXF1YWwoYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcudG9TdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJzEuMS4xJywgJzIuMycsIDMsICcxLjIuMyddLFxuICAgICAgICAgICAgWycxLjIuNCcsICcxLjIuMycsIDUsICcxLjEuNSddXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiAnICsgZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgVmVyc2lvbihhLCBiLCBjKS50b1N0cmluZygpKS50by5iZS5lcXVhbChkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KVxuXG59KTtcblxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uL2NvbnN0YW50cy5tanNcIjtcblxuaW1wb3J0IHtCYXNlfSBmcm9tICcuL2Jhc2UubWpzJztcbmltcG9ydCB7aXNJbnN0YW5jZX0gZnJvbSBcIi4vaXMubWpzXCI7XG5pbXBvcnQge05vZGV9IGZyb20gXCIuL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi9ub2RlbGlzdC5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVJbnN0YW5jZX0gZnJvbSBcIi4vdmFsaWRhdGUubWpzXCI7XG5cbmV4cG9ydCB7Tm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBpc05vZGVMaXN0U3ltYm9sID0gU3ltYm9sKCdpc05vZGVMaXN0Jyk7XG5cbi8qKlxuICogWW91IGNhbiBjcmVhdGUgdGhlIGluc3RhbmNlIHZpYSB0aGUgbW9uc3RlciBuYW1lc3BhY2UgYG5ldyBNb25zdGVyLlR5cGVzLk5vZGVSZWN1cnNpdmVJdGVyYXRvcigpYC5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdHlwZXMvbm9kZXJlY3Vyc2l2ZWl0ZXJhdG9yLm1qc1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4yNi4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuVHlwZXNcbiAqIEBzdW1tYXJ5IEFuIGl0ZXJhdG9yIHRvIHJ1biByZWN1cnNpdmVseSB0aHJvdWdoIGEgdHJlZSBvZiBub2Rlc1xuICovXG4gY2xhc3MgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IFtkYXRhXVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW2lzTm9kZUxpc3RTeW1ib2xdID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaXRlcmF0b3IgaXMgYSBub2RlbGlzdFxuICAgICAgICBpZiAoaXNJbnN0YW5jZShub2RlLCBOb2RlTGlzdCkpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IG5vZGU7XG4gICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoKTtcbiAgICAgICAgICAgIG5vZGUuY2hpbGROb2RlcyA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgdGhpc1tpc05vZGVMaXN0U3ltYm9sXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXSA9IHZhbGlkYXRlSW5zdGFuY2Uobm9kZSwgTm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy95aWVsZFxuICAgICAqL1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24qICgpIHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGVuZCBvZiB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGlzIHJlYWNoZWQuIEluIHRoaXMgY2FzZSwgZXhlY3V0aW9uIG9mIHRoZSBnZW5lcmF0b3JcbiAgICAgICAgICogZW5kcyBhbmQgYW4gSXRlcmF0b3JSZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBpbiB3aGljaCB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZCBkb25lIGlzIHRydWUuXG4gICAgICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3lpZWxkXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBpdGVyYXRvciBpcyBhIG5vZGVsaXN0IGFuZCB0aGUgbWFpbiBub2RlIGlzIG9ubHkgYSBwbGFjZWhvbGRlclxuICAgICAgICBpZiAodGhpc1tpc05vZGVMaXN0U3ltYm9sXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgeWllbGQgdGhpc1tpbnRlcm5hbFN5bWJvbF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpc1tpbnRlcm5hbFN5bWJvbF0uaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGROb2RlcyA9IHRoaXNbaW50ZXJuYWxTeW1ib2xdLmNoaWxkTm9kZXM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG5vZGUgb2YgY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgICAgIHlpZWxkKiBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHJldHVybiB7TW9uc3Rlci5UeXBlcy5Ob2RlUmVjdXJzaXZlSXRlcmF0b3J9XG4gICAgICovXG4gICAgZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykge1xuICAgICAgICAgICAgY2FsbGJhY2sobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtOb2RlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qc1wiO1xuaW1wb3J0IHtOb2RlUmVjdXJzaXZlSXRlcmF0b3J9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvbm9kZXJlY3Vyc2l2ZWl0ZXJhdG9yLm1qc1wiO1xuXG5kZXNjcmliZSgnTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJyNjb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgTm9kZUxpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0LnNpemUpLnRvLmVxdWFsKDApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIE5vZGVMaXN0IGZyb20gYW4gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoW1xuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JyksXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0LnNpemUpLnRvLmVxdWFsKDMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIE5vZGVMaXN0IGZyb20gYSBOb2RlTGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBub2RlTGlzdCA9IG5ldyBOb2RlTGlzdChbXG4gICAgICAgICAgICAgICAgbmV3IE5vZGUoJ2RpdicpLFxuICAgICAgICAgICAgICAgIG5ldyBOb2RlKCdkaXYnKSxcbiAgICAgICAgICAgICAgICBuZXcgTm9kZSgnZGl2JylcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBsZXQgbm9kZUxpc3QyID0gbmV3IE5vZGVMaXN0KG5vZGVMaXN0KTtcblxuICAgICAgICAgICAgZXhwZWN0KG5vZGVMaXN0Mi5zaXplKS50by5lcXVhbCgzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlIE5vZGVMaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVMaXN0KCkpLmlzLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgnYWRkIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5hZGQobmV3IE5vZGUoKSkpLnRvLmJlLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgncmVtb3ZlIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgTm9kZUxpc3QoKS5yZW1vdmUobmV3IE5vZGUoKSkpLnRvLmJlLmluc3RhbmNlb2YoTm9kZUxpc3QpO1xuICAgIH0pXG5cbiAgICBpdCgnaGFzIHVua25vd24gTm9kZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmhhcyhuZXcgTm9kZSkpLnRvLmJlLmZhbHNlO1xuICAgIH0pXG5cbiAgICBpdCgnaGFzIGFkZGVkIE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTm9kZTtcbiAgICAgICAgZXhwZWN0KG5ldyBOb2RlTGlzdCgpLmFkZChuKS5oYXMobikpLnRvLmJlLnRydWU7XG4gICAgfSlcblxuICAgIGl0KCd0aHJvdyBleGNlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgTm9kZUxpc3QoKS5hZGQoMSkpLnRvLnRocm93KEVycm9yKTtcbiAgICB9KVxuXG4gICAgaXQoJ2NoZWNrIGxldmVsJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IHJvb3QgPSBuZXcgTm9kZSgncm9vdCcpO1xuXG4gICAgICAgIGNvbnN0IG4xID0gbmV3IE5vZGUoJ24xJyk7XG4gICAgICAgIGNvbnN0IG4yID0gbmV3IE5vZGUoJ24yJyk7XG4gICAgICAgIGNvbnN0IG4zID0gbmV3IE5vZGUoJ24zJyk7XG4gICAgICAgIGNvbnN0IG40ID0gbmV3IE5vZGUoJ240Jyk7XG5cbiAgICAgICAgY29uc3QgbjExID0gbmV3IE5vZGUoJ24xMScpO1xuICAgICAgICBjb25zdCBuMTIgPSBuZXcgTm9kZSgnbjEyJyk7XG4gICAgICAgIGNvbnN0IG4xMyA9IG5ldyBOb2RlKCduMTMnKTtcblxuICAgICAgICBjb25zdCBuMjEgPSBuZXcgTm9kZSgnbjIxJyk7XG4gICAgICAgIGNvbnN0IG4yMiA9IG5ldyBOb2RlKCduMjInKTtcbiAgICAgICAgY29uc3QgbjIzID0gbmV3IE5vZGUoJ24yMycpO1xuXG4gICAgICAgIGNvbnN0IG40MSA9IG5ldyBOb2RlKCduNDEnKTtcbiAgICAgICAgY29uc3QgbjQyID0gbmV3IE5vZGUoJ240MicpO1xuXG4gICAgICAgIGNvbnN0IG40MTEgPSBuZXcgTm9kZSgnbjQxMScpO1xuICAgICAgICBjb25zdCBuNDEyID0gbmV3IE5vZGUoJ240MTInKTtcbiAgICAgICAgY29uc3QgbjQxMyA9IG5ldyBOb2RlKCduNDEzJyk7XG5cbiAgICAgICAgY29uc3QgbjQxMjEgPSBuZXcgTm9kZSgnbjQxMjEnKTtcblxuICAgICAgICByb290LmFwcGVuZENoaWxkKG4xKS5hcHBlbmRDaGlsZChuMikuYXBwZW5kQ2hpbGQobjMpLmFwcGVuZENoaWxkKG40KTtcbiAgICAgICAgbjEuYXBwZW5kQ2hpbGQobjExKS5hcHBlbmRDaGlsZChuMTIpLmFwcGVuZENoaWxkKG4xMyk7XG4gICAgICAgIG4yLmFwcGVuZENoaWxkKG4yMSkuYXBwZW5kQ2hpbGQobjIyKS5hcHBlbmRDaGlsZChuMjMpO1xuICAgICAgICBuNC5hcHBlbmRDaGlsZChuNDEpLmFwcGVuZENoaWxkKG40Mik7XG4gICAgICAgIG40MS5hcHBlbmRDaGlsZChuNDExKS5hcHBlbmRDaGlsZChuNDEyKS5hcHBlbmRDaGlsZChuNDEzKTtcbiAgICAgICAgbjQxMi5hcHBlbmRDaGlsZChuNDEyMSk7XG5cbiAgICAgICAgbGV0IGl0ZXJhdG9yID0gbmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihyb290KTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBpdGVyYXRvcikge1xuICAgICAgICAgICAgZXhwZWN0KG4pLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuLnZhbHVlICsgXCI6XCIgKyBuLmxldmVsKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbXG4gICAgICAgICAgICAncm9vdDowJyxcbiAgICAgICAgICAgICduMToxJyxcbiAgICAgICAgICAgICduMTE6MicsXG4gICAgICAgICAgICAnbjEyOjInLFxuICAgICAgICAgICAgJ24xMzoyJyxcbiAgICAgICAgICAgICduMjoxJyxcbiAgICAgICAgICAgICduMjE6MicsXG4gICAgICAgICAgICAnbjIyOjInLFxuICAgICAgICAgICAgJ24yMzoyJyxcbiAgICAgICAgICAgICduMzoxJyxcbiAgICAgICAgICAgICduNDoxJyxcbiAgICAgICAgICAgICduNDE6MicsXG4gICAgICAgICAgICAnbjQxMTozJyxcbiAgICAgICAgICAgICduNDEyOjMnLFxuICAgICAgICAgICAgJ240MTIxOjQnLFxuICAgICAgICAgICAgJ240MTM6MycsXG4gICAgICAgICAgICAnbjQyOjInXG5cbiAgICAgICAgXSk7XG5cbiAgICAgICAgbjQxMjEuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJ240MTIxMScpKTtcblxuICAgICAgICBpdGVyYXRvciA9IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3Iocm9vdCk7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGV4cGVjdChuKS50by5iZS5hbi5pbnN0YW5jZW9mKE5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobi52YWx1ZSArIFwiOlwiICsgbi5sZXZlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFtcbiAgICAgICAgICAgICdyb290OjAnLFxuICAgICAgICAgICAgJ24xOjEnLFxuICAgICAgICAgICAgJ24xMToyJyxcbiAgICAgICAgICAgICduMTI6MicsXG4gICAgICAgICAgICAnbjEzOjInLFxuICAgICAgICAgICAgJ24yOjEnLFxuICAgICAgICAgICAgJ24yMToyJyxcbiAgICAgICAgICAgICduMjI6MicsXG4gICAgICAgICAgICAnbjIzOjInLFxuICAgICAgICAgICAgJ24zOjEnLFxuICAgICAgICAgICAgJ240OjEnLFxuICAgICAgICAgICAgJ240MToyJyxcbiAgICAgICAgICAgICduNDExOjMnLFxuICAgICAgICAgICAgJ240MTI6MycsXG4gICAgICAgICAgICAnbjQxMjE6NCcsXG4gICAgICAgICAgICAnbjQxMjExOjUnLFxuICAgICAgICAgICAgJ240MTM6MycsXG4gICAgICAgICAgICAnbjQyOjInXG5cbiAgICAgICAgXSk7XG5cblxuICAgICAgICBjb25zdCBiYiA9IG5ldyBOb2RlKCdiYicpIC8vIGJpZyBiYW5nXG5cbiAgICAgICAgYmIuYXBwZW5kQ2hpbGQocm9vdCk7XG4gICAgICAgIGl0ZXJhdG9yID0gbmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihiYik7XG5cbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBpdGVyYXRvcikge1xuICAgICAgICAgICAgZXhwZWN0KG4pLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuLnZhbHVlICsgXCI6XCIgKyBuLmxldmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoW1xuICAgICAgICAgICAgJ2JiOjAnLFxuICAgICAgICAgICAgJ3Jvb3Q6MScsXG4gICAgICAgICAgICAnbjE6MicsXG4gICAgICAgICAgICAnbjExOjMnLFxuICAgICAgICAgICAgJ24xMjozJyxcbiAgICAgICAgICAgICduMTM6MycsXG4gICAgICAgICAgICAnbjI6MicsXG4gICAgICAgICAgICAnbjIxOjMnLFxuICAgICAgICAgICAgJ24yMjozJyxcbiAgICAgICAgICAgICduMjM6MycsXG4gICAgICAgICAgICAnbjM6MicsXG4gICAgICAgICAgICAnbjQ6MicsXG4gICAgICAgICAgICAnbjQxOjMnLFxuICAgICAgICAgICAgJ240MTE6NCcsXG4gICAgICAgICAgICAnbjQxMjo0JyxcbiAgICAgICAgICAgICduNDEyMTo1JyxcbiAgICAgICAgICAgICduNDEyMTE6NicsXG4gICAgICAgICAgICAnbjQxMzo0JyxcbiAgICAgICAgICAgICduNDI6MydcblxuICAgICAgICBdKTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnTGV2ZWxzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCduMiBzaG91bGQgbGV2ZWwgMicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgY29uc3QgbjAgPSBuZXcgTm9kZSgnYWJjJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG4xID0gbmV3IE5vZGUoJ2RlZicpO1xuICAgICAgICAgICAgbjAuYXBwZW5kQ2hpbGQobjEpXG5cbiAgICAgICAgICAgIGNvbnN0IG4yID0gbmV3IE5vZGUoJ2doaScpO1xuICAgICAgICAgICAgbjEuYXBwZW5kQ2hpbGQobjIpO1xuXG4gICAgICAgICAgICBjb25zdCBuMyA9IG5ldyBOb2RlKCdqa2wnKTtcbiAgICAgICAgICAgIG4yLmFwcGVuZENoaWxkKG4zKTtcblxuICAgICAgICAgICAgZXhwZWN0KG4wLmxldmVsKS50by5iZS5lcXVhbCgwKTtcbiAgICAgICAgICAgIGV4cGVjdChuMS5sZXZlbCkudG8uYmUuZXF1YWwoMSk7XG4gICAgICAgICAgICBleHBlY3QobjIubGV2ZWwpLnRvLmJlLmVxdWFsKDIpO1xuICAgICAgICAgICAgZXhwZWN0KG4zLmxldmVsKS50by5iZS5lcXVhbCgzKTtcblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ3RvU3RyaW5nKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBvdXRwdXQgZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBOb2RlKCk7XG4gICAgICAgICAgICBleHBlY3Qobm9kZS50b1N0cmluZygpKS5pcy5lcXVhbCgnJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgb3V0cHV0IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG4wID0gbmV3IE5vZGUoJ2FiYycpO1xuXG4gICAgICAgICAgICBjb25zdCBuMSA9IG5ldyBOb2RlKCdkZWYnKTtcbiAgICAgICAgICAgIG4wLmFwcGVuZENoaWxkKG4xKVxuXG4gICAgICAgICAgICBjb25zdCBuMTEgPSBuZXcgTm9kZSgnZ2hpJyk7XG4gICAgICAgICAgICBuMC5hcHBlbmRDaGlsZChuMTEpXG5cbiAgICAgICAgICAgIGNvbnN0IG4yID0gbmV3IE5vZGUoJ2prbCcpO1xuICAgICAgICAgICAgbjEuYXBwZW5kQ2hpbGQobjIpO1xuXG4gICAgICAgICAgICBjb25zdCBuMyA9IG5ldyBOb2RlKCdtbm8nKTtcbiAgICAgICAgICAgIG4xLmFwcGVuZENoaWxkKG4zKTtcblxuICAgICAgICAgICAgY29uc3QgbjQgPSBuZXcgTm9kZSgncHFyJyk7XG4gICAgICAgICAgICBuMi5hcHBlbmRDaGlsZChuNCk7XG5cbiAgICAgICAgICAgIGV4cGVjdChuMi5sZXZlbCkudG8uYmUuZXF1YWwoMilcblxuICAgICAgICAgICAgY29uc29sZS5sb2cobjAudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAvLyBleHBlY3QobjAudG9TdHJpbmcoKSkuaXMuZXF1YWwoJycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuXG59KTsiLCAiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtOb2RlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL25vZGVsaXN0Lm1qc1wiO1xuaW1wb3J0IHtOb2RlUmVjdXJzaXZlSXRlcmF0b3J9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvbm9kZXJlY3Vyc2l2ZWl0ZXJhdG9yLm1qc1wiO1xuXG5kZXNjcmliZSgnTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yJywgZnVuY3Rpb24gKCkge1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBleGVwdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3IoKSkudG8udGhyb3coRXJyb3IpXG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBiZSBhIGZ1bmN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QoTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKS50by5iZS5hKCdmdW5jdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBhIGNvbnN0cnVjdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IE5vZGVSZWN1cnNpdmVJdGVyYXRvcihuZXcgTm9kZSkpLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3lpZWxkXG4gICAgICovXG4gICAgaXQoJ3VuZGVmaW5lZCBzaG91bGQgbm90IHJlc3VsdCBpbiB1bmRlZmluZWQgbm9kZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKG5ldyBOb2RlKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBleHBlY3QobikudG8uYmUuYW4uaW5zdGFuY2VvZihOb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG4udmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8uZGVlcC5lcXVhbChbdW5kZWZpbmVkXSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaXRlcmF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9XG4gICAgICAgICAgICBuZXcgTm9kZSgnMScpXG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICAobmV3IE5vZGUoJzInKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzIuMScpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnMi4yJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCcyLjMnKSkpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCczJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCc0JykuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzQuMScpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnNC4yJykpKTtcblxuICAgICAgICBjb25zdCBpdGVyYXRvciA9IG5ldyBOb2RlUmVjdXJzaXZlSXRlcmF0b3Iobm9kZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBpdGVyYXRvcikge1xuICAgICAgICAgICAgZXhwZWN0KG4pLnRvLmJlLmFuLmluc3RhbmNlb2YoTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoWycxJywgJzInLCAnMi4xJywgJzIuMicsICcyLjMnLCAnMycsICc0JywgJzQuMScsICc0LjInXSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaXRlcmF0ZSBub2RlbGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgbm9kZUxpc3QgPSBuZXcgTm9kZUxpc3QoKTtcblxuICAgICAgICBub2RlTGlzdC5hZGQoXG4gICAgICAgICAgICAobmV3IE5vZGUoJzInKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzIuMScpKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnMi4yJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCcyLjMnKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzMnKSkuYXBwZW5kQ2hpbGQobmV3IE5vZGUoJzQnKS5hcHBlbmRDaGlsZChuZXcgTm9kZSgnNC4xJykpLmFwcGVuZENoaWxkKG5ldyBOb2RlKCc0LjInKSkpKTtcblxuICAgICAgICBub2RlTGlzdC5hZGQobmV3IE5vZGUoJ3gnKSk7XG5cbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgTm9kZVJlY3Vyc2l2ZUl0ZXJhdG9yKG5vZGVMaXN0KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBleHBlY3QobikudG8uYmUuYW4uaW5zdGFuY2VvZihOb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG4udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBleHBlY3QocmVzdWx0KS50by5kZWVwLmVxdWFsKFsnMicsICcyLjEnLCAnMi4yJywgJzIuMycsICczJywgJzQnLCAnNC4xJywgJzQuMicsICd4J10pO1xuXG4gICAgfSk7XG5cbn0pOyIsICJpbXBvcnQge2dldEdsb2JhbCwgZ2V0R2xvYmFsT2JqZWN0LCBnZXRHbG9iYWxGdW5jdGlvbn0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnR2xvYmFsJywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCdnZXRHbG9iYWwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZ2xvYmFsIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCB0ID0gdHlwZW9mIGdldEdsb2JhbCgpO1xuICAgICAgICAgICAgZXhwZWN0KHQpLnRvLmJlLmVxdWFsKCdvYmplY3QnKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdnZXRHbG9iYWxGdW5jdGlvbicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBnbG9iYWwgZnVuY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdCA9IHR5cGVvZiBnZXRHbG9iYWxGdW5jdGlvbigncGFyc2VJbnQnKTtcbiAgICAgICAgICAgIGV4cGVjdCh0KS50by5iZS5lcXVhbCgnZnVuY3Rpb24nKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdnZXRHbG9iYWxPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZ2xvYmFsIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCB0ID0gdHlwZW9mIGdldEdsb2JhbE9iamVjdCgnSlNPTicpO1xuICAgICAgICAgICAgZXhwZWN0KHQpLnRvLmJlLmVxdWFsKCdvYmplY3QnKVxuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG5cbiIsICIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge3BhcnNlRGF0YVVSTH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9kYXRhdXJsLm1qc1wiO1xuXG5kZXNjcmliZSgnRGF0YXVybCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIFtcbiAgICAgICAgW1wiIGRhdGE6dGV4dC9odG1sLCUzQ2gxJTNFSGVsbG8lMkMlMjBXb3JsZCElM0MlMkZoMSUzRVwiXSxcbiAgICAgICAgW1wiZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD1VUy1BU0NJSSwlM0NoMSUzRUhlbGxvISUzQyUyRmgxJTNFXCJdLFxuICAgICAgICBbXCJkYXRhOixBJTIwYnJpZWYlMjBub3RlXCIsICdkYXRhOnRleHQvcGxhaW47Y2hhcnNldD1VUy1BU0NJSSxBJTIwYnJpZWYlMjBub3RlJ10sXG4gICAgICAgIFtcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFRTUFBQUFsUFcwaUFBQUFCbEJNVkVVQUFBRC8vLytsMlovZEFBQUFNMGxFUVZSNG5HUDQvNS9oLzErRy81OFpEckF6M0QvTWNIOHl3ODNORERlTkdlNFVnOUM5end6M2dWTE1EQS9BNlA5L0FGR0dGeWpPWFp0UUFBQUFBRWxGVGtTdVFtQ0NcIl0sXG4gICAgICAgIFtcIiBkYXRhOixIZWxsbyUyQyUyMFdvcmxkIVwiLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUksSGVsbG8lMkMlMjBXb3JsZCEnXSxcbiAgICAgICAgW1wiICAgZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQkFNQUFBQTJJYU80QUFBQUZWQk1WRVhrNU9UbjUrZnQ3ZTMxOWZYMjl2YjUrZm4vLy8rK0dVbVZBQUFBTFVsRVFWUUlIV05JQ25ZTFpuQUxUZ3BtTUdZSUZXWUlaVEEyWkZBelRURmxTREZWTXdWeVFobUF3c1lNQUtEYUJ5MGF4WC9pQUFBQUFFbEZUa1N1UW1DQyAgIFwiXSxcbiAgICAgICAgW1wiIGRhdGE6LEhlbGxvIFdvcmxkIVwiLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUksSGVsbG8lMjBXb3JsZCEnXSxcbiAgICAgICAgW1wiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQkFNQUFBQTJJYU80QUFBQUZWQk1WRVhrNU9UbjUrZnQ3ZTMxOWZYMjl2YjUrZm4vLy8rK0dVbVZBQUFBTFVsRVFWUUlIV05JQ25ZTFpuQUxUZ3BtTUdZSUZXWUlaVEEyWkZBelRURmxTREZWTXdWeVFobUF3c1lNQUtEYUJ5MGF4WC9pQUFBQUFFbEZUa1N1UW1DQ1wiXSxcbiAgICAgICAgW1wiIGRhdGE6dGV4dC9wbGFpbjtiYXNlNjQsU0dWc2JHOHNJRmR2Y214a0lRJTNEJTNEXCJdXG5cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgaWYgKGIgPT09IHVuZGVmaW5lZCkgYiA9IGEudHJpbSgpO1xuXG5cbiAgICAgICAgaXQoJ3BhcnNlRGF0YVVSTCgnICsgYSArICcpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBleHBlY3QocGFyc2VEYXRhVVJMKGEpLnRvU3RyaW5nKCkpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICB9KVxuXG4gICAgfSk7XG5cbiAgICBbXG4gICAgICAgIFtcImRhdGF4YmFzZTY0XCJdLFxuICAgICAgICBbXCJkYXRhOkhlbGxvV29ybGRcIl0sXG4gICAgICAgIFtcImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9LCUzQ2gxJTNFSGVsbG8hJTNDJTJGaDElM0VcIl0sXG4gICAgICAgIFtcImRhdGE6dGV4dC9odG1sO2NoYXJzZXQsJTNDaDElM0VIZWxsbyElM0MlMkZoMSUzRVwiLCBcImRhdGE6YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQVFNQUFBQWxQVzBpQUFBQUJsQk1WRVVBQUFELy8vK2wyWi9kQUFBQU0wbEVRVlI0bkdQNC81L2gvMStHLzU4WkRyQXozRC9NY0g4eXc4M05ERGVOR2U0VWc5Qzl6d3ozZ1ZMTURBL0E2UDkvQUZHR0Z5ak9YWnRRQUFBQUFFbEZUa1N1UW1DQ1wiXSxcbiAgICAgICAgW1wiXCJdLFxuICAgICAgICBbXCJodHRwOi8vd2lraXBlZGlhLm9yZ1wiXSxcbiAgICAgICAgW1wiYmFzZTY0XCJdLFxuICAgICAgICBbXCJpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFRTUFBQUFsUFcwaUFBQUFCbEJNVkVVQUFBRC8vLytsMlovZEFBQUFNMGxFUVZSNG5HUDQvNS9oLzErRy81OFpEckF6M0QvTWNIOHl3ODNORERlTkdlNFVnOUM5end6M2dWTE1EQS9BNlA5L0FGR0dGeWpPWFp0UUFBQUFBRWxGVGtTdVFtQ0NcIl1cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGV4Y2VwdGlvbiBwYXJzZURhdGFVUkwoJyArIGEgKyAnKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHBhcnNlRGF0YVVSTChhKSkudGhyb3coVHlwZUVycm9yKVxuICAgICAgICB9KVxuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7XG4gICAgdmFsaWRhdGVQcmltaXRpdmUsXG4gICAgdmFsaWRhdGVCb29sZWFuLFxuICAgIHZhbGlkYXRlU3RyaW5nLFxuICAgIHZhbGlkYXRlT2JqZWN0LFxuICAgIHZhbGlkYXRlQXJyYXksXG4gICAgdmFsaWRhdGVGdW5jdGlvbixcbiAgICB2YWxpZGF0ZUludGVnZXIsXG4gICAgdmFsaWRhdGVJbnN0YW5jZSxcbiAgICB2YWxpZGF0ZUl0ZXJhYmxlLFxuICAgIHZhbGlkYXRlU3ltYm9sXG59IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvdmFsaWRhdGUubWpzXCJcblxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2Jhc2UubWpzXCJcbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaWQubWpzXCJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ3ZhbGlkYXRlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVByaW1pdGl2ZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIHRydWVdLFxuICAgICAgICAgICAgW251bGwsIHRydWVdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCB0cnVlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNC41LCB0cnVlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlUHJpbWl0aXZlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB2YWxpZGF0ZVByaW1pdGl2ZShhKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlUHJpbWl0aXZlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVQcmltaXRpdmUoYSkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcudmFsaWRhdGVJbnRlZ2VyKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHRydWVdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlSW50ZWdlcignICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVJbnRlZ2VyKGEpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVJbnRlZ2VyKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVJbnRlZ2VyKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG4gICAgXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVN5bWJvbCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIHRydWVdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN5bWJvbCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gdmFsaWRhdGVTeW1ib2woYSkpLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN5bWJvbCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgbm90IHRocm93IFR5cGVFeGNlcHRpb24gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHZhbGlkYXRlU3ltYm9sKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlSXRlcmFibGUoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgdHJ1ZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIHRydWVdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUl0ZXJhYmxlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUl0ZXJhYmxlKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlSXRlcmFibGUoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUl0ZXJhYmxlKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlQm9vbGVhbigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHRydWVdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGIgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlQm9vbGVhbignICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVCb29sZWFuKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUJvb2xlYW4oJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUJvb2xlYW4oYSkpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZVN0cmluZygpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZVN0cmluZygnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoYSlcbiAgICAgICAgICAgICAgICAgICAgfSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVTdHJpbmcoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZVN0cmluZyhhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZU9iamVjdCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIHRydWVdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZU9iamVjdCgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVPYmplY3QoYSlcbiAgICAgICAgICAgICAgICAgICAgfSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVPYmplY3QoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZU9iamVjdChhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZUluc3RhbmNlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIE9iamVjdF0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBPYmplY3RdLFxuICAgICAgICAgICAgW251bGwsIE9iamVjdF0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgT2JqZWN0XSxcbiAgICAgICAgICAgIFsyLCBPYmplY3RdLFxuICAgICAgICAgICAgW2ZhbHNlLCBPYmplY3RdLFxuICAgICAgICAgICAgW3RydWUsIE9iamVjdF0sXG4gICAgICAgICAgICBbNC41LCBPYmplY3RdLFxuICAgICAgICAgICAgW3t9LCBCYXNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIE9iamVjdF0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBPYmplY3RdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUluc3RhbmNlKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJbnN0YW5jZShhLCBiKVxuICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy52YWxpZGF0ZUluc3RhbmNlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgW3t9LCBPYmplY3QsIHRydWVdLFxuICAgICAgICAgICAgW25ldyBCYXNlLCBCYXNlLCB0cnVlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnLnZhbGlkYXRlSW5zdGFuY2UoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHZhbGlkYXRlSW5zdGFuY2UoYSwgYikpLnRvLmJlLmVxdWFsKGEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnLnZhbGlkYXRlQXJyYXkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCBmYWxzZV0sXG4gICAgICAgICAgICBbMiwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCB0cnVlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpZiAoYiA9PT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgIGl0KCcudmFsaWRhdGVBcnJheSgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBcnJheShhKVxuICAgICAgICAgICAgICAgICAgICB9KS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUFycmF5KCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCBub3QgdGhyb3cgVHlwZUV4Y2VwdGlvbiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodmFsaWRhdGVBcnJheShhKSkudG8uYmUuZXF1YWwoYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcudmFsaWRhdGVGdW5jdGlvbigpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBmYWxzZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIHRydWVdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgaXQoJy52YWxpZGF0ZUZ1bmN0aW9uKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKGEpXG4gICAgICAgICAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdCgnLnZhbGlkYXRlRnVuY3Rpb24oJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIG5vdCB0aHJvdyBUeXBlRXhjZXB0aW9uICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWxpZGF0ZUZ1bmN0aW9uKGEpKS50by5iZS5lcXVhbChhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KTtcblxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1VuaXF1ZVF1ZXVlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL3VuaXF1ZXF1ZXVlLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdVbmlxdWVRdWV1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcXVldWU7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHF1ZXVlID0gbmV3IFVuaXF1ZVF1ZXVlO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnaXNFbXB0eSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdmaXJzdCBpdCBzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnYWRkIHNlcXVlbmNlIHBlZWsgYW5kIHBvbGwnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Jlc3VsdCBhLGEsYSxiJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCh7YTogMX0pKS50by5iZS5pbnN0YW5jZU9mKFVuaXF1ZVF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCh7YTogMn0pKS50by5iZS5pbnN0YW5jZU9mKFVuaXF1ZVF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5hZGQoe2E6IDN9KSkudG8uYmUuaW5zdGFuY2VPZihVbmlxdWVRdWV1ZSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucGVlaygpKS50by5kZWVwLmVxdWFsKHthOjF9KTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5wZWVrKCkpLnRvLmRlZXAuZXF1YWwoe2E6MX0pO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBvbGwoKSkudG8uZGVlcC5lcXVhbCh7YToxfSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucG9sbCgpKS50by5kZWVwLmVxdWFsKHthOjJ9KTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLnBlZWsoKSkudG8uZGVlcC5lcXVhbCh7YTozfSk7XG4gICAgICAgICAgICBleHBlY3QocXVldWUucG9sbCgpKS50by5kZWVwLmVxdWFsKHthOjN9KTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLnRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdhZGQgYW5kIGNsZWFyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QocXVldWUuaXNFbXB0eSgpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmFkZCh7YTogMX0pKS50by5iZS5pbnN0YW5jZU9mKFVuaXF1ZVF1ZXVlKTtcbiAgICAgICAgICAgIGV4cGVjdChxdWV1ZS5pc0VtcHR5KCkpLnRvLmJlLmZhbHNlO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmNsZWFyKCkpLnRvLmJlLmluc3RhbmNlT2YoVW5pcXVlUXVldWUpO1xuICAgICAgICAgICAgZXhwZWN0KHF1ZXVlLmlzRW1wdHkoKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuICAgIFxuICAgIGRlc2NyaWJlKCdhZGQgbm8gb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpPT57cXVldWUuYWRkKFtdKX0pLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZCgxKX0pLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZCh0cnVlKX0pLnRvLnRocm93KFR5cGVFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKT0+e3F1ZXVlLmFkZCgpfSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICAgICAgZXhwZWN0KCgpPT57cXVldWUuYWRkKFN5bWJvbChcIjFcIikpfSkudG8udGhyb3coVHlwZUVycm9yKVxuICAgICAgICAgICAgZXhwZWN0KCgpPT57cXVldWUuYWRkKGZ1bmN0aW9uKCl7fSl9KS50by50aHJvdyhUeXBlRXJyb3IpXG4gICAgICAgIH0pO1xuXG4gICAgfSlcbn0pIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2Jhc2UubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0Jhc2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnbmV3IEJhc2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ2lzIGluc3RhbmNlIG9mIEJhc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2UpLnRvLmJlLmluc3RhbmNlT2YoQmFzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdpcyBpbnN0YW5jZSBvZiBPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IEJhc2UpLnRvLmJlLmluc3RhbmNlT2YoT2JqZWN0KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG59KSIsICJpbXBvcnQge1xuICAgIGlzUHJpbWl0aXZlLFxuICAgIGlzQm9vbGVhbixcbiAgICBpc1N0cmluZyxcbiAgICBpc09iamVjdCxcbiAgICBpc0FycmF5LFxuICAgIGlzSW5zdGFuY2UsXG4gICAgaXNGdW5jdGlvbixcbiAgICBpc0l0ZXJhYmxlLFxuICAgIGlzSW50ZWdlcixcbiAgICBpc1N5bWJvbFxufSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3R5cGVzL2lzLm1qc1wiO1xuXG5cbmltcG9ydCB7SUR9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvaWQubWpzXCJcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ0lzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgbGV0IHByb21pc2VzID0gW11cbiAgICAgICAgaWYoIWdsb2JhbFRoaXNbJ2NyeXB0byddKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbihtID0+IHtcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzWydjcnlwdG8nXSA9IG5ldyBtLkNyeXB0bygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pOyAgICBcbiAgICBcbiAgICBkZXNjcmliZSgnLmlzUHJpbWl0aXZlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIHRydWVdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbbnVsbCwgdHJ1ZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHRydWVdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgdHJ1ZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgW3RydWUsIHRydWVdLFxuICAgICAgICAgICAgWzQuNSwgdHJ1ZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIHRydWVdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdpcy5pc1ByaW1pdGl2ZSgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzUHJpbWl0aXZlKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcbiAgICBkZXNjcmliZSgnLmlzU3ltYm9sKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgZmFsc2VdLFxuICAgICAgICAgICAgW1N5bWJvbChcImZvb1wiKSwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzU3ltYm9sKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNTeW1ib2woYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJy5pc0ludGVnZXIoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCBmYWxzZV0sXG4gICAgICAgICAgICBbMiwgdHJ1ZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNJbnRlZ2VyKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNJbnRlZ2VyKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNJdGVyYWJsZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCB0cnVlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgdHJ1ZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzSXRlcmFibGUoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpc0l0ZXJhYmxlKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNCb29sZWFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNCb29sZWFuKCcgKyB0eXBlb2YgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNCb29sZWFuKGEpKS5pcy5lcXVhbChiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCcuaXNTdHJpbmcoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgdHJ1ZV0sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbbnVsbCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIGZhbHNlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNTdHJpbmcoJyArIHR5cGVvZiBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChpc1N0cmluZyhhKSkuaXMuZXF1YWwoYilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmlzSW5zdGFuY2UoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbbmV3IElEKCksIElELCAgdHJ1ZV0sXG4gICAgICAgICAgICBbbmV3IElEKCksICgpPT57fSwgIGZhbHNlXSxcbiAgICAgICAgICAgIFsndGVzdDEnLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIHVuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW1sxLCAyLCAzXSwgdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzSW5zdGFuY2UoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkIHJldHVybiAnICsgdHlwZW9mIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNJbnN0YW5jZShhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICBcbiAgICBkZXNjcmliZSgnLmlzT2JqZWN0KCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIGZhbHNlXSxcbiAgICAgICAgICAgIFt1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFtudWxsLCBmYWxzZV0sXG4gICAgICAgICAgICBbKCkgPT4ge1xuICAgICAgICAgICAgfSwgZmFsc2VdLFxuICAgICAgICAgICAgWzIsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2VdLFxuICAgICAgICAgICAgW3BhcnNlSW50KFwiYVwiKSwgZmFsc2VdLFxuICAgICAgICAgICAgW3RydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs0LjUsIGZhbHNlXSxcbiAgICAgICAgICAgIFt7fSwgdHJ1ZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCBmYWxzZV0sXG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCBmYWxzZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2lzLmlzT2JqZWN0KCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpIHNob3VsZCByZXR1cm4gJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoaXNPYmplY3QoYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG5cbiAgICBkZXNjcmliZSgnLmlzQXJyYXkoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCBmYWxzZV0sXG4gICAgICAgICAgICBbMiwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbcGFyc2VJbnQoXCJhXCIpLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgWzQuNSwgZmFsc2VdLFxuICAgICAgICAgICAgW3t9LCBmYWxzZV0sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCB0cnVlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNBcnJheSgnICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzQXJyYXkoYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLmlzRnVuY3Rpb24oKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgZmFsc2VdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgZmFsc2VdLFxuICAgICAgICAgICAgW251bGwsIGZhbHNlXSxcbiAgICAgICAgICAgIFsoKSA9PiB7XG4gICAgICAgICAgICB9LCB0cnVlXSxcbiAgICAgICAgICAgIFsyLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlXSxcbiAgICAgICAgICAgIFtwYXJzZUludChcImFcIiksIGZhbHNlXSxcbiAgICAgICAgICAgIFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbNC41LCBmYWxzZV0sXG4gICAgICAgICAgICBbe30sIGZhbHNlXSxcbiAgICAgICAgICAgIFtbMSwgMiwgM10sIGZhbHNlXSxcbiAgICAgICAgICAgIFtTeW1ib2woXCJmb29cIiksIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnaXMuaXNGdW5jdGlvbignICsgdHlwZW9mIGEgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzRnVuY3Rpb24oYSkpLmlzLmVxdWFsKGIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiaW1wb3J0IHtJRH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy9pZC5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cbmRlc2NyaWJlKCdJRCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgIGlmKCFnbG9iYWxUaGlzWydjcnlwdG8nXSkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpc1snY3J5cHRvJ10gPSBuZXcgbS5DcnlwdG8oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICB9XG5cblxuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkb25lKClcbiAgICAgICAgfSk7XG5cbiAgICB9KTsgICAgXG4gICAgXG4gICAgZGVzY3JpYmUoJy50b1N0cmluZygpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgaWQgPSBuZXcgSUQoKVxuICAgICAgICBsZXQgcmVzdWx0ID0gaWQudG9TdHJpbmcoKTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQpLmlzLmEoJ3N0cmluZycpXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IElEKCd0ZXh0MTQyNWlkJykudG9TdHJpbmcoKSkuaXMuZXF1YWwoJ3RleHQxNDI1aWQxJylcbiAgICAgICAgICAgIGV4cGVjdChuZXcgSUQoJ3RleHQxNDI1aWQnKS50b1N0cmluZygpKS5pcy5lcXVhbCgndGV4dDE0MjVpZDInKVxuICAgICAgICAgICAgZXhwZWN0KG5ldyBJRCgndGV4dDE0MjVpZCcpLnRvU3RyaW5nKCkpLmlzLmVxdWFsKCd0ZXh0MTQyNWlkMycpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0pO1xuXG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2lzT2JqZWN0fSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge0Fic3RyYWN0Q29uc3RyYWludH0gZnJvbSBcIi4vYWJzdHJhY3QubWpzXCI7XG5cbmV4cG9ydCB7SXNPYmplY3R9XG5cbi8qKlxuICogQ29uc3RyYWludHMgYXJlIHVzZWQgdG8gZGVmaW5lIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBieSB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS5cbiAqXG4gKiBUaGUgdW5pZm9ybSBBUEkgb2YgdGhlIGNvbnN0cmFpbnRzIGFsbG93cyBjaGFpbnMgdG8gYmUgZm9ybWVkLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9jb25zdHJhaW50cy9pc29iamVjdC5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuQ29uc3RyYWludHNcbiAqIEBzdW1tYXJ5IEEgY29uc3RyYWludCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdFxuICovXG5jbGFzcyBJc09iamVjdCBleHRlbmRzIEFic3RyYWN0Q29uc3RyYWludCB7XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm4gYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgaXNWYWxpZCh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcblxuZXhwb3J0IHtBYnN0cmFjdENvbnN0cmFpbnR9XG5cbi8qKlxuICogQ29uc3RyYWludHMgYXJlIHVzZWQgdG8gZGVmaW5lIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBieSB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS5cbiAqXG4gKiBUaGUgdW5pZm9ybSBBUEkgb2YgdGhlIGNvbnN0cmFpbnRzIGFsbG93cyBjaGFpbnMgdG8gYmUgZm9ybWVkLlxuICogXG4gKiBUaGUgYWJzdHJhY3QgY29uc3RyYWludCBkZWZpbmVzIHRoZSBhcGkgZm9yIGFsbCBjb25zdHJhaW50cy4gbWFpbmx5IHRoZSBtZXRob2QgaXNWYWxpZCgpIGlzIGRlZmluZWQuXG4gKlxuICogRGVyaXZlZCBjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBtZXRob2QgaXNWYWxpZCgpLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuQ29uc3RyYWludHNcbiAqIEBzdW1tYXJ5IFRoZSBhYnN0cmFjdCBjb25zdHJhaW50XG4gKi9cbmNsYXNzIEFic3RyYWN0Q29uc3RyYWludCBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIHByb21pc2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SXNPYmplY3R9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvaXNvYmplY3QubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnSXNPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmlzVmFsaWQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGNvbnN0cmFpbnQgPSBuZXcgSXNPYmplY3QoKVxuXG4gICAgICAgIGl0KCdzaG91bGQgcmVzb2x2ZSBwcm9taXNlJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuaXNWYWxpZCh7fSkudGhlbihyID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QocikuaXMuYSgnb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJzaG91bGQgbm90IHJlYWNoZWQ6IFwiICsgZSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QWJzdHJhY3RDb25zdHJhaW50fSBmcm9tIFwiLi9hYnN0cmFjdC5tanNcIjtcblxuZXhwb3J0IHtJbnZhbGlkfVxuXG4vKipcbiAqIENvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgYnkgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogVGhlIHVuaWZvcm0gQVBJIG9mIHRoZSBjb25zdHJhaW50cyBhbGxvd3MgY2hhaW5zIHRvIGJlIGZvcm1lZC5cbiAqXG4gKiBUaGUgaW52YWxpZCBjb25zdHJhaW50IGFsbG93cyBhbiBhbHdheXMgaW52YWxpZCBxdWVyeSB0byBiZSBwZXJmb3JtZWQuIHRoaXMgY29uc3RyYWludCBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHRlc3RpbmcuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkNvbnN0cmFpbnRzXG4gKiBAc3VtbWFyeSBBIGNvbnN0cmFpbnQgdGhhdCBhbHdheXMgaW52YWxpZFxuICovXG5jbGFzcyBJbnZhbGlkIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybiBhIHJlamVjdGVkIHByb21pc2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh2YWx1ZSk7XG4gICAgfVxuXG59XG4iLCAiaW1wb3J0IHtJbnZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzXCI7XG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuXG5kZXNjcmliZSgnSW52YWxpZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCcuaXNWYWxpZCgpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgaXN2YWxpZCA9IG5ldyBJbnZhbGlkKClcblxuICAgICAgICBpdCgnc2hvdWxkIHJlc29sdmUgcHJvbWlzZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBpc3ZhbGlkLmlzVmFsaWQoKS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICBleHBlY3QoZSkudG8uYmUudW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QWJzdHJhY3RDb25zdHJhaW50fSBmcm9tIFwiLi9hYnN0cmFjdC5tanNcIjtcblxuZXhwb3J0IHtWYWxpZH1cblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKlxuICogVGhlIHZhbGlkIGNvbnN0cmFpbnQgYWxsb3dzIGFuIGFsd2F5cyB2YWxpZCBxdWVyeSB0byBiZSBwZXJmb3JtZWQuIHRoaXMgY29uc3RyYWludCBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHRlc3RpbmcuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL2NvbnN0cmFpbnRzL3ZhbGlkLm1qc1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Db25zdHJhaW50c1xuICogQHN1bW1hcnkgQSBjb25zdHJhaW50IHRoYXQgYWx3YXlzIHZhbGlkXG4gKi9cbmNsYXNzIFZhbGlkIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybiBhIHByb21pc2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgIH1cblxufVxuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtBYnN0cmFjdENvbnN0cmFpbnR9IGZyb20gXCIuL2Fic3RyYWN0Lm1qc1wiO1xuXG5leHBvcnQge0Fic3RyYWN0T3BlcmF0b3J9XG5cbi8qKlxuICogQ29uc3RyYWludHMgYXJlIHVzZWQgdG8gZGVmaW5lIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBieSB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS5cbiAqXG4gKiBUaGUgdW5pZm9ybSBBUEkgb2YgdGhlIGNvbnN0cmFpbnRzIGFsbG93cyBjaGFpbnMgdG8gYmUgZm9ybWVkLlxuICpcbiAqIE9wZXJhdG9ycyBhbGxvdyB5b3UgdG8gbGluayBjb25zdHJhaW50cyB0b2dldGhlci4gZm9yIGV4YW1wbGUsIHlvdSBjYW4gY2hlY2sgd2hldGhlciBhIHZhbHVlIGlzIFxuICogYW4gb2JqZWN0IG9yIGFuIGFycmF5LiBlYWNoIG9wZXJhdG9yIGhhcyB0d28gb3BlcmFuZHMgdGhhdCBhcmUgbGlua2VkIHRvZ2V0aGVyLlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY29weXJpZ2h0IHNjaHVrYWkgR21iSFxuICogQG1lbWJlck9mIE1vbnN0ZXIuQ29uc3RyYWludHNcbiAqIEBzdW1tYXJ5IFRoZSBhYnN0cmFjdCBvcGVyYXRvciBjb25zdHJhaW50XG4gKi9cbmNsYXNzIEFic3RyYWN0T3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cmFpbnQge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Fic3RyYWN0Q29uc3RyYWludH0gb3BlcmFudEFcbiAgICAgKiBAcGFyYW0ge0Fic3RyYWN0Q29uc3RyYWludH0gb3BlcmFudEJcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFwicGFyYW1ldGVycyBtdXN0IGJlIGZyb20gdHlwZSBBYnN0cmFjdENvbnN0cmFpbnRcIlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wZXJhbnRBLCBvcGVyYW50Qikge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICghKG9wZXJhbnRBIGluc3RhbmNlb2YgQWJzdHJhY3RDb25zdHJhaW50KSB8fCAhKG9wZXJhbnRCIGluc3RhbmNlb2YgQWJzdHJhY3RDb25zdHJhaW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInBhcmFtZXRlcnMgbXVzdCBiZSBmcm9tIHR5cGUgQWJzdHJhY3RDb25zdHJhaW50XCIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wZXJhbnRBID0gb3BlcmFudEE7XG4gICAgICAgIHRoaXMub3BlcmFudEIgPSBvcGVyYW50QjtcblxuICAgIH1cblxuXG59XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QWJzdHJhY3RPcGVyYXRvcn0gZnJvbSBcIi4vYWJzdHJhY3RvcGVyYXRvci5tanNcIjtcblxuZXhwb3J0IHtBbmRPcGVyYXRvcn1cblxuLyoqXG4gKiBDb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucyB0aGF0IG11c3QgYmUgbWV0IGJ5IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFRoZSB1bmlmb3JtIEFQSSBvZiB0aGUgY29uc3RyYWludHMgYWxsb3dzIGNoYWlucyB0byBiZSBmb3JtZWQuXG4gKlxuICogVGhlIEFuZE9wZXJhdG9yIGlzIHVzZWQgdG8gbGluayBzZXZlcmFsIGNvbnN0cmFpbnRzLiBUaGUgY29uc3RyYWludCBpcyBmdWxmaWxsZWQgaWYgYWxsIGNvbnN0cmFpbnRzIG9mIHRoZSBvcGVyYXRvcnMgYXJlIGZ1bGZpbGxlZC5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvY29uc3RyYWludHMvYW5kb3BlcmF0b3IubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkNvbnN0cmFpbnRzXG4gKiBAc3VtbWFyeSBBIGFuZCBvcGVyYXRvciBjb25zdHJhaW50XG4gKi9cbmNsYXNzIEFuZE9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRvciB7XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm4gYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAgICovXG4gICAgaXNWYWxpZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMub3BlcmFudEEuaXNWYWxpZCh2YWx1ZSksIHRoaXMub3BlcmFudEIuaXNWYWxpZCh2YWx1ZSldKTtcbiAgICB9XG5cbn1cbiIsICJpbXBvcnQge1ZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL3ZhbGlkLm1qc1wiO1xuaW1wb3J0IHtJbnZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzXCI7XG5pbXBvcnQge0FuZE9wZXJhdG9yfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2FuZG9wZXJhdG9yLm1qc1wiO1xuXG5kZXNjcmliZSgnQW5kT3BlcmF0b3InLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmlzVmFsaWQoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbbmV3IFZhbGlkKCksIG5ldyBWYWxpZCgpLCB0cnVlXSxcbiAgICAgICAgICAgIFtuZXcgVmFsaWQoKSwgbmV3IEludmFsaWQoKSwgZmFsc2VdLFxuICAgICAgICAgICAgW25ldyBJbnZhbGlkKCksIG5ldyBWYWxpZCgpLCBmYWxzZV0sXG4gICAgICAgICAgICBbbmV3IEludmFsaWQoKSwgbmV3IEludmFsaWQoKSwgZmFsc2VdXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdjb25zdHJhaW50LmlzVmFsaWQoKSBzaG91bGQgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGNvbnN0cmFpbnQgPSBuZXcgQW5kT3BlcmF0b3IoYSwgYik7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludC5pc1ZhbGlkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMgPT09IHRydWUgPyBkb25lKCkgOiBkb25lKG5ldyBFcnJvcigpKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMgPT09IHRydWUgPyBkb25lKG5ldyBFcnJvcigpKSA6IGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7QWJzdHJhY3RPcGVyYXRvcn0gZnJvbSBcIi4vYWJzdHJhY3RvcGVyYXRvci5tanNcIjtcblxuZXhwb3J0IHtPck9wZXJhdG9yfVxuXG4vKipcbiAqIENvbnN0cmFpbnRzIGFyZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25zIHRoYXQgbXVzdCBiZSBtZXQgYnkgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuXG4gKlxuICogVGhlIHVuaWZvcm0gQVBJIG9mIHRoZSBjb25zdHJhaW50cyBhbGxvd3MgY2hhaW5zIHRvIGJlIGZvcm1lZC5cbiAqXG4gKiBUaGUgT3JPcGVyYXRvciBpcyB1c2VkIHRvIGxpbmsgc2V2ZXJhbCBjb25zdHJhaW50cy4gVGhlIGNvbnN0cmFpbnQgaXMgZnVsZmlsbGVkIGlmIG9uZSBvZiB0aGUgY29uc3RyYWludHMgaXMgZnVsZmlsbGVkLlxuICpcbiAqIEBleHRlcm5hbEV4YW1wbGUgLi4vLi4vZXhhbXBsZS9jb25zdHJhaW50cy9vcm9wZXJhdG9yLm1qc1xuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5Db25zdHJhaW50c1xuICogQHN1bW1hcnkgQSBvciBvcGVyYXRvciBcbiAqL1xuY2xhc3MgT3JPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0T3BlcmF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJuIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICAgIGlzVmFsaWQodmFsdWUpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBsZXQgYSwgYjtcblxuICAgICAgICAgICAgc2VsZi5vcGVyYW50QS5pc1ZhbGlkKHZhbHVlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLyoqIGIgaGFzIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQgYW5kIHdhcyBub3QgdHJ1ZSAqL1xuICAgICAgICAgICAgICAgIGlmIChiID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2VsZi5vcGVyYW50Qi5pc1ZhbGlkKHZhbHVlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBiID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLyoqIGIgaGFzIGFscmVhZHkgYmVlbiBldmFsdWF0ZWQgYW5kIHdhcyBub3QgdHJ1ZSAqL1xuICAgICAgICAgICAgICAgIGlmIChhID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbn1cbiIsICJpbXBvcnQge1ZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL3ZhbGlkLm1qc1wiO1xuaW1wb3J0IHtJbnZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL2ludmFsaWQubWpzXCI7XG5pbXBvcnQge09yT3BlcmF0b3J9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvY29uc3RyYWludHMvb3JvcGVyYXRvci5tanNcIjtcblxuZGVzY3JpYmUoJ09yT3BlcmF0b3InLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmlzVmFsaWQoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbbmV3IFZhbGlkKCksIG5ldyBWYWxpZCgpLCB0cnVlXSxcbiAgICAgICAgICAgIFtuZXcgVmFsaWQoKSwgbmV3IEludmFsaWQoKSwgdHJ1ZV0sXG4gICAgICAgICAgICBbbmV3IEludmFsaWQoKSwgbmV3IFZhbGlkKCksIHRydWVdLFxuICAgICAgICAgICAgW25ldyBJbnZhbGlkKCksIG5ldyBJbnZhbGlkKCksIGZhbHNlXVxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnY29uc3RyYWludC5pc1ZhbGlkKCkgc2hvdWxkIHJldHVybiAnICsgYywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBjb25zdHJhaW50ID0gbmV3IE9yT3BlcmF0b3IoYSwgYik7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludC5pc1ZhbGlkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMgPT09IHRydWUgPyBkb25lKCkgOiBkb25lKG5ldyBFcnJvcigpKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMgPT09IHRydWUgPyBkb25lKG5ldyBFcnJvcigpKSA6IGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuICAgIH0pO1xufSk7XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aXNBcnJheX0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtBYnN0cmFjdENvbnN0cmFpbnR9IGZyb20gXCIuL2Fic3RyYWN0Lm1qc1wiO1xuXG5leHBvcnQge0lzQXJyYXl9XG5cbi8qKlxuICogQ29uc3RyYWludHMgYXJlIHVzZWQgdG8gZGVmaW5lIGNvbmRpdGlvbnMgdGhhdCBtdXN0IGJlIG1ldCBieSB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS5cbiAqIFxuICogVGhlIHVuaWZvcm0gQVBJIG9mIHRoZSBjb25zdHJhaW50cyBhbGxvd3MgY2hhaW5zIHRvIGJlIGZvcm1lZC5cbiAqIFxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL2NvbnN0cmFpbnRzL2lzYXJyYXkubWpzXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjMuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkNvbnN0cmFpbnRzXG4gKiBAc3VtbWFyeSBBIGNvbnN0cmFpbnQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhbiBhcnJheVxuICovXG5jbGFzcyBJc0FycmF5IGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50IHtcblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybiBhIHByb21pc2UgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodmFsdWUpO1xuICAgIH1cblxufVxuIiwgImltcG9ydCB7SXNBcnJheX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9jb25zdHJhaW50cy9pc2FycmF5Lm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ0lzQXJyYXknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBkZXNjcmliZSgnLmlzVmFsaWQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGNvbnN0cmFpbnQgPSBuZXcgSXNBcnJheSgpXG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXNvbHZlIHByb21pc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3RyYWludC5pc1ZhbGlkKFsxLDIsM10pLnRoZW4ociA9PiB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHIpLmlzLmEoJ2FycmF5Jyk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJzaG91bGQgbm90IHJlYWNoZWQ6IFwiICsgZSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICJpbXBvcnQge1ZhbGlkfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2NvbnN0cmFpbnRzL3ZhbGlkLm1qc1wiO1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ1ZhbGlkJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJy5pc1ZhbGlkKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBjb25zdHJhaW50ID0gbmV3IFZhbGlkKClcblxuICAgICAgICBpdCgnc2hvdWxkIHJlc29sdmUgcHJvbWlzZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdHJhaW50LmlzVmFsaWQoe30pLnRoZW4ociA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoXCJzaG91bGQgbm90IHJlYWNoZWQ6IFwiICsgZSkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxufSk7XG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHt0cmltU3BhY2VzfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3V0aWwvdHJpbXNwYWNlcy5tanNcIjtcblxuXG5kZXNjcmliZSgndHJpbVNwYWNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBbXG4gICAgICAgIC8vIG9uZSBzdHJva2UgaXMgZXNjcGVkIGJ5IHRoZSBqYXZhc2NyaXB0IGludGVycHJldGVyLCB0aGUgc2Vjb25kIHN0cm9rZSBlc2NhcGVzIHRoZSBzdHJva2VcbiAgICAgICAgWycgdmFsdWUgJywgJ3ZhbHVlJ10sXG4gICAgICAgIFsnIHZhbHVlXFxcXCAnLCAndmFsdWVcXFxcICddLFxuICAgICAgICBbJ1xcXFwgdmFsdWVcXFxcICcsICdcXFxcIHZhbHVlXFxcXCAnXSxcbiAgICAgICAgWydcXCB2YWx1ZVxcICcsICd2YWx1ZSddLCAgIFxuICAgICAgICBbXCIgICB2YWx1ZSBcXCBcIiwgJ3ZhbHVlJ10sIFxuXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICBpdCgndHJpbVNwYWNlcygnICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShiKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KHRyaW1TcGFjZXMoYSkpLnRvLmJlLmVxdWFsKGIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn0pO1xuICAgICIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5cbmltcG9ydCB7QmFzZX0gZnJvbSBcIi4uL3R5cGVzL2Jhc2UubWpzXCI7XG5pbXBvcnQge2lzSW50ZWdlcn0gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZUZ1bmN0aW9uLCB2YWxpZGF0ZUludGVnZXJ9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuZXhwb3J0IHtEZWFkTWFuc1N3aXRjaH1cblxuLyoqXG4gKiBUaGUgZGVhZCBtYW4ncyBzd2l0Y2ggYWxsb3dzIHRvIHNldCBhIHRpbWVyIHdoaWNoIGNhbiBiZSByZXNldCBhZ2FpbiBhbmQgYWdhaW4gd2l0aGluIGEgZGVmaW5lZCBwZXJpb2Qgb2YgdGltZS5cbiAqXG4gKiBAZXh0ZXJuYWxFeGFtcGxlIC4uLy4uL2V4YW1wbGUvdXRpbC9kZWFkbWFuc3N3aXRjaC5tanNcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI5LjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlV0aWxcbiAqIEBzdW1tYXJ5IENsYXNzIHRvIGJlIGFibGUgdG8gZXhlY3V0ZSBmdW5jdGlvbiBjaGFpbnNcbiAqL1xuIGNsYXNzIERlYWRNYW5zU3dpdGNoIGV4dGVuZHMgQmFzZSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgbmV3IGRlYWQgbWFuJ3Mgc3dpdGNoXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGRlbGF5XG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAdGhyb3cge1R5cGVFcnJvcn0gdGhlIGFyZ3VtZW50cyBtdXN0IGJlIGVpdGhlciBpbnRlZ2VyIG9yIGZ1bmN0aW9uc1xuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGFuIGludGVnZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkZWxheSwgY2FsbGJhY2spIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpbml0LmNhbGwodGhpcywgdmFsaWRhdGVJbnRlZ2VyKGRlbGF5KSwgdmFsaWRhdGVGdW5jdGlvbihjYWxsYmFjaykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtJbnRlZ2VyfHVuZGVmaW5lZH0gW2RlbGF5XVxuICAgICAqL1xuICAgIHRvdWNoKGRlbGF5KSB7XG5cbiAgICAgICAgaWYgKHRoaXNbaW50ZXJuYWxTeW1ib2xdWydpc0FscmVhZHlSdW4nXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoYXMgYWxyZWFkeSBydW4nKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSW50ZWdlcihkZWxheSkpIHtcbiAgICAgICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdWydkZWxheSddID0gZGVsYXlcbiAgICAgICAgfSBlbHNlIGlmIChkZWxheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGFyZ3VtZW50JylcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzW2ludGVybmFsU3ltYm9sXVsndGltZXInXSk7XG5cbiAgICAgICAgaW5pdENhbGxiYWNrLmNhbGwodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluaXRDYWxsYmFjaygpIHtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgc2VsZltpbnRlcm5hbFN5bWJvbF1bJ3RpbWVyJ10gPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2VsZltpbnRlcm5hbFN5bWJvbF1bJ2lzQWxyZWFkeVJ1biddID0gdHJ1ZTtcbiAgICAgICAgc2VsZltpbnRlcm5hbFN5bWJvbF1bJ2NhbGxiYWNrJ10oKTtcbiAgICB9LCBzZWxmW2ludGVybmFsU3ltYm9sXVsnZGVsYXknXSlcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtpbnRlZ2VyfSBkZWxheVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gaW5pdChkZWxheSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIHNlbGZbaW50ZXJuYWxTeW1ib2xdID0ge1xuICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgZGVsYXksXG4gICAgICAgIGlzQWxyZWFkeVJ1bjogZmFsc2UsXG4gICAgICAgIHRpbWVyOiB1bmRlZmluZWRcbiAgICB9O1xuXG4gICAgaW5pdENhbGxiYWNrLmNhbGwoc2VsZik7XG5cbn1cblxuXG5cbiIsICJpbXBvcnQge0RlYWRNYW5zU3dpdGNofSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3V0aWwvZGVhZG1hbnNzd2l0Y2gubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0RlYWRNYW5zU3dpdGNoJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ3J1biBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1bicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IG1zMSA9ICBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICBjb25zdCBkZWFkbWFuc3N3aXRjaCA9IG5ldyBEZWFkTWFuc1N3aXRjaCgxMDAsICgpID0+IHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1zMiA9ICBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IG1zMiAtIG1zMTtcbiAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBkb25lKCd0byBzaG9ydCAnICsgZGlmZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3J1biBpbnN0YW5jZSBhbmQgdG91Y2gnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBydW4nLCBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICBjb25zdCBtczEgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICBjb25zdCBkZWFkbWFuc3N3aXRjaCA9IG5ldyBEZWFkTWFuc1N3aXRjaCgxMDAsICgpID0+IHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1zMiA9IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gbXMyIC0gbXMxO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1zMSA+IG1zMikge1xuICAgICAgICAgICAgICAgICAgICBkb25lKCd0aW1pbmcgZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoJ3RvIHNob3J0ICcgKyBkaWZmKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAvLyAgIDAgbXM6IGluaXQoKSAtPiB3YWl0IDEwMCBtcyBcbiAgICAgICAgICAgIC8vICA1MCBtczogdG91Y2goKSAtPiB3YWl0IDEwMCBtc1xuICAgICAgICAgICAgLy8gICAgICAgICAgLT4gd2FpdCAxMDBcbiAgICAgICAgICAgIC8vIDEwMCBtczogdG91Y2goNTAwKSAtPiB3YWl0IDUwMCBtc1xuICAgICAgICAgICAgLy8gICAgICAgICAgLT4gd2FpdCA1MDBcbiAgICAgICAgICAgIC8vIDYwMCBtczogZXhlY3V0ZSBjYWxsYmFja1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVhZG1hbnNzd2l0Y2gudG91Y2goKVxuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlYWRtYW5zc3dpdGNoLnRvdWNoKDUwMClcbiAgICAgICAgICAgICAgICB9LCA1MClcblxuICAgICAgICAgICAgfSwgNTApXG5cblxuICAgICAgICB9KTtcbiAgICB9KTtcblxufSk7IiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSAnLi4vdHlwZXMvdmFsaWRhdGUubWpzJztcblxuZXhwb3J0IHtkZWVwRnJlZXplfVxuXG4vKipcbiAqIERlZXAgZnJlZXplIGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBvYmplY3QgdG8gYmUgZnJlZXplXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjAuMFxuICogQHJldHVybnMge29iamVjdH1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLlV0aWxcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuICovXG4gZnVuY3Rpb24gZGVlcEZyZWV6ZShvYmplY3QpIHtcblxuICAgIHZhbGlkYXRlT2JqZWN0KG9iamVjdClcblxuICAgIC8vIFJldHJpZXZlIHRoZSBkZWZpbmVkIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBvYmplY3RcbiAgICB2YXIgcHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcblxuICAgIC8vIEZyZWV6ZSBwcm9wZXJ0aWVzIGJlZm9yZSBmcmVlemluZyB5b3Vyc2VsZlxuICAgIGZvciAobGV0IG5hbWUgb2YgcHJvcE5hbWVzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IG9iamVjdFtuYW1lXTtcblxuICAgICAgICBvYmplY3RbbmFtZV0gPSAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSA/XG4gICAgICAgICAgICBkZWVwRnJlZXplKHZhbHVlKSA6IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKG9iamVjdCk7XG59XG4iLCAiaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7ZGVlcEZyZWV6ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS91dGlsL2ZyZWV6ZS5tanNcIjtcblxuXG5kZXNjcmliZSgnZGVlcEZyZWV6ZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCdkZWVwRnJlZXplIGFuIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIGZyZWV6ZSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmoxID0ge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYzoxXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgb2JqMiA9IHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6MlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZXhwZWN0KG9iajIpLnRvLm5vdC5lcWwob2JqMSlcbiAgICAgICAgICAgIG9iajEuYS5iLmMgPSAyO1xuICAgICAgICAgICAgZXhwZWN0KG9iajIpLnRvLmVxbChvYmoxKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JqMUZyZWV6ZWQgPSBkZWVwRnJlZXplKG9iajEpO1xuXG4gICAgICAgICAgICBleHBlY3Qob2JqMikudG8uZXFsKG9iajFGcmVlemVkKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvZnJlZXplXG4gICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlIHRvIHRoZSBvYmplY3QsIGV4Y2VwdGlvbiBkZXBlbmRzIG9uIG1vZGUgKHN0cmljdCBFUyAyMDE1LCBldGMpXG4gICAgICAgICAgICAgICAgb2JqMUZyZWV6ZWQuYS5iLmMgPSAzICAgIFxuICAgICAgICAgICAgfSBjYXRjaCAoXykge1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4cGVjdChvYmoyKS50by5lcWwob2JqMUZyZWV6ZWQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG59KTsiLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gJy4uL3R5cGVzL2Jhc2UubWpzJztcbmltcG9ydCB7aXNGdW5jdGlvbn0gZnJvbSAnLi4vdHlwZXMvaXMubWpzJztcblxuZXhwb3J0IHtDb21wYXJhdG9yfVxuXG4vKipcbiAqIFRoZSBjb21wYXJhdG9yIGFsbG93cyBhIGNvbXBhcmlzb24gZnVuY3Rpb24gdG8gYmUgYWJzdHJhY3RlZC5cbiAqIFxuICogVGhlIGZvbGxvd2luZyBhcmUgc29tZSBleGFtcGxlcyBvZiB0aGUgYXBwbGljYXRpb24gb2YgdGhlIGNsYXNzLlxuICpcbiAqIGBgYFxuICogbmV3IENvbXBhcmF0b3IoKS5sZXNzVGhhbk9yRXF1YWwoMiwgNSkgLy8gXHUyMUE2IHRydWVcbiAqIG5ldyBDb21wYXJhdG9yKCkuZ3JlYXRlclRoYW4oNCwgMikgLy8gXHUyMUE2IHRydWVcbiAqIG5ldyBDb21wYXJhdG9yKCkuZXF1YWwoNCwgNCkgLy8gXHUyMUE2IHRydWVcbiAqIG5ldyBDb21wYXJhdG9yKCkuZXF1YWwoNCwgNSkgLy8gXHUyMUE2IGZhbHNlXG4gKiBgYGBcbiAqXG4gKiBZb3UgY2FuIGFsc28gcGFzcyB5b3VyIG93biBjb21wYXJpc29uIGZ1bmN0aW9uLCBhbmQgdGh1cyBkZWZpbmUgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogYGBgXG4gKiBuZXcgQ29tcGFyYXRvcihmdW5jdGlvbiAoYSwgYikge1xuICogICAgICBpZiAoYS52ID09PSBiLnYpIHJldHVybiAwO1xuICogICAgICAgICByZXR1cm4gYS52IDwgYi52ID8gLTEgOiAxO1xuICogICAgICB9KS5lcXVhbCh7djogMn0sIHt2OiAyfSk7ICAvLyBcdTIxQTYgdHJ1ZVxuICogYGBgXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL3V0aWwvY29tcGFyYXRvci5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMy4wXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5VdGlsXG4gKi9cbmNsYXNzIENvbXBhcmF0b3IgZXh0ZW5kcyBCYXNlIHtcblxuICAgIC8qKlxuICAgICAqIGNyZWF0ZSBuZXcgY29tcGFyYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtNb25zdGVyLlV0aWx+ZXhhbXBsZUNhbGxiYWNrfSBbY2FsbGJhY2tdIENvbXBhcmF0b3IgY2FsbGJhY2tcbiAgICAgKiBAdGhyb3cge1R5cGVFcnJvcn0gdW5zdXBwb3J0ZWQgdHlwZVxuICAgICAqIEB0aHJvdyB7VHlwZUVycm9yfSBpbXByYWN0aWNhbCBjb21wYXJpc29uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2FsbGJhY2spIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZSA9IGNhbGxiYWNrXG4gICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInVuc3VwcG9ydGVkIHR5cGVcIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgY29tcGFyZSBmdW5jdGlvblxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0geyp9IGFcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Kn0gYlxuICAgICAgICAgICAgICogQHJldHVybiB7aW50ZWdlcn0gLTEsIDAgb3IgMVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmUgPSBmdW5jdGlvbiAoYSwgYikge1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiaW1wcmFjdGljYWwgY29tcGFyaXNvblwiLCBcInR5cGVzL2NvbXBhcmF0b3IubWpzXCIpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogMTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNoYW5nZXMgdGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRvcnNcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0NvbXBhcmF0b3J9XG4gICAgICovXG4gICAgcmV2ZXJzZSgpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLmNvbXBhcmU7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IChhLCBiKSA9PiBvcmlnaW5hbChiLCBhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHR3byB2YXJpYWJsZXMgYXJlIGVxdWFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSBhXG4gICAgICogQHBhcmFtIHsqfSBiXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGVxdWFsKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShhLCBiKSA9PT0gMDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB2YXJpYWJsZSBgYWAgaXMgZ3JlYXRlciB0aGFuIGBiYFxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSBhXG4gICAgICogQHBhcmFtIHsqfSBiXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGdyZWF0ZXJUaGFuKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShhLCBiKSA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZhcmlhYmxlIGBhYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYGJgXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFcbiAgICAgKiBAcGFyYW0geyp9IGJcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ3JlYXRlclRoYW5PckVxdWFsKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JlYXRlclRoYW4oYSwgYikgfHwgdGhpcy5lcXVhbChhLCBiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdmFyaWFibGUgYGFgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgYmBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gYVxuICAgICAqIEBwYXJhbSB7Kn0gYlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBsZXNzVGhhbk9yRXF1YWwoYSwgYikge1xuICAgICAgICByZXR1cm4gdGhpcy5sZXNzVGhhbihhLCBiKSB8fCB0aGlzLmVxdWFsKGEsIGIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB2YXJpYWJsZSBhIGlzIGxlc3MgdGhhbiBiXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGFcbiAgICAgKiBAcGFyYW0geyp9IGJcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgbGVzc1RoYW4oYSwgYikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlKGEsIGIpIDwgMDtcbiAgICB9XG5cblxufVxuXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBvcGVyYXRvclxuICpcbiAqIGBgYFxuICogbmV3IENvbXBhcmF0b3IoZnVuY3Rpb24gKGEsIGIpIHtcbiAqICAgICAgaWYgKGEudiA9PT0gYi52KSByZXR1cm4gMDtcbiAqICAgICAgICAgcmV0dXJuIGEudiA8IGIudiA/IC0xIDogMTtcbiAqICAgICAgfSkuZXF1YWwoe3Y6IDJ9LCB7djogMn0pOyAgLy8gXHUyMUE2IHRydWVcbiAqIGBgYFxuICpcbiAqIEBjYWxsYmFjayBNb25zdGVyLlV0aWx+ZXhhbXBsZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7aW50ZWdlcn0gLTEsIDAgb3IgMVxuICogQG1lbWJlck9mIE1vbnN0ZXIuVXRpbFxuICogQHNlZSBNb25zdGVyLlV0aWwuQ29tcGFyYXRvclxuICovXG5cbiIsICJpbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtDb21wYXJhdG9yfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL3V0aWwvY29tcGFyYXRvci5tanNcIjtcblxuXG5kZXNjcmliZSgnQ29tcGFyYXRvcicsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGUgbmV3IGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29tcGFyYXRvciBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKSkudG8uYmUuYSgnb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29tcGFyYXRvciBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgfSkpLnRvLmJlLmEoJ29iamVjdCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgQ29tcGFyYXRvcih0cnVlKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBUeXBlRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IENvbXBhcmF0b3IoXCJ0ZXN0XCIpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZXF1YWwoKScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbJ3Rlc3QxJywgXCJ0ZXN0XCIsIGZhbHNlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIGZhbHNlXSxcbiAgICAgICAgICAgIFs1LjEsIDUuMSwgdHJ1ZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgWy00LCAtNCwgdHJ1ZV0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdzaG91bGQgY29tcGFyZSAnICsgYSArICcgYW5kICcgKyBiICsgJyByZXR1cm4gJyArIGMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKS5lcXVhbChhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2VxdWFsKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIHRydWVdLFxuICAgICAgICAgICAgWyd0ZXN0MScsIDVdLFxuICAgICAgICAgICAgWyd0ZXN0MScsIG51bGxdLFxuICAgICAgICAgICAgWyd0ZXN0MScsIHBhcnNlSW50KFwiYVwiKV0sXG4gICAgICAgICAgICBbZmFsc2UsIDVdLFxuICAgICAgICAgICAgW3VuZGVmaW5lZCwgbnVsbF0sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4gbmV3IENvbXBhcmF0b3IoKS5lcXVhbChhLCBiKSkudG8udGhyb3coVHlwZUVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dyZWF0ZXJUaGFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIC00LCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIDQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmdyZWF0ZXJUaGFuKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncmV2ZXJzZSgpLmdyZWF0ZXJUaGFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIC00LCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIDQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLnJldmVyc2UoKS5ncmVhdGVyVGhhbihhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dyZWF0ZXJUaGFuT3JFcXVhbCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCBcInRlc3RcIiwgdHJ1ZV0sXG4gICAgICAgICAgICBbNS4xLCA1LCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUuMSwgdHJ1ZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbZmFsc2UsIHRydWUsIGZhbHNlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgZmFsc2UsIHRydWVdLFxuICAgICAgICAgICAgWy00LCAtNCwgdHJ1ZV0sXG4gICAgICAgICAgICBbLTQsIDQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmdyZWF0ZXJUaGFuT3JFcXVhbChhLCBiKSkuaXMuZXF1YWwoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2xlc3NUaGFuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCBmYWxzZV0sXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCB0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICBbZmFsc2UsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIC00LCBmYWxzZV0sXG4gICAgICAgICAgICBbLTQsIDQsIGZhbHNlXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ3Nob3VsZCBjb21wYXJlICcgKyBhICsgJyBhbmQgJyArIGIgKyAnIHJldHVybiAnICsgYywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmxlc3NUaGFuKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZG9jdW1lbnRhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biAuLi4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKS5sZXNzVGhhbk9yRXF1YWwoMiwgNSkpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICBleHBlY3QobmV3IENvbXBhcmF0b3IoKS5ncmVhdGVyVGhhbig0LCAyKSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcigpLmVxdWFsKDQsIDQpKS50by5iZS50cnVlO1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkuZXF1YWwoNCwgNSkpLnRvLmJlLmZhbHNlO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIHdpdGggb3duIGZ1bmN0aW9uIC4uLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgQ29tcGFyYXRvcihmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIGlmIChhLnYgPT09IGIudikgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEudiA8IGIudiA/IC0xIDogMTtcbiAgICAgICAgICAgIH0pLmVxdWFsKHt2OiAyfSwge3Y6IDJ9KSkudG8uYmUudHJ1ZTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnbGVzc1RoYW5PckVxdWFsKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyd0ZXN0MScsIFwidGVzdFwiLCB0cnVlXSxcbiAgICAgICAgICAgIFs1LjEsIDUsIHRydWVdLFxuICAgICAgICAgICAgWzUuMSwgNS4xLCB0cnVlXSxcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCB0cnVlXSxcbiAgICAgICAgICAgIFtmYWxzZSwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgICAgICAgW2ZhbHNlLCBmYWxzZSwgdHJ1ZV0sXG4gICAgICAgICAgICBbLTQsIC00LCB0cnVlXSxcbiAgICAgICAgICAgIFstNCwgNCwgZmFsc2VdLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnc2hvdWxkIGNvbXBhcmUgJyArIGEgKyAnIGFuZCAnICsgYiArICcgcmV0dXJuICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KG5ldyBDb21wYXJhdG9yKCkubGVzc1RoYW5PckVxdWFsKGEsIGIpKS5pcy5lcXVhbChjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cblxufSk7IiwgImltcG9ydCB7Y2xvbmV9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9jbG9uZS5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmRlc2NyaWJlKCdDbG9uZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGNsYXNzIEEge1xuICAgICAgICBjb25zdHJ1Y3RvcihiKSB7XG4gICAgICAgICAgICB0aGlzLmIgPSBiXG4gICAgICAgIH1cblxuICAgICAgICBhKCkge1xuXG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgY2xhc3MgQiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGIpIHtcbiAgICAgICAgICAgIHRoaXMuYiA9IGJcbiAgICAgICAgfVxuXG4gICAgICAgIGEoKSB7XG5cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZ2V0Q2xvbmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJET05FXCJcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9XG5cbiAgICBkZXNjcmliZSgnLmNsb25lKEIpIHdpdGggZ2V0Q2xvbmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCcuY2xvbmUoQikgc2hvdWxkIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBiID0gbmV3IEIoe1xuICAgICAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgICAgICAgeTogMSwgZDogbmV3IEEoMSksIHo6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHIgPSBjbG9uZShiKTtcbiAgICAgICAgICAgIGV4cGVjdChiKS50by5iZS5pbnN0YW5jZU9mKEIpXG4gICAgICAgICAgICBleHBlY3Qocikubm90LmVxdWFsKGIpO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHIpKS5lcXVhbChKU09OLnN0cmluZ2lmeSgnRE9ORScpKTtcblxuICAgICAgICB9KTtcbiAgICB9KVxuICAgIFxuICAgIGRlc2NyaWJlKCcuY2xvbmUoQSknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCcuY2xvbmUoQSkgc2hvdWxkIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0gbmV3IEEoe1xuICAgICAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgICAgICAgeTogMSwgZDogbmV3IEEoMSksIHo6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGIgPSBjbG9uZShhKTtcbiAgICAgICAgICAgIGV4cGVjdChhKS50by5iZS5pbnN0YW5jZU9mKEEpXG4gICAgICAgICAgICBleHBlY3QoYikudG8uYmUuaW5zdGFuY2VPZihBKVxuICAgICAgICAgICAgZXhwZWN0KGIpLm5vdC5lcXVhbChhKTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShhKSkuZXF1YWwoSlNPTi5zdHJpbmdpZnkoYikpO1xuXG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICAvLyBub2RlanMgZG9lcyBub3QgaGF2ZSBhIERPTVxuICAgIGlmICh0eXBlb2YgRG9jdW1lbnRGcmFnbWVudCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBkZXNjcmliZSgnLmNsb25lKERvY3VtZW50RnJhZ21lbnQpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaXQoJy5jbG9uZShEb2N1bWVudEZyYWdtZW50KSBzaG91bGQgc2FtZSBEb2N1bWVudEZyYWdtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBhID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgICAgICAgIGxldCBiID0gY2xvbmUoYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGIpLmVxdWFsKGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgZGVzY3JpYmUoJy5jbG9uZShudWxsKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdHlwZW9mIG51bGwgcmVzdWx0cyBpbiAnb2JqZWN0Jy4gIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDEzLzEwL3R5cGVvZi1udWxsLmh0bWxcbiAgICAgICAgaXQoJy5jbG9uZShudWxsKSBzaG91bGQgIG51bGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgYSA9IG51bGxcbiAgICAgICAgICAgIGxldCBiID0gY2xvbmUoYSk7XG4gICAgICAgICAgICBleHBlY3QoYikuZXF1YWwoYSk7XG4gICAgICAgICAgICBleHBlY3QoYikudG8uYmUubnVsbDtcbiAgICAgICAgICAgIGV4cGVjdChhKS50by5iZS5udWxsO1xuICAgICAgICB9KTtcbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJy5jbG9uZSh1bmRlZmluZWQpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnLmNsb25lKHVuZGVmaW5lZCkgc2hvdWxkICB1bmRlZmluZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgYSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgbGV0IGIgPSBjbG9uZShhKTtcbiAgICAgICAgICAgIGV4cGVjdChhID09PSBiKS50by5iZS50cnVlXG4gICAgICAgICAgICBleHBlY3QodHlwZW9mIGIgPT09ICd1bmRlZmluZWQnKS50by5iZS50cnVlXG4gICAgICAgICAgICBleHBlY3QoYSA9PT0gdW5kZWZpbmVkKS50by5iZS50cnVlXG4gICAgICAgICAgICBleHBlY3QoYiA9PT0gdW5kZWZpbmVkKS50by5iZS50cnVlXG4gICAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnLmNsb25lKG9iamVjdCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJy5jbG9uZSh7fSkgc2hvdWxkICBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgYSA9IHt9XG4gICAgICAgICAgICBsZXQgYiA9IGNsb25lKGEpO1xuICAgICAgICAgICAgZXhwZWN0KHR5cGVvZiBiID09PSAnb2JqZWN0JykudG8uYmUudHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnLmNsb25lKHt4OjF9KSBzaG91bGQgIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBhID0ge3g6IDF9XG4gICAgICAgICAgICBsZXQgYiA9IGNsb25lKGEpO1xuICAgICAgICAgICAgZXhwZWN0KGEueCkuaXMuZXF1YWwoYi54KVxuICAgICAgICB9KTtcbiAgICB9KVxuICAgIGRlc2NyaWJlKCcuY2xvbmUoZnVuY3Rpb24pJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCcuY2xvbmUoZnVuY3Rpb24pIHNob3VsZCAgZnVuY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgYSA9ICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiID0gY2xvbmUoYSk7XG4gICAgICAgICAgICBleHBlY3QodHlwZW9mIGIgPT09ICdmdW5jdGlvbicpLnRvLmJlLnRydWVcbiAgICAgICAgfSk7XG5cbiAgICB9KVxuXG4gICAgZGVzY3JpYmUoJy5jbG9uZSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndGVzdDEnLCAnc3RyaW5nJ10sXG4gICAgICAgICAgICBbdW5kZWZpbmVkLCAndW5kZWZpbmVkJ10sXG4gICAgICAgICAgICBbbnVsbCwgJ29iamVjdCddLCAvLyB0eXBlb2YgbnVsbCByZXN1bHRzIGluICdvYmplY3QnLiAgaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTMvMTAvdHlwZW9mLW51bGwuaHRtbFxuICAgICAgICAgICAgWygpID0+IHtcbiAgICAgICAgICAgIH0sICdmdW5jdGlvbiddLFxuICAgICAgICAgICAgWzIsICdudW1iZXInXSxcbiAgICAgICAgICAgIFtmYWxzZSwgJ2Jvb2xlYW4nXSxcbiAgICAgICAgICAgIFt0cnVlLCAnYm9vbGVhbiddLFxuICAgICAgICAgICAgWzQuNSwgJ251bWJlciddLFxuICAgICAgICAgICAgW3t9LCAnb2JqZWN0J10sXG4gICAgICAgICAgICBbWzEsIDIsIDNdLCAnb2JqZWN0J10sIC8vIGFycmF5IGlzdCBhdWNoIHR5cGUgb2JqZWN0XG4gICAgICAgICAgICBbU3ltYm9sKFwiZm9vXCIpLCAnc3ltYm9sJ10sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcblxuXG4gICAgICAgICAgICBpdCgnLmNsb25lKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpIHNob3VsZCAgJyArIGIgKyAnICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgYyA9IGNsb25lKGEpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCh0eXBlb2YgYykuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxufSk7XG5cbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aW50ZXJuYWxTeW1ib2x9IGZyb20gXCIuLi9jb25zdGFudHMubWpzXCI7XG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxGdW5jdGlvbn0gZnJvbSBcIi4uL3R5cGVzL2dsb2JhbC5tanNcIjtcbmltcG9ydCB7aXNGdW5jdGlvbiwgaXNJbnRlZ2VyfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge1F1ZXVlfSBmcm9tIFwiLi4vdHlwZXMvcXVldWUubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlRnVuY3Rpb24sIHZhbGlkYXRlSW50ZWdlcn0gZnJvbSBcIi4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuXG5leHBvcnQge1Byb2Nlc3Npbmd9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ2FsbGJhY2sge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSB7aW50fHVuZGVmaW5lZH0gdGltZVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZSkge1xuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXSA9IHtcbiAgICAgICAgICAgIGNhbGxiYWNrOiB2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrKSxcbiAgICAgICAgICAgIHRpbWU6IHZhbGlkYXRlSW50ZWdlcih0aW1lID8/IDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gIHsqfSBkYXRhXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKi9cbiAgICBydW4oZGF0YSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgICAgICAgZ2V0R2xvYmFsRnVuY3Rpb24oJ3NldFRpbWVvdXQnKSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHNlbGZbaW50ZXJuYWxTeW1ib2xdLmNhbGxiYWNrKGRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGZbaW50ZXJuYWxTeW1ib2xdLnRpbWUpO1xuXG5cbiAgICAgICAgfSlcblxuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGFsbG93cyB0byBleGVjdXRlIHNldmVyYWwgZnVuY3Rpb25zIGluIG9yZGVyLlxuICpcbiAqIEZ1bmN0aW9ucyBhbmQgdGltZW91dHMgY2FuIGJlIHBhc3NlZC4gSWYgYSB0aW1lb3V0IGlzIHBhc3NlZCwgaXQgYXBwbGllcyB0byBhbGwgZnVydGhlciBmdW5jdGlvbnMuXG4gKiBJbiB0aGUgZXhhbXBsZVxuICpcbiAqIGB0aW1lb3V0MSwgZnVuY3Rpb24xLCBmdW5jdGlvbjIsIGZ1bmN0aW9uMywgdGltZW91dDIsIGZ1bmN0aW9uNGBcbiAqXG4gKiB0aGUgdGltZW91dDEgaXMgdmFsaWQgZm9yIHRoZSBmdW5jdGlvbnMgMSwgMiBhbmQgMyBhbmQgdGhlIHRpbWVvdXQyIGZvciB0aGUgZnVuY3Rpb240LlxuICpcbiAqIFNvIHRoZSBleGVjdXRpb24gdGltZSBpcyB0aW1lb3V0MSt0aW1lb3V0MSt0aW1lb3V0MSt0aW1lb3V0MlxuICpcbiAqIFRoZSByZXN1bHQgb2YgYHJ1bigpYCBpcyBhIHByb21pc2UuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL3V0aWwvcHJvY2Vzc2luZy5tanNcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjIxLjBcbiAqIEBtZW1iZXJPZiBNb25zdGVyLlV0aWxcbiAqIEBzdW1tYXJ5IENsYXNzIHRvIGJlIGFibGUgdG8gZXhlY3V0ZSBmdW5jdGlvbiBjaGFpbnNcbiAqL1xuY2xhc3MgUHJvY2Vzc2luZyBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG5ldyBQcm9jZXNzaW5nXG4gICAgICpcbiAgICAgKiBGdW5jdGlvbnMgYW5kIHRpbWVvdXRzIGNhbiBiZSBwYXNzZWQuIElmIGEgdGltZW91dCBpcyBwYXNzZWQsIGl0IGFwcGxpZXMgdG8gYWxsIGZ1cnRoZXIgZnVuY3Rpb25zLlxuICAgICAqIEluIHRoZSBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgdGltZW91dDEsIGZ1bmN0aW9uMSwgZnVuY3Rpb24yLCBmdW5jdGlvbjMsIHRpbWVvdXQyLCBmdW5jdGlvbjRgXG4gICAgICpcbiAgICAgKiB0aGUgdGltZW91dDEgaXMgdmFsaWQgZm9yIHRoZSBmdW5jdGlvbnMgMSwgMiBhbmQgMyBhbmQgdGhlIHRpbWVvdXQyIGZvciB0aGUgZnVuY3Rpb240LlxuICAgICAqXG4gICAgICogU28gdGhlIGV4ZWN1dGlvbiB0aW1lIGlzIHRpbWVvdXQxK3RpbWVvdXQxK3RpbWVvdXQxK3RpbWVvdXQyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ludH0gdGltZW91dCBUaW1lb3V0XG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICAgKiBAdGhyb3cge1R5cGVFcnJvcn0gdGhlIGFyZ3VtZW50cyBtdXN0IGJlIGVpdGhlciBpbnRlZ2VyIG9yIGZ1bmN0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdID0ge1xuICAgICAgICAgICAgcXVldWU6IG5ldyBRdWV1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCB0aW1lID0gMFxuXG4gICAgICAgIGZvciAoY29uc3QgWywgYXJnXSBvZiBPYmplY3QuZW50cmllcyhhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICBpZiAoaXNJbnRlZ2VyKGFyZykgJiYgYXJnID49IDApIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gYXJnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGFyZykpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXS5xdWV1ZS5hZGQobmV3IENhbGxiYWNrKGFyZywgdGltZSkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoZSBhcmd1bWVudHMgbXVzdCBiZSBlaXRoZXIgaW50ZWdlciBvciBmdW5jdGlvbnMnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmdW5jdGlvbiB3aXRoIHRoZSBkZXNpcmVkIHRpbWVvdXRcbiAgICAgKiBJZiBubyB0aW1lb3V0IGlzIHNwZWNpZmllZCwgdGhlIHRpbWVvdXQgb2YgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSB7aW50fHVuZGVmaW5lZH0gdGltZVxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgZnVuY3Rpb25cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICovXG4gICAgYWRkKGNhbGxiYWNrLCB0aW1lKSB7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxTeW1ib2xdLnF1ZXVlLmFkZChuZXcgQ2FsbGJhY2soY2FsbGJhY2ssIHRpbWUpKVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBkZWZpbmVkIGZ1bmN0aW9ucyBpbiBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG4gICAgcnVuKGRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzW2ludGVybmFsU3ltYm9sXS5xdWV1ZS5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1tpbnRlcm5hbFN5bWJvbF0ucXVldWUucG9sbCgpLnJ1bihkYXRhKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnJ1bihyZXN1bHQpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxufVxuIiwgImltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge1Byb2Nlc3Npbmd9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdXRpbC9wcm9jZXNzaW5nLm1qc1wiO1xuXG5cbmRlc2NyaWJlKCdQcm9jZXNzaW5nJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ3J1biBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biBtYW55IGZ1bmN0aW9uJywgZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgbGV0IHQgPSArbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgY29uc3QgZGVzaXJlZERlbGF5ID0gMjAwO1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0KGRlc2lyZWREZWxheSsxMDApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBkZWxheSAxMiBcbiAgICAgICAgICAgIG5ldyBQcm9jZXNzaW5nKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfSwgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB9LCBkZXNpcmVkRGVsYXksZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH0pLnJ1bigndGVzdCcpLnRoZW4oKHYpID0+IHtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdChjb3VudGVyKS50by5iZS5lcXVhbCg0KTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHYgPT09ICd0ZXN0JykudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZGVsYXlcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KCtuZXcgRGF0ZSgpID4gdCArIGRlc2lyZWREZWxheSsxKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIG9uZSBmdW5jdGlvbicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICAgICAgbmV3IFByb2Nlc3NpbmcoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSkucnVuKCd0ZXN0JykudGhlbigodikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2ID09PSAndGVzdCcpLnRvLmJlLnRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkb25lKClcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG5cblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJ1biBubyBmdW5jdGlvbicsIGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICAgICAgbmV3IFByb2Nlc3NpbmcoKS5ydW4oJ3Rlc3QnKS50aGVuKCh2KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QodiA9PT0gJ3Rlc3QnKS50by5iZS50cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuXG5cbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZSBuZXcgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBQcm9jZXNzaW5nIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUHJvY2Vzc2luZygpKS50by5iZS5hKCdvYmplY3QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBQcm9jZXNzaW5nIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUHJvY2Vzc2luZyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB9KSkudG8uYmUuYSgnb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgVHlwZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IG5ldyBQcm9jZXNzaW5nKHRydWUpKS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IFR5cGVFcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBuZXcgUHJvY2Vzc2luZyhcInRlc3RcIikpLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxufSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2V4dGVuZC5tanNcIjtcbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5cbmNsYXNzIE1vY2tGb3JFeHRlbmRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5cblxuZGVzY3JpYmUoJ2V4dGVuZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIFtcbiAgICAgICAgW1xuICAgICAgICAgICAne1widGhla2V5XCI6e319Jyx7fSx7dGhla2V5Om5ldyBNb2NrRm9yRXh0ZW5kc30gXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgICd7XCJhXCI6e1wiYlwiOltcIjFcIixcIjJcIixcIjNcIl19fScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIzXCJcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sICAgICAgICBbXG4gICAgICAgICAgICAne1wiYVwiOntcImJcIjoxLFwiZFwiOjF9fScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGQ6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgICd7XCJhXCI6e1wiYlwiOjEsXCJkXCI6e1wieFwiOltcImNhclwiXSxcImZcIjp0cnVlLFwiZ1wiOltdfX19JyxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYjogMSxcbiAgICAgICAgICAgICAgICAgICAgZDoge3g6IFtcImNhclwiXX1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGc6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG5cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICBsZXQgZCA9IGRhdGEuc2hpZnQoKVxuICAgICAgICBsZXQgYSA9IGRhdGFcblxuICAgICAgICBpdCgnLmV4dGVuZCgnICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnKSBzaG91bGQgcmVzdWx0IGluICcgKyBkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgeCA9IGV4dGVuZC5hcHBseSh0aGlzLCBhKTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeSh4KSkuaXMuZXF1YWwoZCk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG4gICAgW1xuXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiAxLFxuICAgICAgICAgICAgICAgICAgICBkOiBbXCJjYXJcIl1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGc6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgbGV0IGEgPSBkYXRhXG5cbiAgICAgICAgaXQoJy5leHRlbmQoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykgc2hvdWxkIHRocm93IEVycm9yICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBleHRlbmQuYXBwbHkodGhpcywgYSkpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG59KSIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7UGlwZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL3BpcGUubWpzXCI7XG5pbXBvcnQge2luaXRKU0RPTX0gZnJvbSBcIi4uLy4uL3V0aWwvanNkb20ubWpzXCI7XG5cblxuZGVzY3JpYmUoJ1BpcGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICBpZighZ2xvYmFsVGhpc1snY3J5cHRvJ10pIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goaW1wb3J0KFwiQHBlY3VsaWFyL3dlYmNyeXB0b1wiKS50aGVuKG0gPT4ge1xuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXNbJ2NyeXB0byddID0gbmV3IG0uQ3J5cHRvKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICB9KTtcblxuICAgIH0pOyAgICBcbiAgICBcbiAgICBkZXNjcmliZSgncnVuIGRpZmZlcmVudCBwaXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgW1xuICAgICAgICAgICAgWydwYXRoOmIgfCBpZjp4OlxcXFwgJywge2E6dHJ1ZX0sICcgJ10sICAgLy8gJ1xcXFwgJy5sZW5ndGggXHUyMUE2IDJcbiAgICAgICAgICAgIFsncGF0aDphIHwgaWY6eDpcXFxcICcsIHthOnRydWV9LCAneCddLFxuICAgICAgICAgICAgWydub3AnLCAnYWJjZGVmZ2hpamtsbW5vcCcsICdhYmNkZWZnaGlqa2xtbm9wJ10sXG5cbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ1BpcGUucnVuKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbmV3IFBpcGUoYSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdC5ydW4oYik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHIpLnRvLmJlLmVxbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cblxuICAgIGRlc2NyaWJlKCduZXcgUGlwZSBzaG91bGQgY3JlYXRlIG5ldyBJbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBJbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChuZXcgUGlwZSgnJykpLnRvLmJlLmluc3RhbmNlT2YoUGlwZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIEluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBQaXBlKCdpbmRleDphfHRvdXBwZXIgfHByZWZpeDphJykucnVuKHthOiBcInRlc3RcIn0pKS50by5iZS5lcXVhbCgnYVRFU1QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydpbmRleDphfHRvdXBwZXIgfHByZWZpeDphJywge2E6IFwidGVzdFwifSwgJ2FURVNUJ10sXG4gICAgICAgICAgICBbJ3BhdGg6YS5iLmMuZCB8IHRvdXBwZXIgfCBwcmVmaXg6SGVsbG9cXFxcICcsIHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiBcIndvcmxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sICdIZWxsbyBXT1JMRCddLFxuICAgICAgICAgICAgWydwYXRoOmEuYi5jfGluZGV4OmR8dG91cHBlciB8c3VmZml4OngnLCB7YToge2I6IHtjOiB7ZDogXCJ0ZXN0XCJ9fX19LCAnVEVTVHgnXSxcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGMgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ25ldyBQaXBlKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbmV3IFBpcGUoYSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0KHQucnVuKGIpKS50by5iZS5lcXVhbChjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG59KTtcbiIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvaXMubWpzXCI7XG5pbXBvcnQge3ZhbGlkYXRlU3RyaW5nfSBmcm9tIFwiLi4vdHlwZXMvdmFsaWRhdGUubWpzXCI7XG5pbXBvcnQge2Nsb25lfSBmcm9tIFwiLi4vdXRpbC9jbG9uZS5tanNcIjtcbmltcG9ydCB7REVMSU1JVEVSLCBQYXRoZmluZGVyLCBXSUxEQ0FSRH0gZnJvbSBcIi4vcGF0aGZpbmRlci5tanNcIjtcblxuZXhwb3J0IHtidWlsZE1hcCwgUEFSRU5ULCBhc3NlbWJsZVBhcnRzfVxuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKi9cbmNvbnN0IFBBUkVOVCA9ICdeJztcblxuXG4vKipcbiAqIFdpdGggdGhlIGhlbHAgb2YgdGhlIGZ1bmN0aW9uIGBidWlsZE1hcCgpYCwgbWFwcyBjYW4gYmUgZWFzaWx5IGNyZWF0ZWQgZnJvbSBkYXRhIG9iamVjdHMuXG4gKlxuICogRWl0aGVyIGEgc2ltcGxlIGRlZmluaXRpb24gYGEuYi5jYCBvciBhIHRlbXBsYXRlIGAke2EuYi5jfWAgY2FuIGJlIHNwZWNpZmllZCBhcyB0aGUgcGF0aC5cbiAqIEtleSBhbmQgdmFsdWUgY2FuIGJlIGVpdGhlciBhIGRlZmluaXRpb24gb3IgYSB0ZW1wbGF0ZS4gVGhlIGtleSBkb2VzIG5vdCBoYXZlIHRvIGJlIGRlZmluZWQuXG4gKlxuICogVGhlIHRlbXBsYXRlcyBkZXRlcm1pbmUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGtleXMgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbWFwLiBFaXRoZXIgYSBzaW5nbGUgdmFsdWVcbiAqIGBpZGAgY2FuIGJlIHRha2VuIG9yIGEgY29tcG9zaXRlIGtleSBgJHtpZH0gJHtuYW1lfWAgY2FuIGJlIHVzZWQuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gYWNjZXNzIHZhbHVlcyBvZiB0aGUgcGFyZW50IGRhdGEgc2V0LCB5b3UgaGF2ZSB0byB1c2UgdGhlIGBeYCBjaGFyYWN0ZXIgYCR7aWR9ICR7Xi5uYW1lfWAuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL2RhdGEvYnVpbGRtYXAubWpzXG4gKiBAcGFyYW0geyp9IHN1YmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfE1vbnN0ZXIuRGF0YX5leGFtcGxlU2VsZWN0b3JDYWxsYmFja30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVUZW1wbGF0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5VGVtcGxhdGVdXG4gKiBAcGFyYW0ge01vbnN0ZXIuRGF0YX5leGFtcGxlRmlsdGVyQ2FsbGJhY2t9IFtmaWx0ZXJdXG4gKiBAcmV0dXJuIHsqfVxuICogQG1lbWJlck9mIE1vbnN0ZXIuRGF0YVxuICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBhIGZ1bmN0aW9uXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHRoZSBzZWxlY3RvciBjYWxsYmFjayBtdXN0IHJldHVybiBhIG1hcFxuICovXG5mdW5jdGlvbiBidWlsZE1hcChzdWJqZWN0LCBzZWxlY3RvciwgdmFsdWVUZW1wbGF0ZSwga2V5VGVtcGxhdGUsIGZpbHRlcikge1xuICAgIHJldHVybiBhc3NlbWJsZVBhcnRzKHN1YmplY3QsIHNlbGVjdG9yLCBmaWx0ZXIsIGZ1bmN0aW9uICh2LCBrLCBtKSB7XG4gICAgICAgIGsgPSBidWlsZCh2LCBrZXlUZW1wbGF0ZSwgayk7XG4gICAgICAgIHYgPSBidWlsZCh2LCB2YWx1ZVRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy5zZXQoaywgdik7XG4gICAgfSk7XG5cbn1cblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHN1YmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfE1vbnN0ZXIuRGF0YX5leGFtcGxlU2VsZWN0b3JDYWxsYmFja30gc2VsZWN0b3JcbiAqIEBwYXJhbSB7TW9uc3Rlci5EYXRhfmV4YW1wbGVGaWx0ZXJDYWxsYmFja30gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtNYXB9XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHNlbGVjdG9yIGlzIG5laXRoZXIgYSBzdHJpbmcgbm9yIGEgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gYXNzZW1ibGVQYXJ0cyhzdWJqZWN0LCBzZWxlY3RvciwgZmlsdGVyLCBjYWxsYmFjaykge1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcCgpO1xuXG4gICAgbGV0IG1hcDtcbiAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcbiAgICAgICAgbWFwID0gc2VsZWN0b3Ioc3ViamVjdClcbiAgICAgICAgaWYgKCEobWFwIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhlIHNlbGVjdG9yIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgbWFwJyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKHNlbGVjdG9yKSkge1xuICAgICAgICBtYXAgPSBuZXcgTWFwO1xuICAgICAgICBidWlsZEZsYXRNYXAuY2FsbChtYXAsIHN1YmplY3QsIHNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzZWxlY3RvciBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBhIGZ1bmN0aW9uJylcbiAgICB9XG5cbiAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgbWFwLmZvckVhY2goKHYsIGssIG0pID0+IHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlci5jYWxsKG0sIHYsIGspICE9PSB0cnVlKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjay5jYWxsKHJlc3VsdCwgdiwgaywgbSk7XG5cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBzdWJqZWN0XG4gKiBAcGFyYW0gc2VsZWN0b3JcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBwYXJlbnRNYXBcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRmxhdE1hcChzdWJqZWN0LCBzZWxlY3Rvciwga2V5LCBwYXJlbnRNYXApIHtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXM7XG4gICAgY29uc3QgY3VycmVudE1hcCA9IG5ldyBNYXA7XG5cbiAgICBjb25zdCByZXN1bHRMZW5ndGggPSByZXN1bHQuc2l6ZTtcblxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkga2V5ID0gW107XG5cbiAgICBsZXQgcGFydHMgPSBzZWxlY3Rvci5zcGxpdChERUxJTUlURVIpO1xuICAgIGxldCBjdXJyZW50ID0gXCJcIiwgY3VycmVudFBhdGggPSBbXTtcbiAgICBkbyB7XG5cbiAgICAgICAgY3VycmVudCA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICAgIGN1cnJlbnRQYXRoLnB1c2goY3VycmVudCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IFdJTERDQVJEKSB7XG5cbiAgICAgICAgICAgIGxldCBmaW5kZXIgPSBuZXcgUGF0aGZpbmRlcihzdWJqZWN0KTtcbiAgICAgICAgICAgIGxldCBtYXA7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbWFwID0gZmluZGVyLmdldFZpYShjdXJyZW50UGF0aC5qb2luKERFTElNSVRFUikpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxldCBhID0gZTtcbiAgICAgICAgICAgICAgICBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIG9dIG9mIG1hcCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGNvcHlLZXkgPSBjbG9uZShrZXkpO1xuXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGgubWFwKChhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvcHlLZXkucHVzaCgoYSA9PT0gV0lMRENBUkQpID8gayA6IGEpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGxldCBrayA9IGNvcHlLZXkuam9pbihERUxJTUlURVIpO1xuICAgICAgICAgICAgICAgIGxldCBzdWIgPSBidWlsZEZsYXRNYXAuY2FsbChyZXN1bHQsIG8sIHBhcnRzLmpvaW4oREVMSU1JVEVSKSwgY29weUtleSwgbyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3Qoc3ViKSAmJiBwYXJlbnRNYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdWJbUEFSRU5UXSA9IHBhcmVudE1hcDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50TWFwLnNldChraywgc3ViKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cblxuICAgIH0gd2hpbGUgKHBhcnRzLmxlbmd0aCA+IDApO1xuXG4gICAgLy8gbm8gc2V0IGluIGNoaWxkIHJ1blxuICAgIGlmIChyZXN1bHRMZW5ndGggPT09IHJlc3VsdC5zaXplKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIG9dIG9mIGN1cnJlbnRNYXApIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXQoaywgbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3ViamVjdDtcblxufVxuXG5cbi8qKlxuICogV2l0aCB0aGUgaGVscCBvZiB0aGlzIGZpbHRlciBjYWxsYmFjaywgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQuIE9ubHkgaWYgdGhlIGZpbHRlciBmdW5jdGlvbiByZXR1cm5zIHRydWUsIHRoZSB2YWx1ZSBpcyB0YWtlbiBmb3IgdGhlIG1hcC5cbiAqXG4gKiBAY2FsbGJhY2sgTW9uc3Rlci5EYXRhfmV4YW1wbGVGaWx0ZXJDYWxsYmFja1xuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAgS2V5XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKiBAc2VlIHtAbGluayBNb25zdGVyLkRhdGEuYnVpbGRNYXB9XG4gKi9cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZWx5IHRvIGEgc3RyaW5nIHNlbGVjdG9yIGEgY2FsbGJhY2sgY2FuIGJlIHNwZWNpZmllZC4gdGhpcyBtdXN0IHJldHVybiBhIG1hcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHtidWlsZE1hcH0gZnJvbSAnQHNjaHVrYWkvbW9uc3Rlci9zb3VyY2UvZGF0YS9idWlsZG1hcC5tanMnO1xuICpcbiAqIGxldCBvYmogPSB7XG4gKiAgICAgICAgICAgICAgICBcImRhdGFcIjogW1xuICogICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiQ2Fzc2FuZHJhXCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW5yaWNobWVudFwiOiB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAxLCBsYWJlbDogXCJYWFNcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDIsIGxhYmVsOiBcIlhTXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAzLCBsYWJlbDogXCJTXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiA0LCBsYWJlbDogXCJMXCIsIHByaWNlOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMjAsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIlllc3NleSFcIixcbiAqICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnJpY2htZW50XCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDEsIGxhYmVsOiBcIlhYU1wiLCBwcmljZTogW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJ30sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnfVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMiwgbGFiZWw6IFwiWFNcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDMsIGxhYmVsOiBcIlNcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDQsIGxhYmVsOiBcIkxcIiwgcHJpY2U6IFtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQyd9LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJ31cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICBdXG4gKiAgICAgICAgICAgIH07XG4gKlxuICogbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAqICAgICAgICAgICAgICAgIGxldCBtID0gbmV3IE1hcDtcbiAqXG4gKiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpLCBiXSBvZiBPYmplY3QuZW50cmllcyhzdWJqZWN0LmRhdGEpKSB7XG4gKlxuICogICAgICAgICAgICAgICAgICAgIGxldCBrZXkxID0gaTtcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaiwgY10gb2YgT2JqZWN0LmVudHJpZXMoYi5lbnJpY2htZW50LnZhcmlhbnRzKSkge1xuICogICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5MiA9IGo7XG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCBkXSBvZiBPYmplY3QuZW50cmllcyhjLnByaWNlKSkge1xuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkzID0gaztcbiAqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLm5hbWUgPSBiLm5hbWU7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmxhYmVsID0gYy5sYWJlbDtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuaWQgPSBba2V5MSwga2V5Miwga2V5M10uam9pbignLicpO1xuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uc2V0KGQuaWQsIGQpO1xuICogICAgICAgICAgICAgICAgICAgICAgICB9XG4gKlxuICogICAgICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgIHJldHVybiBtO1xuICogICAgICAgICAgICB9XG4gKlxuICogbGV0IG1hcCA9IGJ1aWxkTWFwKG9iaiwgY2FsbGJhY2ssICcke25hbWV9ICR7dmt9JywgJyR7aWR9JylcbiAqXG4gKiAvLyBcdTIxQTYgTWFwKDMpIHtcbiAqIC8vICBcIjAuMC4wXCI6XCJDYXNzYW5kcmEgMTIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIwLjAuMVwiOlwiQ2Fzc2FuZHJhIDEyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMC4xLjBcIjpcIkNhc3NhbmRyYSAyMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjAuMS4xXCI6XCJDYXNzYW5kcmEgMjIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIwLjIuMFwiOlwiQ2Fzc2FuZHJhIDMyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMC4yLjFcIjpcIkNhc3NhbmRyYSAzMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjAuMy4wXCI6XCJDYXNzYW5kcmEgNDIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIwLjMuMVwiOlwiQ2Fzc2FuZHJhIDQyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4wLjBcIjpcIlllc3NleSEgMTIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIxLjAuMVwiOlwiWWVzc2V5ISAxMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjEuMS4wXCI6XCJZZXNzZXkhIDIyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4xLjFcIjpcIlllc3NleSEgMjIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIxLjIuMFwiOlwiWWVzc2V5ISAzMi4xMiBcdTIwQUNcIixcbiAqIC8vICBcIjEuMi4xXCI6XCJZZXNzZXkhIDMyLjEyIFx1MjBBQ1wiLFxuICogLy8gIFwiMS4zLjBcIjpcIlllc3NleSEgNDIuMTIgXHUyMEFDXCIsXG4gKiAvLyAgXCIxLjMuMVwiOlwiWWVzc2V5ISA0Mi4xMiBcdTIwQUNcIlxuICogLy8gfVxuICpcbiAqIEBjYWxsYmFjayBNb25zdGVyLkRhdGF+ZXhhbXBsZVNlbGVjdG9yQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gc3ViamVjdCBzdWJqZWN0XG4gKiBAcmV0dXJuIE1hcFxuICogQGxpY2Vuc2UgQUdQTHYzXG4gKiBAc2luY2UgMS4xNy4wXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKiBAc2VlIHtAbGluayBNb25zdGVyLkRhdGEuYnVpbGRNYXB9XG4gKi9cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBzdWJqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGRlZmluaXRpb25cbiAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlXG4gKiBAcmV0dXJuIHsqfVxuICovXG5mdW5jdGlvbiBidWlsZChzdWJqZWN0LCBkZWZpbml0aW9uLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBpZiAoZGVmaW5pdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlID8gZGVmYXVsdFZhbHVlIDogc3ViamVjdDtcbiAgICB2YWxpZGF0ZVN0cmluZyhkZWZpbml0aW9uKTtcblxuICAgIGNvbnN0IHJlZ2V4cCA9IC8oPzxwbGFjZWhvbGRlcj5cXCR7KD88cGF0aD5bYS16XFxeQS1aLlxcLV8wLTldKil9KS9nbVxuICAgIGNvbnN0IGFycmF5ID0gWy4uLmRlZmluaXRpb24ubWF0Y2hBbGwocmVnZXhwKV07XG5cbiAgICBsZXQgZmluZGVyID0gbmV3IFBhdGhmaW5kZXIoc3ViamVjdCk7XG5cbiAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmaW5kZXIuZ2V0VmlhKGRlZmluaXRpb24pO1xuICAgIH1cblxuICAgIGFycmF5LmZvckVhY2goKGEpID0+IHtcbiAgICAgICAgbGV0IGdyb3VwcyA9IGE/LlsnZ3JvdXBzJ107XG4gICAgICAgIGxldCBwbGFjZWhvbGRlciA9IGdyb3Vwcz8uWydwbGFjZWhvbGRlciddXG4gICAgICAgIGlmIChwbGFjZWhvbGRlciA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHBhdGggPSBncm91cHM/LlsncGF0aCddXG5cbiAgICAgICAgbGV0IHYgPSBmaW5kZXIuZ2V0VmlhKHBhdGgpO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB2ID0gZGVmYXVsdFZhbHVlO1xuXG4gICAgICAgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uLnJlcGxhY2VBbGwocGxhY2Vob2xkZXIsIHYpO1xuXG5cbiAgICB9KVxuXG4gICAgcmV0dXJuIGRlZmluaXRpb247XG5cbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7YnVpbGRNYXB9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9idWlsZG1hcC5tanNcIjtcblxuXG5kZXNjcmliZSgnYnVpbGRNYXAnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgY29udmVydE1hcFJlc3VsdCA9IGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIGlmIChyIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICByID0gT2JqZWN0LmZyb21FbnRyaWVzKHIpO1xuICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHIgPSByLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydE1hcFJlc3VsdChlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIG9dIG9mIE9iamVjdC5lbnRyaWVzKHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJba10gPSBjb252ZXJ0TWFwUmVzdWx0KG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIGRlc2NyaWJlKCdidWlsZCBNYXAgd2l0aCBjYWxsYmFjaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ2RlZmluaXRpb24gc2hvdWxkIHJldHVybiBtYXAgd2l0aCBzdWIgYW5kIHBhcmVudCBrZXlzJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJDYXNzYW5kcmFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZW5yaWNobWVudFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAxLCBsYWJlbDogXCJYWFNcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDIsIGxhYmVsOiBcIlhTXCIsIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiAzLCBsYWJlbDogXCJTXCIsIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiA0LCBsYWJlbDogXCJMXCIsIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiWWVzc2V5IVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnJpY2htZW50XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDEsIGxhYmVsOiBcIlhYU1wiLCBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMiwgbGFiZWw6IFwiWFNcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDMsIGxhYmVsOiBcIlNcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDQsIGxhYmVsOiBcIkxcIiwgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgY2FsbGJhY2sgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgIGxldCBtID0gbmV3IE1hcDtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ksIGJdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmplY3QuZGF0YSkpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5MSA9IGk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaiwgY10gb2YgT2JqZWN0LmVudHJpZXMoYi5lbnJpY2htZW50LnZhcmlhbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleTIgPSBqO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCBkXSBvZiBPYmplY3QuZW50cmllcyhjLnByaWNlKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleTMgPSBrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5uYW1lID0gYi5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQubGFiZWwgPSBjLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuaWQgPSBba2V5MSwga2V5Miwga2V5M10uam9pbignLicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5zZXQoZC5pZCwgZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG1hcCA9IGJ1aWxkTWFwKG9iaiwgY2FsbGJhY2ssICcke25hbWV9ICR7bGFiZWx9JywgJyR7aWR9JylcbiAgICAgICAgICAgIGxldCBpID0gY29udmVydE1hcFJlc3VsdChtYXApO1xuXG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoaSkpLnRvLmJlLmVxdWFsKCd7XCIwLjAuMFwiOlwiQ2Fzc2FuZHJhIFhYU1wiLFwiMC4wLjFcIjpcIkNhc3NhbmRyYSBYWFNcIixcIjAuMS4wXCI6XCJDYXNzYW5kcmEgWFNcIixcIjAuMS4xXCI6XCJDYXNzYW5kcmEgWFNcIixcIjAuMi4wXCI6XCJDYXNzYW5kcmEgU1wiLFwiMC4yLjFcIjpcIkNhc3NhbmRyYSBTXCIsXCIwLjMuMFwiOlwiQ2Fzc2FuZHJhIExcIixcIjAuMy4xXCI6XCJDYXNzYW5kcmEgTFwiLFwiMS4wLjBcIjpcIlllc3NleSEgWFhTXCIsXCIxLjAuMVwiOlwiWWVzc2V5ISBYWFNcIixcIjEuMS4wXCI6XCJZZXNzZXkhIFhTXCIsXCIxLjEuMVwiOlwiWWVzc2V5ISBYU1wiLFwiMS4yLjBcIjpcIlllc3NleSEgU1wiLFwiMS4yLjFcIjpcIlllc3NleSEgU1wiLFwiMS4zLjBcIjpcIlllc3NleSEgTFwiLFwiMS4zLjFcIjpcIlllc3NleSEgTFwifScpO1xuXG4gICAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdidWlsZCBzdWJtYXAgd2l0aCAqJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnZGVmaW5pdGlvbiBzaG91bGQgcmV0dXJuIHtcIjEwXCI6XCJDYXNzYW5kcmEgMTBcIixcIjIwXCI6XCJZZXNzZXkhIDIwXCJ9JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJDYXNzYW5kcmFcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiWWVzc2V5IVwiLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IG1hcCA9IGJ1aWxkTWFwKG9iaiwgJ2RhdGEuKicsICcke25hbWV9ICR7aWR9JywgJyR7aWR9JylcbiAgICAgICAgICAgIGxldCBpID0gY29udmVydE1hcFJlc3VsdChtYXApO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGkpKS50by5iZS5lcXVhbCgne1wiMTBcIjpcIkNhc3NhbmRyYSAxMFwiLFwiMjBcIjpcIlllc3NleSEgMjBcIn0nKTtcblxuICAgICAgICB9KVxuICAgIH0pXG5cblxuICAgIGRlc2NyaWJlKCdidWlsZCBzdWJtYXAgd2l0aCAqKicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ2RlZmluaXRpb24gc2hvdWxkIHJldHVybiBNYXAnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhc3NhbmRyYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnJpY2htZW50XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDEsIGxhYmVsOiBcIlhYU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnLCBpZDogMX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMTIuMTIgXHUyMEFDJywgaWQ6IDJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMiwgbGFiZWw6IFwiWFNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJywgaWQ6IDN9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzIyLjEyIFx1MjBBQycsIGlkOiA0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDMsIGxhYmVsOiBcIlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMzIuMTIgXHUyMEFDJywgaWQ6IDV9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQycsIGlkOiA2fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IDQsIGxhYmVsOiBcIkxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDIuMTIgXHUyMEFDJywgaWQ6IDd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQycsIGlkOiA4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJZZXNzZXkhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImVucmljaG1lbnRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMSwgbGFiZWw6IFwiWFhTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzEyLjEyIFx1MjBBQycsIGlkOiA5fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcxMi4xMiBcdTIwQUMnLCBpZDogMTB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMiwgbGFiZWw6IFwiWFNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnMjIuMTIgXHUyMEFDJywgaWQ6IDExfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICcyMi4xMiBcdTIwQUMnLCBpZDogMTJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogMywgbGFiZWw6IFwiU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICczMi4xMiBcdTIwQUMnLCBpZDogMTN9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzMyLjEyIFx1MjBBQycsIGlkOiAxNH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IFwiTFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dms6ICc0Mi4xMiBcdTIwQUMnLCBpZDogMTV9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2azogJzQyLjEyIFx1MjBBQycsIGlkOiAxNn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZrOiAnNDQuMTIgXHUyMEFDJywgaWQ6IDE3fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgbWFwID0gYnVpbGRNYXAob2JqLCAnZGF0YS4qLmVucmljaG1lbnQudmFyaWFudHMuKi5wcmljZS4qJywgJyR7dmt9ICR7Xi5sYWJlbH0gJHteLl4ubmFtZX0nLCAnJHteLl4uc2t1fScpXG4gICAgICAgICAgICBsZXQgaSA9IGNvbnZlcnRNYXBSZXN1bHQobWFwKTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShpKSkudG8uYmUuZXF1YWwoJ3tcImRhdGEuMC5lbnJpY2htZW50LnZhcmlhbnRzLjAucHJpY2UuMFwiOlwiMTIuMTIgXHUyMEFDIFhYUyBDYXNzYW5kcmFcIixcImRhdGEuMC5lbnJpY2htZW50LnZhcmlhbnRzLjAucHJpY2UuMVwiOlwiMTIuMTIgXHUyMEFDIFhYUyBDYXNzYW5kcmFcIixcImRhdGEuMC5lbnJpY2htZW50LnZhcmlhbnRzLjEucHJpY2UuMFwiOlwiMjIuMTIgXHUyMEFDIFhTIENhc3NhbmRyYVwiLFwiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMS5wcmljZS4xXCI6XCIyMi4xMiBcdTIwQUMgWFMgQ2Fzc2FuZHJhXCIsXCJkYXRhLjAuZW5yaWNobWVudC52YXJpYW50cy4yLnByaWNlLjBcIjpcIjMyLjEyIFx1MjBBQyBTIENhc3NhbmRyYVwiLFwiZGF0YS4wLmVucmljaG1lbnQudmFyaWFudHMuMi5wcmljZS4xXCI6XCIzMi4xMiBcdTIwQUMgUyBDYXNzYW5kcmFcIixcImRhdGEuMC5lbnJpY2htZW50LnZhcmlhbnRzLjMucHJpY2UuMFwiOlwiNDIuMTIgXHUyMEFDIEwgQ2Fzc2FuZHJhXCIsXCJkYXRhLjAuZW5yaWNobWVudC52YXJpYW50cy4zLnByaWNlLjFcIjpcIjQyLjEyIFx1MjBBQyBMIENhc3NhbmRyYVwiLFwiZGF0YS4xLmVucmljaG1lbnQudmFyaWFudHMuMC5wcmljZS4wXCI6XCIxMi4xMiBcdTIwQUMgWFhTIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjAucHJpY2UuMVwiOlwiMTIuMTIgXHUyMEFDIFhYUyBZZXNzZXkhXCIsXCJkYXRhLjEuZW5yaWNobWVudC52YXJpYW50cy4xLnByaWNlLjBcIjpcIjIyLjEyIFx1MjBBQyBYUyBZZXNzZXkhXCIsXCJkYXRhLjEuZW5yaWNobWVudC52YXJpYW50cy4xLnByaWNlLjFcIjpcIjIyLjEyIFx1MjBBQyBYUyBZZXNzZXkhXCIsXCJkYXRhLjEuZW5yaWNobWVudC52YXJpYW50cy4yLnByaWNlLjBcIjpcIjMyLjEyIFx1MjBBQyBTIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjIucHJpY2UuMVwiOlwiMzIuMTIgXHUyMEFDIFMgWWVzc2V5IVwiLFwiZGF0YS4xLmVucmljaG1lbnQudmFyaWFudHMuMy5wcmljZS4wXCI6XCI0Mi4xMiBcdTIwQUMgTCBZZXNzZXkhXCIsXCJkYXRhLjEuZW5yaWNobWVudC52YXJpYW50cy4zLnByaWNlLjFcIjpcIjQyLjEyIFx1MjBBQyBMIFllc3NleSFcIixcImRhdGEuMS5lbnJpY2htZW50LnZhcmlhbnRzLjMucHJpY2UuMlwiOlwiNDQuMTIgXHUyMEFDIEwgWWVzc2V5IVwifScpO1xuXG4gICAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdleGFtcGxlY29kZScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgZXhhbXBsZSBjb2RlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJDYXNzYW5kcmFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJlZXRcIjogXCI0OTMtNDEwNSBWdWxwdXRhdGUgU3RyZWV0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjaXR5XCI6IFwiU2F1bXVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6aXBcIjogXCI1MjYyOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJIb2xseVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhZGRyZXNzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInN0cmVldFwiOiBcIjE3NjIgRWdldCBSZC5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNpdHlcIjogXCJTY2h3YWxiYWNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6aXBcIjogXCI5NTIzNDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDMwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiR3V5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFkZHJlc3NcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3RyZWV0XCI6IFwiOTU3LTM4OCBTb2xsaWNpdHVkaW4gQXZlbnVlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjaXR5XCI6IFwiUGFuY2hpXHUwMEUwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6aXBcIjogXCI0MjA3MjlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IG1hcDtcbiAgICAgICAgICAgIG1hcCA9IGJ1aWxkTWFwKG9iaiwgJ2RhdGEuKicsICcke25hbWV9ICgke2FkZHJlc3MuemlwfSAke2FkZHJlc3MuY2l0eX0pJywgJ2lkJylcbiAgICAgICAgICAgIGV4cGVjdChtYXApLnRvLmJlLmluc3RhbmNlT2YoTWFwKTtcblxuICAgICAgICAgICAgbWFwID0gYnVpbGRNYXAob2JqLCAnZGF0YS4qJywgJyR7bmFtZX0gKCR7YWRkcmVzcy56aXB9ICR7YWRkcmVzcy5jaXR5fSknKVxuICAgICAgICAgICAgZXhwZWN0KG1hcCkudG8uYmUuaW5zdGFuY2VPZihNYXApO1xuXG4gICAgICAgICAgICBtYXAgPSBidWlsZE1hcChvYmosICdkYXRhLionLCAnJHtuYW1lfSAoJHthZGRyZXNzLnppcH0gJHthZGRyZXNzLmNpdHl9KScsICdpZCcsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZVsnaWQnXSA+PSAyMCkgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBleHBlY3QobWFwKS50by5iZS5pbnN0YW5jZU9mKE1hcCk7XG4gICAgICAgIH0pO1xuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdidWlsZG1hcCgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBvYmoxID0ge1xuICAgICAgICAgICAgZGF0YXNldDoge1xuICAgICAgICAgICAgICAgIFwiMTAwODJcIjoge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgMVwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgMVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjEwMDg0XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDJcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBNYXAgSW5zdGFuY2UuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KGJ1aWxkTWFwKHt9LCAnJykpLnRvLmJlLmluc3RhbmNlT2YoTWFwKTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBbXG4gICAgICAgICAgICBbb2JqMSwgJ2RhdGFzZXQuKicsICdhZGRyZXNzJywgJ3tcImRhdGFzZXQuMTAwODJcIjpcIkhlcmUgMVwiLFwiZGF0YXNldC4xMDA4NFwiOlwiSGVyZSAyXCJ9J10sXG4gICAgICAgICAgICBbb2JqMSwgJ3gnLCB1bmRlZmluZWQsICd7fSddLFxuICAgICAgICAgICAgW29iajEsICdkYXRhc2V0LionLCAnbmFtZScsICd7XCJkYXRhc2V0LjEwMDgyXCI6XCJUZXN0IDFcIixcImRhdGFzZXQuMTAwODRcIjpcIlRlc3QgMlwifSddLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGQgPSBkYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaXQoJ2J1aWxkTWFwKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcsJyArIEpTT04uc3RyaW5naWZ5KGIpICsgJywnICsgSlNPTi5zdHJpbmdpZnkoYykgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShkKSArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gYnVpbGRNYXAoYSwgYiwgYyk7XG4gICAgICAgICAgICAgICAgbGV0IG0gPSBKU09OLnN0cmluZ2lmeShjb252ZXJ0TWFwUmVzdWx0KHQpKTtcbiAgICAgICAgICAgICAgICBleHBlY3QobSkudG8uYmUuZXF1YWwoZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xufSk7XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vY29uc3RhbnRzLm1qc1wiO1xuXG5pbXBvcnQge0Jhc2V9IGZyb20gXCIuLi90eXBlcy9iYXNlLm1qc1wiO1xuaW1wb3J0IHtwYXJzZURhdGFVUkx9IGZyb20gXCIuLi90eXBlcy9kYXRhdXJsLm1qc1wiO1xuaW1wb3J0IHtpc1N0cmluZ30gZnJvbSBcIi4uL3R5cGVzL2lzLm1qc1wiO1xuaW1wb3J0IHtQcm94eU9ic2VydmVyfSBmcm9tIFwiLi4vdHlwZXMvcHJveHlvYnNlcnZlci5tanNcIjtcbmltcG9ydCB7dmFsaWRhdGVPYmplY3R9IGZyb20gXCIuLi90eXBlcy92YWxpZGF0ZS5tanNcIjtcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tIFwiLi9leHRlbmQubWpzXCI7XG5pbXBvcnQge1BhdGhmaW5kZXJ9IGZyb20gXCIuL3BhdGhmaW5kZXIubWpzXCI7XG5cbmV4cG9ydCB7RGF0YXNvdXJjZX1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge3N5bWJvbH1cbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjQuMFxuICovXG5jb25zdCBpbnRlcm5hbERhdGFTeW1ib2wgPSBTeW1ib2woJ2ludGVybmFsRGF0YScpO1xuXG4vKipcbiAqIFRoZSBkYXRhc291cmNlIGNsYXNzIGlzIHRoZSBiYXNpcyBmb3IgZGVhbGluZyB3aXRoIGRpZmZlcmVudCBkYXRhIHNvdXJjZXMuXG4gKiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgZGF0YVxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi9leGFtcGxlL2RhdGEvZGF0YXNvdXJjZS5tanNcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEBzdW1tYXJ5IFRoZSBkYXRhc291cmNlIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgYWNjZXNzIHRvIGRhdGEgb2JqZWN0cy5cbiAqL1xuY2xhc3MgRGF0YXNvdXJjZSBleHRlbmRzIEJhc2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpc1tpbnRlcm5hbFN5bWJvbF0gPSBuZXcgUHJveHlPYnNlcnZlcih7XG4gICAgICAgICAgICAnb3B0aW9ucyc6IGV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0cylcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0gPSBuZXcgUHJveHlPYnNlcnZlcih7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgIFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGF0dGFjaCBhIG5ldyBvYnNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7RGF0YXNvdXJjZX1cbiAgICAgKi9cbiAgICBhdHRhY2hPYnNlcnZlcihvYnNlcnZlcikge1xuICAgICAgICB0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0uYXR0YWNoT2JzZXJ2ZXIob2JzZXJ2ZXIpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRldGFjaCBhIG9ic2VydmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlclxuICAgICAqIEByZXR1cm5zIHtEYXRhc291cmNlfVxuICAgICAqL1xuICAgIGRldGFjaE9ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXNbaW50ZXJuYWxEYXRhU3ltYm9sXS5kZXRhY2hPYnNlcnZlcihvYnNlcnZlcilcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjb250YWluc09ic2VydmVyKG9ic2VydmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsRGF0YVN5bWJvbF0uY29udGFpbnNPYnNlcnZlcihvYnNlcnZlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlZCBjbGFzc2VzIGNhbiBvdmVycmlkZSBhbmQgZXh0ZW5kIHRoaXMgbWV0aG9kIGFzIGZvbGxvd3MuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICogICAgICAgIG15VmFsdWU6dHJ1ZVxuICAgICAqICAgIH0pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb3B0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtEYXRhc291cmNlfVxuICAgICAqL1xuICAgIHNldE9wdGlvbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBuZXcgUGF0aGZpbmRlcih0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRTdWJqZWN0KClbJ29wdGlvbnMnXSkuc2V0VmlhKHBhdGgsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybiB7RGF0YXNvdXJjZX1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9wdGlvbnMgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvblxuICAgICAqL1xuICAgIHNldE9wdGlvbnMob3B0aW9ucykge1xuXG4gICAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9uc0pTT04ob3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBleHRlbmQoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0U3ViamVjdCgpWydvcHRpb25zJ10sIHNlbGYuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG5lc3RlZCBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgYnkgcGF0aCBgYS5iLmNgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlXG4gICAgICogQHJldHVybiB7Kn1cbiAgICAgKi9cbiAgICBnZXRPcHRpb24ocGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgUGF0aGZpbmRlcih0aGlzW2ludGVybmFsU3ltYm9sXS5nZXRSZWFsU3ViamVjdCgpWydvcHRpb25zJ10pLmdldFZpYShwYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqL1xuICAgIHJlYWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICovXG4gICAgd3JpdGUoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpXG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHJlYWwgb2JqZWN0XG4gICAgICogXG4gICAgICogQHJldHVybiB7T2JqZWN0fEFycmF5fVxuICAgICAqL1xuICAgIGdldCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBzZWxmW2ludGVybmFsRGF0YVN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZGF0YVxuICAgICAqIEByZXR1cm4ge0RhdGFzb3VyY2V9XG4gICAgICovXG4gICAgc2V0KGRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGZbaW50ZXJuYWxEYXRhU3ltYm9sXS5zZXRTdWJqZWN0KGRhdGEpO1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgb3B0aW9ucyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQganNvbiBkZWZpbml0aW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uc0pTT04oZGF0YSkge1xuICAgIGlmIChpc1N0cmluZyhkYXRhKSkge1xuXG4gICAgICAgIC8vIHRoZSBjb25maWd1cmF0aW9uIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSBkYXRhIHVybC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBkYXRhVXJsID0gcGFyc2VEYXRhVVJMKGRhdGEpO1xuICAgICAgICAgICAgZGF0YSA9IGRhdGFVcmwuY29udGVudDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgIH1cblxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgb2JqID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgIHZhbGlkYXRlT2JqZWN0KG9iaik7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBvcHRpb25zIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBqc29uIGRlZmluaXRpb24gKGFjdHVhbDogJyArIGRhdGEgKyAnKS4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7fTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7RGF0YXNvdXJjZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2UubWpzXCI7XG5cblxuZGVzY3JpYmUoJ0RhdGFzb3VyY2UnLCBmdW5jdGlvbiAoKSB7XG5cblxuICAgIGl0KCdzaG91bGQgaW5zdGFuY2Ugb2YgRGF0YXNvdXJjZSAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgRGF0YXNvdXJjZSgpKS50by5iZS5pbnN0YW5jZW9mKERhdGFzb3VyY2UpXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnT3B0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3NldE9wdGlvbiBzaG91bGQgY2hhbmdlIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YXNvdXJjZSA9IG5ldyBEYXRhc291cmNlKCk7XG4gICAgICAgICAgICBleHBlY3QoZGF0YXNvdXJjZS5nZXRPcHRpb24oJ2RlZmF1bHQnKSkudG8uYmUudW5kZWZpbmVkXG4gICAgICAgICAgICBkYXRhc291cmNlLnNldE9wdGlvbignZGVmYXVsdCcsIHRydWUpXG4gICAgICAgICAgICBleHBlY3QoZGF0YXNvdXJjZS5nZXRPcHRpb24oJ2RlZmF1bHQnKSkudG8uYmUudHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2V0T3B0aW9ucyBzaG91bGQgc2V0IGFsbCB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhc291cmNlID0gbmV3IERhdGFzb3VyY2UoKTtcbiAgICAgICAgICAgIGV4cGVjdChkYXRhc291cmNlLmdldE9wdGlvbignZGVmYXVsdCcpKS50by5iZS51bmRlZmluZWRcbiAgICAgICAgICAgIGRhdGFzb3VyY2Uuc2V0T3B0aW9ucyh7ZGVmYXVsdDogdHJ1ZX0pXG4gICAgICAgICAgICBleHBlY3QoZGF0YXNvdXJjZS5nZXRPcHRpb24oJ2RlZmF1bHQnKSkudG8uYmUudHJ1ZVxuICAgICAgICB9KTtcblxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgncncnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRhdGFzb3VyY2UgPSBuZXcgRGF0YXNvdXJjZSgpO1xuICAgICAgICBpdCgncmVhZCBzaG91bGQgdGhyb3cgZXhlcHRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gZGF0YXNvdXJjZS5yZWFkKCkpLnRvLnRocm93KEVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkIHRocm93IGV4ZXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IGRhdGFzb3VyY2UucmVhZCgpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KVxuICAgIFxuICAgIGRlc2NyaWJlKCdnZXQvc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkYXRhc291cmNlID0gbmV3IERhdGFzb3VyY2UoKTtcbiAgICAgICAgaXQoJ2dldCBzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCggZGF0YXNvdXJjZS5nZXQoKSkudG8uYmUuZXFsKHt9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkIHRocm93IGV4ZXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCBkYXRhc291cmNlLmdldCgpKS50by5iZS5lcWwoe30pO1xuICAgICAgICAgICAgZXhwZWN0KCBkYXRhc291cmNlLnNldCh7YTonbXl2YWx1ZSd9KSkudG8uYmUuaW5zdGFuY2VvZihEYXRhc291cmNlKTtcbiAgICAgICAgICAgIGV4cGVjdCggZGF0YXNvdXJjZS5nZXQoKSkudG8uYmUuZXFsKHthOidteXZhbHVlJ30pO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KSIsICIvKipcbiAqIENvcHlyaWdodCBzY2h1a2FpIEdtYkggYW5kIGNvbnRyaWJ1dG9ycyAyMDIyLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTm9kZSBtb2R1bGU6IEBzY2h1a2FpL21vbnN0ZXJcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQUdQTHYzIExpY2Vuc2UuXG4gKiBMaWNlbnNlIHRleHQgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC0zLjAuZW4uaHRtbFxuICovXG5cbmltcG9ydCB7aXNBcnJheSwgaXNPYmplY3R9IGZyb20gXCIuLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7Tm9kZX0gZnJvbSBcIi4uL3R5cGVzL25vZGUubWpzXCI7XG5pbXBvcnQge05vZGVMaXN0fSBmcm9tIFwiLi4vdHlwZXMvbm9kZWxpc3QubWpzXCI7XG5pbXBvcnQge2Fzc2VtYmxlUGFydHN9IGZyb20gXCIuL2J1aWxkbWFwLm1qc1wiO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gXCIuL2V4dGVuZC5tanNcIjtcblxuZXhwb3J0IHtidWlsZFRyZWV9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHBhcmVudFN5bWJvbCA9IFN5bWJvbCgncGFyZW50Jyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtzeW1ib2x9XG4gKi9cbmNvbnN0IHJvb3RTeW1ib2wgPSBTeW1ib2woJ3Jvb3QnKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBidWlsZFRyZWVPcHRpb25zXG4gKiBAcHJvcGVydHkge2FycmF5fSBvcHRpb25zLnJvb3RSZWZlcmVuY2VzPVtudWxsLCB1bmRlZmluZWRdIGRlZmluZXMgdGhlIHZhbHVlcyBmb3IgZWxlbWVudHMgd2l0aG91dCBwYXJlbnRzXG4gKiBAcHJvcGVydHkge01vbnN0ZXIuRGF0YX5leGFtcGxlRmlsdGVyQ2FsbGJhY2t9IG9wdGlvbnMuZmlsdGVyIGZpbHRlcmluZyBvZiB0aGUgdmFsdWVzXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKi9cblxuLyoqXG4gKiBXaXRoIHRoZSBoZWxwIG9mIHRoZSBmdW5jdGlvbiBgYnVpbGRUcmVlKClgLCBub2RlcyBjYW4gYmUgZWFzaWx5IGNyZWF0ZWQgZnJvbSBkYXRhIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHsqfSBzdWJqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ3xNb25zdGVyLkRhdGF+ZXhhbXBsZVNlbGVjdG9yQ2FsbGJhY2t9IHNlbGVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRJREtleVxuICogQHBhcmFtIHtidWlsZFRyZWVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm4geyp9XG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5laXRoZXIgYSBzdHJpbmcgbm9yIGEgZnVuY3Rpb25cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdGhlIHNlbGVjdG9yIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgbWFwXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9iamVjdCBoYXMgbm8gdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaWRcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjYuMFxuICovXG5mdW5jdGlvbiBidWlsZFRyZWUoc3ViamVjdCwgc2VsZWN0b3IsIGlkS2V5LCBwYXJlbnRJREtleSwgb3B0aW9ucykge1xuXG4gICAgY29uc3Qgbm9kZXMgPSBuZXcgTWFwO1xuXG4gICAgaWYgKCFpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBvcHRpb25zID0ge31cbiAgICB9XG5cbiAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCB7XG4gICAgICAgIHJvb3RSZWZlcmVuY2VzOiBbbnVsbCwgdW5kZWZpbmVkXSxcbiAgICAgICAgZmlsdGVyOiB1bmRlZmluZWRcbiAgICB9LCBvcHRpb25zKVxuXG4gICAgY29uc3QgZmlsdGVyID0gb3B0aW9ucz8uZmlsdGVyO1xuICAgIGxldCByb290UmVmZXJlbmNlcyA9IG9wdGlvbnMucm9vdFJlZmVyZW5jZXM7XG4gICAgaWYgKCFpc0FycmF5KHJvb3RSZWZlcmVuY2VzKSkge1xuICAgICAgICByb290UmVmZXJlbmNlcyA9IFtyb290UmVmZXJlbmNlc107XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRNYXAgPSBhc3NlbWJsZVBhcnRzKHN1YmplY3QsIHNlbGVjdG9yLCBmaWx0ZXIsIGZ1bmN0aW9uIChvLCBrLCBtKSB7XG5cbiAgICAgICAgY29uc3Qga2V5ID0gbz8uW2lkS2V5XVxuICAgICAgICBsZXQgcmVmID0gbz8uW3BhcmVudElES2V5XVxuICAgICAgICBpZiAocm9vdFJlZmVyZW5jZXMuaW5kZXhPZihyZWYpICE9PSAtMSkgcmVmID0gcm9vdFN5bWJvbDtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIG9iamVjdCBoYXMgbm8gdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaWQnKVxuICAgICAgICB9XG5cbiAgICAgICAgb1twYXJlbnRTeW1ib2xdID0gcmVmO1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgTm9kZShvKTtcbiAgICAgICAgdGhpcy5oYXMocmVmKSA/IHRoaXMuZ2V0KHJlZikuYWRkKG5vZGUpIDogdGhpcy5zZXQocmVmLCBuZXcgTm9kZUxpc3QoKS5hZGQobm9kZSkpO1xuICAgICAgICBub2Rlcy5zZXQoa2V5LCBub2RlKTtcblxuICAgIH0pXG5cbiAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gbm9kZT8uWyd2YWx1ZSddPy5baWRLZXldO1xuXG4gICAgICAgIGlmIChjaGlsZE1hcC5oYXMoaWQpKSB7XG4gICAgICAgICAgICBub2RlLmNoaWxkTm9kZXMgPSBjaGlsZE1hcC5nZXQoaWQpO1xuICAgICAgICAgICAgY2hpbGRNYXAuZGVsZXRlKGlkKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGxpc3QgPSBuZXcgTm9kZUxpc3Q7XG5cbiAgICBjaGlsZE1hcC5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIGlmIChzIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBzLmZvckVhY2goKG4pID0+IHtcbiAgICAgICAgICAgICAgICBsaXN0LmFkZChuKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIGxpc3Q7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7ZXhwZWN0fSBmcm9tIFwiY2hhaVwiXG5pbXBvcnQge2J1aWxkVHJlZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2J1aWxkdHJlZS5tanNcIjtcbmltcG9ydCB7Tm9kZUxpc3R9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvbm9kZWxpc3QubWpzXCI7XG5cblxuZGVzY3JpYmUoJ2J1aWxkVHJlZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGRlc2NyaWJlKCdleGFtcGxlJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdzaG91bGQgcnVuIGV4YW1wbGUnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IG9iamVjdHMgPSB7XG4gICAgICAgICAgICAgICAgZGF0YXNldDoge1xuICAgICAgICAgICAgICAgICAgICBcIjFcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ2ZWhpY2xlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGxcblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcIjJcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJjYXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIxXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCIzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIjNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidHJ1Y2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIxXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCI0XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIjRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibW90b3JjeWNsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjFcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcIjVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTVVZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIyXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCI2XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcIjZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic3BvcnRzIGNhclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IGJ1aWxkVHJlZShvYmplY3RzLCAnZGF0YXNldC4qJywgJ2lkJywgJ3BhcmVudCcpO1xuXG4gICAgICAgICAgICBleHBlY3Qobm9kZXMpLnRvLmJlLmluc3RhbmNlT2YoTm9kZUxpc3QpO1xuICAgICAgICAgICAgZXhwZWN0KG5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMSk7XG4gICAgICAgICAgICBleHBlY3Qobm9kZXMudG9TdHJpbmcoKSkudG8uYmUuZXF1YWwoJ3tcImlkXCI6XCIxXCIsXCJuYW1lXCI6XCJ2ZWhpY2xlXCIsXCJwYXJlbnRcIjpudWxsfVxcbiBcdTI1MUN7XCJpZFwiOlwiMlwiLFwibmFtZVwiOlwiY2FyXCIsXCJwYXJlbnRcIjpcIjFcIn1cXG4gfCBcdTI1MUN7XCJpZFwiOlwiNVwiLFwibmFtZVwiOlwiU1VWXCIsXCJwYXJlbnRcIjpcIjJcIn1cXG4gfCBcdTI1MTR7XCJpZFwiOlwiNlwiLFwibmFtZVwiOlwic3BvcnRzIGNhclwiLFwicGFyZW50XCI6XCIyXCJ9XFxuIFx1MjUxQ3tcImlkXCI6XCIzXCIsXCJuYW1lXCI6XCJ0cnVja1wiLFwicGFyZW50XCI6XCIxXCJ9XFxuIFx1MjUxNHtcImlkXCI6XCI0XCIsXCJuYW1lXCI6XCJtb3RvcmN5Y2xlXCIsXCJwYXJlbnRcIjpcIjFcIn0nICk7XG5cblxuICAgICAgICB9KVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgnYnVpbGRUcmVlKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IG9iajEgPSB7XG4gICAgICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgICAgICAgXCIxXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgMVwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgMVwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGxcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCIyXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiMlwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgMlwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgMlwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjNcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCIzXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCAzXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSAzXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiNFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjRcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDRcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDRcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI1XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNVwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgNVwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgNVwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjZcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCI2XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCA2XCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSA2XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCI0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gTm9kZSBJbnN0YW5jZS4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoYnVpbGRUcmVlKHt9LCAnJykpLnRvLmJlLmluc3RhbmNlT2YoTm9kZUxpc3QpO1xuICAgICAgICB9KTtcblxuICAgICAgICBbXG4gICAgICAgICAgICBbb2JqMSwgJ2RhdGFzZXQuKicsICd7XCJpZFwiOlwiMVwiLFwibmFtZVwiOlwiVGVzdCAxXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDFcIixcInBhcmVudFwiOm51bGx9XFxuIFx1MjUxQ3tcImlkXCI6XCIyXCIsXCJuYW1lXCI6XCJUZXN0IDJcIixcImFkZHJlc3NcIjpcIkhlcmUgMlwiLFwicGFyZW50XCI6XCIxXCJ9XFxuIHwgXHUyNTFDe1wiaWRcIjpcIjNcIixcIm5hbWVcIjpcIlRlc3QgM1wiLFwiYWRkcmVzc1wiOlwiSGVyZSAzXCIsXCJwYXJlbnRcIjpcIjJcIn1cXG4gfCBcdTI1MTR7XCJpZFwiOlwiNFwiLFwibmFtZVwiOlwiVGVzdCA0XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDRcIixcInBhcmVudFwiOlwiMlwifVxcbiB8IHwgXHUyNTE0e1wiaWRcIjpcIjZcIixcIm5hbWVcIjpcIlRlc3QgNlwiLFwiYWRkcmVzc1wiOlwiSGVyZSA2XCIsXCJwYXJlbnRcIjpcIjRcIn1cXG4gXHUyNTE0e1wiaWRcIjpcIjVcIixcIm5hbWVcIjpcIlRlc3QgNVwiLFwiYWRkcmVzc1wiOlwiSGVyZSA1XCIsXCJwYXJlbnRcIjpcIjFcIn0nXSxcbiAgICAgICAgICAgIFtvYmoxLCAneCcsICcnXSxcbiAgICAgICAgICAgIFtvYmoxLCAnZGF0YXNldC4qJywgJ3tcImlkXCI6XCIxXCIsXCJuYW1lXCI6XCJUZXN0IDFcIixcImFkZHJlc3NcIjpcIkhlcmUgMVwiLFwicGFyZW50XCI6bnVsbH1cXG4gXHUyNTFDe1wiaWRcIjpcIjJcIixcIm5hbWVcIjpcIlRlc3QgMlwiLFwiYWRkcmVzc1wiOlwiSGVyZSAyXCIsXCJwYXJlbnRcIjpcIjFcIn1cXG4gfCBcdTI1MUN7XCJpZFwiOlwiM1wiLFwibmFtZVwiOlwiVGVzdCAzXCIsXCJhZGRyZXNzXCI6XCJIZXJlIDNcIixcInBhcmVudFwiOlwiMlwifVxcbiB8IFx1MjUxNHtcImlkXCI6XCI0XCIsXCJuYW1lXCI6XCJUZXN0IDRcIixcImFkZHJlc3NcIjpcIkhlcmUgNFwiLFwicGFyZW50XCI6XCIyXCJ9XFxuIHwgfCBcdTI1MTR7XCJpZFwiOlwiNlwiLFwibmFtZVwiOlwiVGVzdCA2XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDZcIixcInBhcmVudFwiOlwiNFwifVxcbiBcdTI1MTR7XCJpZFwiOlwiNVwiLFwibmFtZVwiOlwiVGVzdCA1XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDVcIixcInBhcmVudFwiOlwiMVwifSddLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYyA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnYnVpbGRUcmVlKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcsJyArIEpTT04uc3RyaW5naWZ5KGIpICsgJykgc2hvdWxkIHJldHVybiAnICsgSlNPTi5zdHJpbmdpZnkoYykgKyAnICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZWxpc3QgPSBidWlsZFRyZWUoYSwgYiwgJ2lkJywgJ3BhcmVudCcpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChub2RlbGlzdC50b1N0cmluZygpKS50by5iZS5lcWwoYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2J1aWxkVHJlZSgpIHRlc3QgMicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogMlxuICAgICAgICAgKiAgICAxXG4gICAgICAgICAqICAgIDNcbiAgICAgICAgICogNFxuICAgICAgICAgKiAgICA2XG4gICAgICAgICAqIDVcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGxldCBvYmoxID0ge1xuICAgICAgICAgICAgZGF0YXNldDoge1xuICAgICAgICAgICAgICAgIFwiMVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDFcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDFcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCIyXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiMlwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgMlwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgMlwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjNcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCIzXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCAzXCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSAzXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCIyXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiNFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjRcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDRcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDRcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjBcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCI1XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFwiNVwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlRlc3QgNVwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBcIkhlcmUgNVwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IFwiMFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIjZcIjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogXCI2XCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGVzdCA2XCIsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IFwiSGVyZSA2XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogXCI0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiN1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBcIjdcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJUZXN0IDdcIixcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogXCJIZXJlIDdcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBcIjFcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBOb2RlIEluc3RhbmNlLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdChidWlsZFRyZWUoe30sICcnKSkudG8uYmUuaW5zdGFuY2VPZihOb2RlTGlzdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtvYmoxLCAnZGF0YXNldC4qJywgJ3tcImlkXCI6XCIyXCIsXCJuYW1lXCI6XCJUZXN0IDJcIixcImFkZHJlc3NcIjpcIkhlcmUgMlwiLFwicGFyZW50XCI6XCIwXCJ9XFxuIFx1MjUxQ3tcImlkXCI6XCIxXCIsXCJuYW1lXCI6XCJUZXN0IDFcIixcImFkZHJlc3NcIjpcIkhlcmUgMVwiLFwicGFyZW50XCI6XCIyXCJ9XFxuIHwgXHUyNTE0e1wiaWRcIjpcIjdcIixcIm5hbWVcIjpcIlRlc3QgN1wiLFwiYWRkcmVzc1wiOlwiSGVyZSA3XCIsXCJwYXJlbnRcIjpcIjFcIn1cXG4gXHUyNTE0e1wiaWRcIjpcIjNcIixcIm5hbWVcIjpcIlRlc3QgM1wiLFwiYWRkcmVzc1wiOlwiSGVyZSAzXCIsXCJwYXJlbnRcIjpcIjJcIn1cXG57XCJpZFwiOlwiNFwiLFwibmFtZVwiOlwiVGVzdCA0XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDRcIixcInBhcmVudFwiOlwiMFwifVxcbiBcdTI1MTR7XCJpZFwiOlwiNlwiLFwibmFtZVwiOlwiVGVzdCA2XCIsXCJhZGRyZXNzXCI6XCJIZXJlIDZcIixcInBhcmVudFwiOlwiNFwifVxcbntcImlkXCI6XCI1XCIsXCJuYW1lXCI6XCJUZXN0IDVcIixcImFkZHJlc3NcIjpcIkhlcmUgNVwiLFwicGFyZW50XCI6XCIwXCJ9J10sXG4gICAgICAgICAgICBbb2JqMSwgJ3gnLCAnJ10sXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdidWlsZFRyZWUoJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJywnICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgcmV0dXJuICcgKyBKU09OLnN0cmluZ2lmeShjKSArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBub2RlbGlzdCA9IGJ1aWxkVHJlZShhLCBiLCAnaWQnLCAncGFyZW50Jywge1xuICAgICAgICAgICAgICAgICAgICByb290UmVmZXJlbmNlczogWycwJ11cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGV4cGVjdChub2RlbGlzdC50b1N0cmluZygpKS50by5iZS5lcXVhbChjKTtcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG59KTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcbmltcG9ydCB7VHJhbnNmb3JtZXJ9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS90cmFuc2Zvcm1lci5tanNcIjtcbmltcG9ydCB7aW5pdEpTRE9NfSBmcm9tIFwiLi4vLi4vdXRpbC9qc2RvbS5tanNcIjtcblxuZGVzY3JpYmUoJ1RyYW5zZm9ybWVyJywgZnVuY3Rpb24gKCkge1xuXG4gICAgYmVmb3JlKGZ1bmN0aW9uIChkb25lKSB7XG5cbiAgICAgICAgbGV0IHByb21pc2VzID0gW11cbiAgICAgICAgcHJvbWlzZXMucHVzaChpbml0SlNET00oKSk7XG4gICAgICAgIGlmKCFnbG9iYWxUaGlzWydjcnlwdG8nXSkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChpbXBvcnQoXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCIpLnRoZW4obSA9PiB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpc1snY3J5cHRvJ10gPSBuZXcgbS5DcnlwdG8oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pKVxuICAgICAgICB9XG5cbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVHJhbnNmb3JtZXIucnVuKCknLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWyc/PzphJywgbnVsbCwgJ2EnXSxcbiAgICAgICAgICAgIFsnPz86YScsIHVuZGVmaW5lZCwgJ2EnXSxcbiAgICAgICAgICAgIFsnPz86YScsICd0cnVlJywgJ3RydWUnXSxcbiAgICAgICAgICAgIFsnPz86YScsIGZhbHNlLCBmYWxzZV0sXG4gICAgICAgICAgICBbJyBpZjphOiAnLCBmYWxzZSwgdW5kZWZpbmVkXSwgLy8gd2l0aG91dCBcXFxcXG4gICAgICAgICAgICBbJyBpZjphOlxcXFwgJywgZmFsc2UsIFwiIFwiXSxcbiAgICAgICAgICAgIFsnIGlmOmE6XFxcXCAnLCB0cnVlLCBcImFcIl0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6eWVzJywgbnVsbCwgJ3llcyddLFxuICAgICAgICAgICAgWydkZWZhdWx0OnllcycsIHVuZGVmaW5lZCwgJ3llcyddLFxuICAgICAgICAgICAgWydkZWZhdWx0OjE6Ym9vbCcsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6b246Ym9vbCcsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6dHJ1ZTpib29sJywgdW5kZWZpbmVkLCB0cnVlXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDp5ZXM6Ym9vbCcsIHVuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6dW5kZWZpbmVkOmJvb2wnLCB1bmRlZmluZWQsIGZhbHNlXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDpmYWxzZTpib29sJywgdW5kZWZpbmVkLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ2RlZmF1bHQ6MTppbnQnLCB1bmRlZmluZWQsIDFdLFxuICAgICAgICAgICAgWydkZWZhdWx0OjE6c3RyaW5nJywgdW5kZWZpbmVkLCAnMSddLFxuICAgICAgICAgICAgWydmaXJzdC1rZXknLCB7YTogMSwgYzogMywgYjogMn0sIDFdLFxuICAgICAgICAgICAgWydsYXN0LWtleScsIHthOiAxLCBjOiAzLCBiOiAyfSwgM10sXG4gICAgICAgICAgICBbJ250aC1sYXN0LWtleTowJywge2E6IDEsIGM6IDMsIGI6IDJ9LCAzXSxcbiAgICAgICAgICAgIFsnbnRoLWxhc3Qta2V5OjEnLCB7YTogMSwgYzogMywgYjogMn0sIDJdLFxuICAgICAgICAgICAgWydudGgtbGFzdC1rZXk6MicsIHthOiAxLCBjOiAzLCBiOiAyfSwgMV0sXG4gICAgICAgICAgICBbJ250aC1rZXk6MicsIHthOiAxLCBiOiAyLCBjOiAzfSwgM10sXG4gICAgICAgICAgICBbJ250aC1rZXk6MCcsIHtjOiAzLCBhOiAxLCBiOiAyfSwgMV0sXG4gICAgICAgICAgICBbJ250aC1rZXk6MicsIHthOiAxLCBjOiAzLCBiOiAyfSwgM10sXG4gICAgICAgICAgICBbJ3ByZWZpeDpIZWxsb1xcXFwgJywgJ3Rlc3QnLCBcIkhlbGxvIHRlc3RcIl0sXG4gICAgICAgICAgICBbJ3RvanNvbicsIHthOiA0fSwgXCJ7XFxcImFcXFwiOjR9XCJdLFxuICAgICAgICAgICAgWydwcmVmaXg6YVxcXFxcXFxcOiAnLCAndGVzdCcsIFwiYVxcXFx0ZXN0XCJdLFxuICAgICAgICAgICAgWydwcmVmaXg6YVxcXFwgJywgJ3Rlc3QnLCBcImEgdGVzdFwiXSxcbiAgICAgICAgICAgIFsnc3RhdGljOmFiYzphOmI6eCcsIFwidGVzdFwiLCBcImFiYzphOmI6eFwiXSxcbiAgICAgICAgICAgIFsndG9sb3dlcmNhc2UnLCBcIkE6YjpDc2U0XCIsIFwiYTpiOmNzZTRcIl0sXG4gICAgICAgICAgICBbJ3RvdXBwZXInLCBcIkE6YjpDc2U0XCIsIFwiQTpCOkNTRTRcIl0sXG4gICAgICAgICAgICBbJ3Rvc3RyaW5nJywgNSwgXCI1XCJdLFxuICAgICAgICAgICAgWyd0b3N0cmluZycsIFsxLCAyLCAzLCB7fV0sIFwiMSwyLDMsW29iamVjdCBPYmplY3RdXCJdLFxuICAgICAgICAgICAgWyd0b2ludGVnZXInLCBcIjVcIiwgNV0sXG4gICAgICAgICAgICBbJ3RyaW0nLCBcIiA1IFwiLCBcIjVcIl0sXG4gICAgICAgICAgICBbJ3RyaW0nLCBcIiBhXCIsIFwiYVwiXSxcbiAgICAgICAgICAgIFsndHJpbScsIFwiIFwiLCBcIlwiXSxcbiAgICAgICAgICAgIFsncmF3dXJsZW5jb2RlJywgXCJcdTAwRkNcdTAwRjZcdTAwRTRcIiwgXCIlQzMlQkMlQzMlQjYlQzMlQTRcIl0sXG4gICAgICAgICAgICBbJ2NhbGw6dGVzdGNhbGxiYWNrOjQ6NTo2JywgXCJ0ZXN0XCIsIFwidGVzdDQ1NlwiXSxcbiAgICAgICAgICAgIFsncGxhaW4nLCAndDxicj5lc3QnLCBcInRlc3RcIl0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsIHRydWUsIFwiYVwiXSxcbiAgICAgICAgICAgIFsnaWY6YTpiJywgJ29uJywgXCJhXCJdLFxuICAgICAgICAgICAgWydpZjphOmInLCAndHJ1ZScsIFwiYVwiXSxcbiAgICAgICAgICAgIFsnaWY6YTpiJywgJ2ZhbHNlJywgXCJiXCJdLFxuICAgICAgICAgICAgWydpZjphOmInLCA5LCBcImFcIl0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsICcnLCBcImJcIl0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsIHVuZGVmaW5lZCwgXCJiXCJdLFxuICAgICAgICAgICAgWydpZjphOmInLCBmYWxzZSwgXCJiXCJdLFxuICAgICAgICAgICAgWyd1Y2ZpcnN0JywgJ2NhcicsIFwiQ2FyXCJdLFxuICAgICAgICAgICAgWyd1Y2ZpcnN0JywgJ2NBcicsIFwiQ0FyXCJdLFxuICAgICAgICAgICAgWydkZWZhdWx0OnRlc3QnLCAnYScsIFwiYVwiXSxcbiAgICAgICAgICAgIFsnZGVmYXVsdDp0ZXN0JywgdW5kZWZpbmVkLCBcInRlc3RcIl0sXG4gICAgICAgICAgICBbJ2Zyb21qc29uJywgJ3t9Jywge31dLFxuICAgICAgICAgICAgWydmcm9tanNvbicsICd7XCJhXCI6MX0nLCB7YTogMX1dLFxuICAgICAgICAgICAgWyd1Y3dvcmRzJywgJ2NBciBydW5zJywgXCJDQXIgUnVuc1wiXSxcbiAgICAgICAgICAgIFsndG9pbnRlZ2VyJywgJzYnLCA2XSxcbiAgICAgICAgICAgIFsnbGVuZ3RoJywgJ3Rlc3QnLCA0XSxcbiAgICAgICAgICAgIFsndG8tYmFzZTY0JywgJ0hlbGxvIFdvcmxkIScsIFwiU0dWc2JHOGdWMjl5YkdRaFwiXSxcbiAgICAgICAgICAgIFsnZnJvbS1iYXNlNjQnLCAnU0dWc2JHOGdWMjl5YkdRaCcsIFwiSGVsbG8gV29ybGQhXCJdLFxuICAgICAgICAgICAgWyd0by1iYXNlNjQnLCAndGVzdCcsIFwiZEdWemRBPT1cIl0sXG4gICAgICAgICAgICBbJ2Zyb20tYmFzZTY0JywgXCJkR1Z6ZEE9PVwiLCAndGVzdCddLFxuICAgICAgICAgICAgWydwcmVmaXg6YScsICd0ZXN0JywgXCJhdGVzdFwiXSxcbiAgICAgICAgICAgIFsnc3VmZml4OmEnLCAndGVzdCcsIFwidGVzdGFcIl0sXG4gICAgICAgICAgICBbJ2luZGV4OmEnLCB7YTogNH0sIDRdLFxuICAgICAgICAgICAgWydpbmRleDoyJywgWzIsIDQsIDddLCA3XSxcbiAgICAgICAgICAgIFsnaW5kZXg6eDp0ZXN0JywgWzIsIDQsIDddLCAndGVzdCddLFxuICAgICAgICAgICAgWydwYXRoOmEuYi5jJywge2E6IHtiOiB7YzogNH19fSwgNF0sXG4gICAgICAgICAgICBbJ3BhdGg6YS5iLmQnLCB7YToge2I6IHtjOiA0fX19LCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgWydpbmRleDphJywgbmV3IE1hcCgpLnNldCgnYScsIDUpLCA1XSxcbiAgICAgICAgICAgIFsnc3Vic3RyaW5nOjI6NCcsICdhYmNkZWZnaGlqa2xtbm9wJywgJ2NkZWYnXSxcbiAgICAgICAgICAgIFsnbm9wJywgJ2FiY2RlZmdoaWprbG1ub3AnLCAnYWJjZGVmZ2hpamtsbW5vcCddLFxuXG4gICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgbGV0IGIgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgIGl0KCdUcmFuc2Zvcm1lci5ydW4oJyArIEpTT04uc3RyaW5naWZ5KGEpICsgJykucnVuKCcgKyBKU09OLnN0cmluZ2lmeShiKSArICcpIHNob3VsZCByZXR1cm4gJyArIEpTT04uc3RyaW5naWZ5KGMpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBuZXcgVHJhbnNmb3JtZXIoYSk7XG5cbiAgICAgICAgICAgICAgICB0LnNldENhbGxiYWNrKCd0ZXN0Y2FsbGJhY2snLCBmdW5jdGlvbiAoYSwgYiwgYywgZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSArIGIgKyBjICsgZDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0LnJ1bihiKTtcbiAgICAgICAgICAgICAgICBleHBlY3QocikudG8uYmUuZXFsKGMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnVHJhbnNmb3JtZXIucnVuKCkgdGhyb3dzIEVycm9yJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIFtcbiAgICAgICAgICAgIFsndG9sb3dlcmNhc2UnLCBbXV0sXG4gICAgICAgICAgICBbJ3RvbG93ZXJjYXNlJywge31dLFxuICAgICAgICAgICAgWyd0b2xvd2VyY2FzZScsIDQuNV0sXG4gICAgICAgICAgICBbJ3RvdXBwZXInLCB0cnVlXSxcbiAgICAgICAgICAgIFsndG91cHBlcicsIDVdLFxuICAgICAgICAgICAgWyd0b2ludGVnZXInLCBcImFcIl0sXG4gICAgICAgICAgICBbJ3RyaW0nLCA1XSxcbiAgICAgICAgICAgIFsndHJpbScsIHRydWVdLFxuICAgICAgICAgICAgWyd0cmltJywge31dLFxuICAgICAgICAgICAgWyd0cmltJywgW11dLFxuICAgICAgICAgICAgWydyYXd1cmxlbmNvZGUnLCBbXV0sXG4gICAgICAgICAgICBbJ2lmOmE6YicsIHt9XSxcbiAgICAgICAgICAgIFsndWN3b3JkcycsIHt9XSxcbiAgICAgICAgICAgIFsndWN3b3JkcycsIGZhbHNlXSxcbiAgICAgICAgICAgIFsndWN3b3JkcycsIDRdLFxuICAgICAgICAgICAgWydwYXRoOmEuYi5jJywgXCJcIiwgNF0sXG4gICAgICAgICAgICBbJ3RvaW50ZWdlcicsIHt9XSxcbiAgICAgICAgICAgIFsnYmFzZTY0Jywge31dLFxuICAgICAgICAgICAgWydmcm9tanNvbicsICcnXSxcbiAgICAgICAgICAgIFsncHJlZml4Jywge31dLFxuICAgICAgICAgICAgWydzdWZmaXgnLCB7fV0sXG4gICAgICAgICAgICBbJ2luZGV4JywgXCJ0ZXN0XCJdLFxuICAgICAgICAgICAgWyd4eHh4eHgnLCBcInRlc3RcIl0sIC8vIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICBpdCgnVHJhbnNmb3JtZXIucnVuKCcgKyBKU09OLnN0cmluZ2lmeShhKSArICcpLnJ1bignICsgSlNPTi5zdHJpbmdpZnkoYikgKyAnKSBzaG91bGQgdGhyb3cgRXJyb3IgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gbmV3IFRyYW5zZm9ybWVyKGEpO1xuICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiB0LnJ1bihiKSkudG8udGhyb3coRXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ25ldyBUcmFuc2Zvcm1lcigpLnJ1bihcInVuaXFpZFwiKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gU3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHQgPSBuZXcgVHJhbnNmb3JtZXIoJ3VuaXFpZCcpO1xuICAgICAgICAgICAgZXhwZWN0KHQucnVuKFwiXCIpKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCduZXcgVHJhbnNmb3JtZXIoKS5ydW4oXCJkZWZhdWx0OmV5SmlJam94ZlE9PTpvYmplY3RcIiknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIE9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCB0ID0gbmV3IFRyYW5zZm9ybWVyKCdkZWZhdWx0OmV5SmlJam94ZlE9PTpvYmplY3QnKTtcbiAgICAgICAgICAgIGV4cGVjdCh0LnJ1bih1bmRlZmluZWQpKS50by5lcWwoe2I6IDF9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ25ldyBUcmFuc2Zvcm1lcigpJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBpbnN0YW5jZW9mIFRyYW5zZm9ybWVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KG5ldyBUcmFuc2Zvcm1lcihcIlwiKSkudG8uaW5zdGFuY2VPZihUcmFuc2Zvcm1lcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGluc3RhbmNlb2YgVHJhbnNmb3JtZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QobmV3IFRyYW5zZm9ybWVyKFwic3VmZml4OmFiY1wiKSkudG8uaW5zdGFuY2VPZihUcmFuc2Zvcm1lcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdmYWxzZSBhcyBhcmd1bWVudCBzaG91bGQgdGhyb3cgVHlwZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtZXIoZmFsc2UpXG4gICAgICAgICAgICB9KS50by50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnb2JqZWN0IGFzIGFyZ3VtZW50IHNob3VsZCB0aHJvdyBUeXBlRXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5ldyBUcmFuc2Zvcm1lcih7fSlcbiAgICAgICAgICAgIH0pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtQYXRoZmluZGVyfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvcGF0aGZpbmRlci5tanNcIjtcblxuZGVzY3JpYmUoJ1BhdGhmaW5kZXInLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgY29udmVydE1hcFJlc3VsdCA9IGZ1bmN0aW9uIChyKSB7XG4gICAgICAgIGlmIChyIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICByID0gT2JqZWN0LmZyb21FbnRyaWVzKHIpO1xuICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHIgPSByLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydE1hcFJlc3VsdChlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIG9dIG9mIE9iamVjdC5lbnRyaWVzKHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJba10gPSBjb252ZXJ0TWFwUmVzdWx0KG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgIH1cblxuXG4gICAgZGVzY3JpYmUoJ3dpdGggV2lsZGNhcmQgYW5kIEl0ZXJhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBwZiwgb2JqO1xuXG4gICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb2JqID0ge1xuICAgICAgICAgICAgICAgIGE6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCIxLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBcIjEtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ6ICchJ1xuXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6IFwiMi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogXCIyLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkOiAnPydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBmID0gbmV3IFBhdGhmaW5kZXIob2JqKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgWydhLiouYi4qJywgJ3tcIjBcIjp7XCIwXCI6e1wiY1wiOlwiMS0xXCJ9LFwiMVwiOntcImNcIjpcIjEtMlwifX0sXCIxXCI6e1wiMFwiOntcImNcIjpcIjItMVwifSxcIjFcIjp7XCJjXCI6XCIyLTJcIn19fSddLFxuICAgICAgICAgICAgWydhLiouYicsICd7XCIwXCI6W3tcImNcIjpcIjEtMVwifSx7XCJjXCI6XCIxLTJcIn1dLFwiMVwiOlt7XCJjXCI6XCIyLTFcIn0se1wiY1wiOlwiMi0yXCJ9XX0nXSxcbiAgICAgICAgICAgIFsnYS4xLmInLCAnW3tcImNcIjpcIjItMVwifSx7XCJjXCI6XCIyLTJcIn1dJ10sXG4gICAgICAgICAgICBbJ2EuMC5iJywgJ1t7XCJjXCI6XCIxLTFcIn0se1wiY1wiOlwiMS0yXCJ9XSddLFxuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgaXQoJy5zZXRWaWEoJyArIGEgKyAnKSBzaG91bGQgcmVzdWx0IGluICcgKyBiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHIgPSBwZi5nZXRWaWEoYSk7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBjb252ZXJ0TWFwUmVzdWx0KHIpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShpKSkuaXMuZXF1YWwoYik7XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIH0pO1xuXG5cbiAgICB9KTtcblxuXG4gICAgZGVzY3JpYmUoJ2FwaSB0ZXN0cycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgcGF0aGZpbmRlciwgb2JqZWN0O1xuXG5cbiAgICAgICAgY2xhc3MgQSB7XG4gICAgICAgICAgICBnZXQgYSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG5cbiAgICAgICAgICAgIG9iamVjdCA9IHtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCBcInRlc3QxXCIsIGZhbHNlLCB1bmRlZmluZWQsIHBhcnNlSW50KFwiYVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk6IFtcInRlc3QyXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGo6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgazogKG5ldyBNYXApLnNldCgnbScsIHtuOiAzfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBsOiAobmV3IFNldCkuYWRkKHtuOiA0fSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYjogbmV3IEFcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHBhdGhmaW5kZXIgPSBuZXcgUGF0aGZpbmRlcihvYmplY3QpO1xuXG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2NyZWF0ZSBuZXcgb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWzEyXSxcbiAgICAgICAgICAgICAgICBbdW5kZWZpbmVkXSxcbiAgICAgICAgICAgICAgICBbbnVsbF0sXG4gICAgICAgICAgICAgICAgW1widGVzdFwiXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IHR5cGVvZiBhO1xuICAgICAgICAgICAgICAgIGlmIChhID09PSBudWxsKSBsYWJlbCA9ICdudWxsJztcblxuXG4gICAgICAgICAgICAgICAgaXQobGFiZWwgKyAnIHNob3VsZCB0aHJvdyBlcnJvcicsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGhmaW5kZXIoYSlcbiAgICAgICAgICAgICAgICAgICAgfSkudG8udGhyb3coRXJyb3IpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnLnNldFZpYSh4KScsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgbGV0IHBmLCBvYmo7XG5cbiAgICAgICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG9iaiA9IHt9XG4gICAgICAgICAgICAgICAgcGYgPSBuZXcgUGF0aGZpbmRlcihvYmopO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbJ2EuYi4wLjAuYycsIHRydWUsICd7XCJhXCI6e1wiYlwiOltbe1wiY1wiOnRydWV9XV19fSddLFxuICAgICAgICAgICAgICAgIFsnYS5iLjAuYycsIHRydWUsICd7XCJhXCI6e1wiYlwiOlt7XCJjXCI6dHJ1ZX1dfX0nXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi4zLmMnLCB0cnVlLCAne1wiYVwiOntcImJcIjpbbnVsbCxudWxsLG51bGwse1wiY1wiOnRydWV9XX19J10sXG4gICAgICAgICAgICAgICAgWydhLmIuYycsIHRydWUsICd7XCJhXCI6e1wiYlwiOntcImNcIjp0cnVlfX19J11cbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgICAgIGl0KCcuc2V0VmlhKCcgKyBhICsgJywgJyArIGIgKyAnKSBzaG91bGQgcmVzdWx0IGluICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBmLnNldFZpYShhLCBiKVxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkob2JqKSkuaXMuZXF1YWwoYyk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcblxuICAgICAgICBkZXNjcmliZSgnLnNldFZpYSgpJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBsZXQgYTtcbiAgICAgICAgICAgIGxldCBiO1xuICAgICAgICAgICAgbGV0IGM7XG5cbiAgICAgICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGEgPSBcImEueFwiO1xuICAgICAgICAgICAgICAgIGIgPSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICBjID0gXCJhLnkuZFwiO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoJy5zZXRWaWEoJyArIGEgKyAnLCAnICsgYiArICcpIHNob3VsZCByZXR1cm4gUGF0aGZpbmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleHBlY3QocGF0aGZpbmRlci5zZXRWaWEoYSwgYikpLmlzLmluc3RhbmNlT2YoUGF0aGZpbmRlcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJy5zZXRWaWEoJyArIGEgKyAnLCAnICsgYiArICcpIHNob3VsZCBjaGFuZ2Ugb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHBhdGhmaW5kZXIuc2V0VmlhKGEsIGIpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShvYmplY3QpKS5pcy5lcXVhbCgne1wiYVwiOntcImJcIjp7XCJjXCI6WzQsXCJ0ZXN0MVwiLGZhbHNlLG51bGwsbnVsbF0sXCJlXCI6ZmFsc2UsXCJmXCI6W3tcImdcIjpmYWxzZSxcImhcIjozLFwiaVwiOltcInRlc3QyXCJdfV0sXCJqXCI6e30sXCJrXCI6e30sXCJsXCI6e319LFwieFwiOlwidHJ1ZVwifSxcImJcIjp7fX0nKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnLnNldFZpYSgnICsgYyArICcsICcgKyBiICsgJykgc2hvdWxkIGNoYW5nZSBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcGF0aGZpbmRlci5zZXRWaWEoYywgYik7XG4gICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KG9iamVjdCkpLmlzLmVxdWFsKCd7XCJhXCI6e1wiYlwiOntcImNcIjpbNCxcInRlc3QxXCIsZmFsc2UsbnVsbCxudWxsXSxcImVcIjpmYWxzZSxcImZcIjpbe1wiZ1wiOmZhbHNlLFwiaFwiOjMsXCJpXCI6W1widGVzdDJcIl19XSxcImpcIjp7fSxcImtcIjp7fSxcImxcIjp7fX0sXCJ5XCI6e1wiZFwiOlwidHJ1ZVwifX0sXCJiXCI6e319Jyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KTtcblxuXG4gICAgICAgIGRlc2NyaWJlKCcuZXhpc3RzKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWydhLmIuYy4xJywgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgWydiLmEnLCB0cnVlXSxcbiAgICAgICAgICAgICAgICBbJ2EuYi54JywgZmFsc2VdLFxuICAgICAgICAgICAgICAgIFsnYS54JywgZmFsc2VdLFxuICAgICAgICAgICAgICAgIFsnYS5iLnEnLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgWydhLmIuYy4wJywgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgWydhLmIuZCcsIHRydWVdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmYuMC5nJywgdHJ1ZV0sXG4gICAgICAgICAgICAgICAgWydhLmIuZi4wLmkuMCcsIHRydWVdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmYuMC5pLjInLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgWydhLmIuZScsIHRydWVdLFxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICAgICAgICAgIGl0KCcuZXhpc3RzKCcgKyBhICsgJykgc2hvdWxkIHJldHVybiAnICsgYiArICcgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QocGF0aGZpbmRlci5leGlzdHMoYSkpLmlzLmVxdWFsKGIpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJy5kZWxldGVWaWEoKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbJ2EuYi5lJywgJ3tcImFcIjp7XCJiXCI6e1wiY1wiOls0LFwidGVzdDFcIixmYWxzZSxudWxsLG51bGxdLFwiZlwiOlt7XCJnXCI6ZmFsc2UsXCJoXCI6MyxcImlcIjpbXCJ0ZXN0MlwiXX1dLFwialwiOnt9LFwia1wiOnt9LFwibFwiOnt9fX0sXCJiXCI6e319J10sXG4gICAgICAgICAgICAgICAgWydhLmIuZicsICd7XCJhXCI6e1wiYlwiOntcImNcIjpbNCxcInRlc3QxXCIsZmFsc2UsbnVsbCxudWxsXSxcImVcIjpmYWxzZSxcImpcIjp7fSxcImtcIjp7fSxcImxcIjp7fX19LFwiYlwiOnt9fSddLFxuICAgICAgICAgICAgICAgIFsnYS5iLmonLCAne1wiYVwiOntcImJcIjp7XCJjXCI6WzQsXCJ0ZXN0MVwiLGZhbHNlLG51bGwsbnVsbF0sXCJlXCI6ZmFsc2UsXCJmXCI6W3tcImdcIjpmYWxzZSxcImhcIjozLFwiaVwiOltcInRlc3QyXCJdfV0sXCJrXCI6e30sXCJsXCI6e319fSxcImJcIjp7fX0nXSxcblxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBpdCgnLmRlbGV0ZVZpYSgnICsgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIgKyAnICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aGZpbmRlci5kZWxldGVWaWEoYSlcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KG9iamVjdCkpLmlzLmVxdWFsKGIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCcuZ2V0VmlhKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkZXNjcmliZSgnLmdldFZpYSgpJywgZnVuY3Rpb24gKCkge1xuXG5cbiAgICAgICAgICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCBcInRlc3QxXCIsIGZhbHNlLCB1bmRlZmluZWQsIHBhcnNlSW50KFwiYVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiBbXCJ0ZXN0MlwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazogKG5ldyBNYXApLnNldCgnbScsIHtuOiAzfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6IChuZXcgU2V0KS5hZGQoe246IDR9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3A6IHtxOiAxLCByOiB0cnVlfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cDoge3E6IDIsIHI6IHRydWV9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwOiB7cTogMywgcjogdHJ1ZX19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3A6IHtxOiA0LCByOiB0cnVlfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cDoge3E6IDUsIHI6IHRydWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0OiB7YTogMX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OiB7YTogMn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2OiB7YTogM30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB7YTogNH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBwYXRoZmluZGVyID0gbmV3IFBhdGhmaW5kZXIob2JqZWN0KTtcblxuXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIFsnYS4qJywgJ1tbXCJiXCIse1wiY1wiOls0LFwidGVzdDFcIixmYWxzZSxudWxsLG51bGxdLFwiZVwiOmZhbHNlLFwiZlwiOlt7XCJnXCI6ZmFsc2UsXCJoXCI6MyxcImlcIjpbXCJ0ZXN0MlwiXX1dLFwialwiOnt9LFwia1wiOnt9LFwibFwiOnt9LFwib1wiOlt7XCJwXCI6e1wicVwiOjEsXCJyXCI6dHJ1ZX19LHtcInBcIjp7XCJxXCI6MixcInJcIjp0cnVlfX0se1wicFwiOntcInFcIjozLFwiclwiOnRydWV9fSx7XCJwXCI6e1wicVwiOjQsXCJyXCI6dHJ1ZX19LHtcInBcIjp7XCJxXCI6NSxcInJcIjp0cnVlfX1dLFwic1wiOntcInRcIjp7XCJhXCI6MX0sXCJ1XCI6e1wiYVwiOjJ9LFwidlwiOntcImFcIjozfSxcInhcIjp7XCJhXCI6NH19fV1dJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnYS5iLnMuKi5hJywgJ1tbXCJ0XCIsMV0sW1widVwiLDJdLFtcInZcIiwzXSxbXCJ4XCIsNF1dJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnYS5iLnMuKicsICdbW1widFwiLHtcImFcIjoxfV0sW1widVwiLHtcImFcIjoyfV0sW1widlwiLHtcImFcIjozfV0sW1wieFwiLHtcImFcIjo0fV1dJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnYS5iLm8uKi5wLnEnLCAnW1tcIjBcIiwxXSxbXCIxXCIsMl0sW1wiMlwiLDNdLFtcIjNcIiw0XSxbXCI0XCIsNV1dJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnYS5iLm8uKi5wLnInLCAnW1tcIjBcIix0cnVlXSxbXCIxXCIsdHJ1ZV0sW1wiMlwiLHRydWVdLFtcIjNcIix0cnVlXSxbXCI0XCIsdHJ1ZV1dJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnYS5iLm8uKi5wJywgJ1tbXCIwXCIse1wicVwiOjEsXCJyXCI6dHJ1ZX1dLFtcIjFcIix7XCJxXCI6MixcInJcIjp0cnVlfV0sW1wiMlwiLHtcInFcIjozLFwiclwiOnRydWV9XSxbXCIzXCIse1wicVwiOjQsXCJyXCI6dHJ1ZX1dLFtcIjRcIix7XCJxXCI6NSxcInJcIjp0cnVlfV1dJ11cbiAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG4gICAgICAgICAgICAgICAgICAgIGl0KCcuZ2V0VmlhKCcgKyBhICsgJykgc2hvdWxkIHJlc3VsdCAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSBwYXRoZmluZGVyLmdldFZpYShhKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocikpKS5pcy5lcXVhbChiKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaXQoJy5nZXRWaWEoKSBzaG91bGQgcmVzdWx0ICcsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGxldCBwID0gbmV3IFBhdGhmaW5kZXIoe1xuICAgICAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2M6IDF9LCB7YzogMn1cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YzogMSwgZDogZmFsc2V9LCB7YzogMn1cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgciA9IHAuZ2V0VmlhKFwiKi54LiouY1wiKVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gbWFwVG9PYmoobWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSB7fVxuICAgICAgICAgICAgICAgICAgICBtYXAuZm9yRWFjaChmdW5jdGlvbiAodiwgaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpba10gPSBtYXBUb09iaih2KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpba10gPSB2XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShtYXBUb09iaihyKSkpLmlzLmVxdWFsKCd7XCJhXCI6e1wiMFwiOjEsXCIxXCI6Mn0sXCJiXCI6e1wiMFwiOjEsXCIxXCI6Mn19Jyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJy5nZXRWaWEoYS5iLmwuMC5uKSB3aXRoIG1hcCBzaG91bGQgcmV0dXJuIDQgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGV4cGVjdChwYXRoZmluZGVyLmdldFZpYSgnYS5iLmwuMC5uJykpLmlzLmVxdWFsKDQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbJ2EuYi5rLm0ubicsIDNdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmwuMC5uJywgNF0sXG4gICAgICAgICAgICAgICAgWydhLngnLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgICAgIFsnYS5iLnEnLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgICAgIFsnYS5iLmMuMScsIFwidGVzdDFcIl0sXG4gICAgICAgICAgICAgICAgWydhLmIuYy4wJywgNF0sXG4gICAgICAgICAgICAgICAgWydhLmIuZCcsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICAgICAgWydhLmIuZi4wLmcnLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgWydhLmIuZi4wLmkuMCcsIFwidGVzdDJcIl0sXG4gICAgICAgICAgICAgICAgWydhLmIuZScsIGZhbHNlXSxcbiAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhLnNoaWZ0KClcbiAgICAgICAgICAgICAgICBsZXQgYiA9IGRhdGEuc2hpZnQoKVxuXG5cbiAgICAgICAgICAgICAgICBpdCgnLmdldFZpYSgnICsgYSArICcpIHNob3VsZCByZXR1cm4gJyArIGIgKyAnICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHBhdGhmaW5kZXIuZ2V0VmlhKGEpKS5pcy5lcXVhbChiKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnYS5iLmQuZSddLFxuICAgICAgICAgICAgICAgIFsnYS5iLmQueCddLFxuICAgICAgICAgICAgICAgIFsnYS5iLmwuZS5uJ10sXG4gICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBpdCgnLmdldFZpYSgnICsgYSArICcpIHNob3VsZCB0aHJvdyBFcnJvciAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBwYXRoZmluZGVyLmdldFZpYShhKSkudG8udGhyb3coRXJyb3IpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG59KTtcblxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtkaWZmfSBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvZGlmZi5tanNcIjtcbmltcG9ydCB7UXVldWV9IGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvdHlwZXMvcXVldWUubWpzXCI7XG5cbmRlc2NyaWJlKCdEaWZmJywgZnVuY3Rpb24gKCkge1xuXG4gICAgZGVzY3JpYmUoJ0RpZmYgc3BlY2lhbCBjYXNlcycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgb2JqMSwgb2JqMjtcblxuICAgICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgICAgIG9iajEgPSB7XG4gICAgICAgICAgICAgICAgXCJjb3VudFwiOiAxLFxuICAgICAgICAgICAgICAgIFwicmVhc29uXCI6IG51bGwsXG4gICAgICAgICAgICAgICAgXCJpbmZvXCI6IFwidGVzdFwiLFxuICAgICAgICAgICAgICAgIFwiZXhjaGFuZ2VcIjogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvYmoyID0ge1xuICAgICAgICAgICAgICAgIFwiY291bnRcIjogMixcbiAgICAgICAgICAgICAgICBcInJlYXNvblwiOiBudWxsLFxuICAgICAgICAgICAgICAgIFwiaW5mb1wiOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgXCJleGNoYW5nZVwiOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnRGlmZiB2YWx1ZSB3aXRoIG51bGwgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBkaWZmKG9iajEsIG9iajIpO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGQpKS5pcy5lcXVhbCgnW3tcIm9wZXJhdG9yXCI6XCJ1cGRhdGVcIixcInBhdGhcIjpbXCJjb3VudFwiXSxcImZpcnN0XCI6e1widmFsdWVcIjoxLFwidHlwZVwiOlwibnVtYmVyXCJ9LFwic2Vjb25kXCI6e1widmFsdWVcIjoyLFwidHlwZVwiOlwibnVtYmVyXCJ9fSx7XCJvcGVyYXRvclwiOlwiZGVsZXRlXCIsXCJwYXRoXCI6W1wiaW5mb1wiXSxcImZpcnN0XCI6e1widmFsdWVcIjpcInRlc3RcIixcInR5cGVcIjpcInN0cmluZ1wifX1dJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdEaWZmIGlkZW50aWNhbCB2YWx1ZSB3aXRoIG51bGwgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGQgPSBkaWZmKG9iajEsIG9iajEpO1xuICAgICAgICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KGQpKS5pcy5lcXVhbCgnW10nKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cbiAgICBjb25zdCBkYXRlMSA9IG5ldyBEYXRlO1xuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZGUvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS9wYXJzZVxuICAgIGNvbnN0IGRhdGUyID0gRGF0ZS5wYXJzZSgnMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UJyk7XG4gICAgY29uc3QgZGF0ZTMgPSBEYXRlLnBhcnNlKCcwNCBEZWMgMTk5NSAwMDoxMjowMCBHTVQnKTsgLy8gTnVtYmVyXG4gICAgY29uc3QgZGF0ZTQgPSBEYXRlLnBhcnNlKCcwNCBEZWMgMTk5NSAwMDoxMjowMSBHTVQnKTsgLy8gTnVtYmVyXG5cbiAgICBjb25zdCBkYXRlNSA9IG5ldyBEYXRlKERhdGUucGFyc2UoJzA0IERlYyAxOTk1IDAwOjEyOjAxIEdNVCcpKTsgLy8gRGF0ZVxuICAgIGNvbnN0IGRhdGU2ID0gbmV3IERhdGUoRGF0ZS5wYXJzZSgnMDQgRGVjIDE5OTUgMDA6MTI6MDIgR01UJykpOyAvLyBEYXRlXG5cbiAgICBbXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogbmV3IFF1ZXVlKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJhXCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjp7XCJkYXRhXCI6W119LFwidHlwZVwiOlwib2JqZWN0XCIsXCJpbnN0YW5jZVwiOlwiUXVldWVcIn19XSdcbiAgICAgICAgXSxcblxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBiOiAxXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjOiB7XG4gICAgICAgICAgICAgICAgICAgIGQ6IDJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZTogM1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZjoge1xuICAgICAgICAgICAgICAgICAgICBkOiAyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcImRlbGV0ZVwiLFwicGF0aFwiOltcImFcIixcImJcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6MSxcInR5cGVcIjpcIm51bWJlclwifX0se1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcImFcIixcImVcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjMsXCJ0eXBlXCI6XCJudW1iZXJcIn19LHtcIm9wZXJhdG9yXCI6XCJkZWxldGVcIixcInBhdGhcIjpbXCJjXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOntcImRcIjoyfSxcInR5cGVcIjpcIm9iamVjdFwiLFwiaW5zdGFuY2VcIjpcIk9iamVjdFwifX0se1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcImZcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOntcImRcIjoyfSxcInR5cGVcIjpcIm9iamVjdFwiLFwiaW5zdGFuY2VcIjpcIk9iamVjdFwifX1dJ1xuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBkYXRlMSxcbiAgICAgICAgICAgICAgICBjOiBkYXRlNFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBkYXRlMixcbiAgICAgICAgICAgICAgICBiOiBkYXRlM1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcInVwZGF0ZVwiLFwicGF0aFwiOltcImFcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6XCInICsgZGF0ZTEudG9JU09TdHJpbmcoKSArICdcIixcInR5cGVcIjpcIm9iamVjdFwiLFwiaW5zdGFuY2VcIjpcIkRhdGVcIn0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjAsXCJ0eXBlXCI6XCJudW1iZXJcIn19LHtcIm9wZXJhdG9yXCI6XCJkZWxldGVcIixcInBhdGhcIjpbXCJjXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOjgxODAzNTkyMTAwMCxcInR5cGVcIjpcIm51bWJlclwifX0se1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcImJcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjgxODAzNTkyMDAwMCxcInR5cGVcIjpcIm51bWJlclwifX1dJ1xuICAgICAgICBdLFxuXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBkYXRlNVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiOiBkYXRlNlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcImRlbGV0ZVwiLFwicGF0aFwiOltcImFcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6XCIxOTk1LTEyLTA0VDAwOjEyOjAxLjAwMFpcIixcInR5cGVcIjpcIm9iamVjdFwiLFwiaW5zdGFuY2VcIjpcIkRhdGVcIn19LHtcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJiXCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjpcIjE5OTUtMTItMDRUMDA6MTI6MDIuMDAwWlwiLFwidHlwZVwiOlwib2JqZWN0XCIsXCJpbnN0YW5jZVwiOlwiRGF0ZVwifX1dJ1xuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZGF0ZTFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZGF0ZTFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW10nXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IGRhdGUzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwiYWRkXCIsXCJwYXRoXCI6W1wiYVwiXSxcInNlY29uZFwiOntcInZhbHVlXCI6ODE4MDM1OTIwMDAwLFwidHlwZVwiOlwibnVtYmVyXCJ9fV0nXG4gICAgICAgIF0sXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IGRhdGUyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IGRhdGUzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwidXBkYXRlXCIsXCJwYXRoXCI6W1wiYVwiXSxcImZpcnN0XCI6e1widmFsdWVcIjowLFwidHlwZVwiOlwibnVtYmVyXCJ9LFwic2Vjb25kXCI6e1widmFsdWVcIjo4MTgwMzU5MjAwMDAsXCJ0eXBlXCI6XCJudW1iZXJcIn19XSdcbiAgICAgICAgXSxcblxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiAyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1t7XCJvcGVyYXRvclwiOlwidXBkYXRlXCIsXCJwYXRoXCI6W1wiYVwiXSxcImZpcnN0XCI6e1widmFsdWVcIjoxLFwidHlwZVwiOlwibnVtYmVyXCJ9LFwic2Vjb25kXCI6e1widmFsdWVcIjoyLFwidHlwZVwiOlwibnVtYmVyXCJ9fV0nXG4gICAgICAgIF0sXG5cbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgeDogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcImRlbGV0ZVwiLFwicGF0aFwiOltcImFcIl0sXCJmaXJzdFwiOntcInZhbHVlXCI6MSxcInR5cGVcIjpcIm51bWJlclwifX0se1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcInhcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjEsXCJ0eXBlXCI6XCJudW1iZXJcIn19XSdcbiAgICAgICAgXSxcblxuICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiAyLFxuICAgICAgICAgICAgICAgIHg6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJ1cGRhdGVcIixcInBhdGhcIjpbXCJhXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOjEsXCJ0eXBlXCI6XCJudW1iZXJcIn0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOjIsXCJ0eXBlXCI6XCJudW1iZXJcIn19LHtcIm9wZXJhdG9yXCI6XCJhZGRcIixcInBhdGhcIjpbXCJ4XCJdLFwic2Vjb25kXCI6e1widmFsdWVcIjoxLFwidHlwZVwiOlwibnVtYmVyXCJ9fV0nXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICAnW3tcIm9wZXJhdG9yXCI6XCJkZWxldGVcIixcInBhdGhcIjpbXCJhXCJdLFwiZmlyc3RcIjp7XCJ2YWx1ZVwiOm51bGwsXCJ0eXBlXCI6XCJvYmplY3RcIn19XSdcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGE6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbXSdcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdbe1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcImFcIl0sXCJzZWNvbmRcIjp7XCJ2YWx1ZVwiOm51bGwsXCJ0eXBlXCI6XCJvYmplY3RcIn19XSdcbiAgICAgICAgXSwgW1xuICAgICAgICB7fSxcbiAgICAgICAge2E6IHVuZGVmaW5lZH0sXG4gICAgICAgICdbe1wib3BlcmF0b3JcIjpcImFkZFwiLFwicGF0aFwiOltcImFcIl0sXCJzZWNvbmRcIjp7XCJ0eXBlXCI6XCJ1bmRlZmluZWRcIn19XSdcbiAgICBdXG5cblxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgIGxldCBhID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG4gICAgICAgIGxldCBjID0gZGF0YS5zaGlmdCgpXG5cblxuICAgICAgICBpdCgnRGlmZiBzaG91bGQgcmVzdWx0ICcgKyBjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgZCA9IGRpZmYoYSwgYik7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoZCkpLmlzLmVxdWFsKGMpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSk7XG5cbn0pIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy5tanNcIjtcbmltcG9ydCB7aXNPYmplY3R9IGZyb20gXCIuLi8uLi90eXBlcy9pcy5tanNcIjtcbmltcG9ydCB7RGF0YXNvdXJjZX0gZnJvbSBcIi4uL2RhdGFzb3VyY2UubWpzXCI7XG5pbXBvcnQge1BhdGhmaW5kZXJ9IGZyb20gXCIuLi9wYXRoZmluZGVyLm1qc1wiO1xuaW1wb3J0IHtQaXBlfSBmcm9tIFwiLi4vcGlwZS5tanNcIjtcbmltcG9ydCB7V3JpdGVFcnJvcn0gZnJvbSBcIi4vcmVzdGFwaS93cml0ZWVycm9yLm1qc1wiO1xuXG5leHBvcnQge1Jlc3RBUEl9XG5cbi8qKlxuICogVGhlIFJlc3RBUEkgaXMgYSBjbGFzcyB0aGF0IGVuYWJsZXMgYSBSRVNUIEFQSSBzZXJ2ZXIuXG4gKlxuICogQGV4dGVybmFsRXhhbXBsZSAuLi8uLi8uLi9leGFtcGxlL2RhdGEvc3RvcmFnZS9yZXN0YXBpLm1qcyBcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGEuRGF0YXNvdXJjZVxuICogQHN1bW1hcnkgVGhlIExvY2FsU3RvcmFnZSBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGFjY2VzcyB0byBkYXRhIG9iamVjdHMuXG4gKi9cbmNsYXNzIFJlc3RBUEkgZXh0ZW5kcyBEYXRhc291cmNlIHtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtyZWFkRGVmaW5pdGlvbl0gQW4gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhbnkgY3VzdG9tIHNldHRpbmdzIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhlIHJlYWQgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3dyaXRlRGVmaW5pdGlvbl0gQW4gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhbnkgY3VzdG9tIHNldHRpbmdzIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhlIHdyaXRlIHJlcXVlc3QuXG4gICAgICogQHRocm93cyB7VHlwZUVycm9yfSB2YWx1ZSBpcyBub3QgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZWFkRGVmaW5pdGlvbiwgd3JpdGVEZWZpbml0aW9uKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9XG5cbiAgICAgICAgaWYgKGlzT2JqZWN0KHJlYWREZWZpbml0aW9uKSkgb3B0aW9ucy5yZWFkID0gcmVhZERlZmluaXRpb247XG4gICAgICAgIGlmIChpc09iamVjdCh3cml0ZURlZmluaXRpb24pKSBvcHRpb25zLndyaXRlID0gd3JpdGVEZWZpbml0aW9uO1xuXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmw9dW5kZWZpbmVkIERlZmluZXMgdGhlIHJlc291cmNlIHRoYXQgeW91IHdpc2ggdG8gZmV0Y2guXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHdyaXRlPXt9IE9wdGlvbnNcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gd3JpdGUuaW5pdD17fSBBbiBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGFueSBjdXN0b20gc2V0dGluZ3MgdGhhdCB5b3Ugd2FudCB0byBhcHBseSB0byB0aGUgcmVxdWVzdC4gVGhlIHBhcmFtZXRlcnMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBvZiB0aGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3R8UmVxdWVzdCBjb25zdHJ1Y3Rvcn1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gd3JpdGUuaW5pdC5tZXRob2Q9UE9TVFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB3cml0ZS5hY2NlcHRlZFN0YXR1cz1bMjAwLDIwMV1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gd3JpdGUudXJsIFVSTFxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB3cml0ZS5tYXBwaW5nIHRoZSBtYXBwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHdyaXRpbmcuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHdyaXRlLm1hcHBpbmcudHJhbnNmb3JtZXIgVHJhbnNmb3JtZXIgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBlbnRyaWVzXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHdyaXRlLnJlcG9ydFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB3cml0ZS5yZXBvcnQucGF0aCBQYXRoIHRvIHZhbGlkYXRpb25zXG4gICAgICogQHByb3BlcnR5IHtNb25zdGVyLkRhdGEuRGF0YXNvdXJjZX5leGFtcGxlQ2FsbGJhY2tbXX0gd3JpdGUubWFwcGluZy5jYWxsYmFjayB3aXRoIHRoZSBoZWxwIG9mIHRoZSBjYWxsYmFjaywgdGhlIHN0cnVjdHVyZXMgY2FuIGJlIGFkanVzdGVkIGJlZm9yZSB3cml0aW5nLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSByZWFkLmluaXQ9e30gQW4gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhbnkgY3VzdG9tIHNldHRpbmdzIHRoYXQgeW91IHdhbnQgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuIFRoZSBwYXJhbWV0ZXJzIGFyZSBpZGVudGljYWwgdG8gdGhvc2Ugb2YgdGhlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdC9SZXF1ZXN0fFJlcXVlc3QgY29uc3RydWN0b3J9XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYWQuaW5pdC5tZXRob2Q9R0VUXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYWQuYWNjZXB0ZWRTdGF0dXM9WzIwMF1cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcmVhZC51cmwgVVJMXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHJlYWQubWFwcGluZyB0aGUgbWFwcGluZyBpcyBhcHBsaWVkIGFmdGVyIHJlYWRpbmcuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHJlYWQubWFwcGluZy50cmFuc2Zvcm1lciBUcmFuc2Zvcm1lciB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXNcbiAgICAgKiBAcHJvcGVydHkge01vbnN0ZXIuRGF0YS5EYXRhc291cmNlfmV4YW1wbGVDYWxsYmFja1tdfSByZWFkLm1hcHBpbmcuY2FsbGJhY2sgd2l0aCB0aGUgaGVscCBvZiB0aGUgY2FsbGJhY2ssIHRoZSBzdHJ1Y3R1cmVzIGNhbiBiZSBhZGp1c3RlZCBhZnRlciByZWFkaW5nLlxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICB3cml0ZToge1xuICAgICAgICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY2NlcHRlZFN0YXR1czogWzIwMCwgMjAxXSxcbiAgICAgICAgICAgICAgICB1cmw6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtYXBwaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrczogW11cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlcG9ydDoge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhZDoge1xuICAgICAgICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWNjZXB0ZWRTdGF0dXM6IFsyMDBdLFxuICAgICAgICAgICAgICAgIHVybDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1hcHBpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzOiBbXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBvcHRpb25zIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBqc29uIGRlZmluaXRpb25cbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIG9iamVjdFxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGUgZGF0YSBjYW5ub3QgYmUgcmVhZFxuICAgICAqL1xuICAgIHJlYWQoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBsZXQgcmVzcG9uc2U7XG5cbiAgICAgICAgbGV0IGluaXQgPSBzZWxmLmdldE9wdGlvbigncmVhZC5pbml0Jyk7XG4gICAgICAgIGlmICghaXNPYmplY3QoaW5pdCkpIGluaXQgPSB7fTtcblxuICAgICAgICByZXR1cm4gZmV0Y2goc2VsZi5nZXRPcHRpb24oJ3JlYWQudXJsJyksIGluaXQpLnRoZW4ocmVzcCA9PiB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHJlc3A7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkU3RhdHVzID0gc2VsZi5nZXRPcHRpb24oJ3JlYWQuYWNjZXB0ZWRTdGF0dXMnLCBbMjAwXSk7XG5cbiAgICAgICAgICAgIGlmIChhY2NlcHRlZFN0YXR1cy5pbmRleE9mKHJlc3Auc3RhdHVzKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigndGhlIGRhdGEgY2Fubm90IGJlIHJlYWQgKHJlc3BvbnNlICcgKyByZXNwLnN0YXR1cyArICcpJylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3AudGV4dCgpXG4gICAgICAgIH0pLnRoZW4oYm9keSA9PiB7XG5cbiAgICAgICAgICAgIGxldCBvYmo7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb2JqID0gSlNPTi5wYXJzZShib2R5KTtcblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnN1YnN0cmluZygwLCA5NykgKyAnLi4uJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQganNvbiAoYWN0dWFsOiAnICsgYm9keSArICcpLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdHJhbnNmb3JtYXRpb24gPSBzZWxmLmdldE9wdGlvbigncmVhZC5tYXBwaW5nLnRyYW5zZm9ybWVyJyk7XG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgUGlwZSh0cmFuc2Zvcm1hdGlvbik7XG4gICAgICAgICAgICAgICAgb2JqID0gcGlwZS5ydW4ob2JqKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VsZi5zZXQob2JqKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgICAqIEB0aHJvd3Mge1dyaXRlRXJyb3J9IHRoZSBkYXRhIGNhbm5vdCBiZSB3cml0dGVuXG4gICAgICovXG4gICAgd3JpdGUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cbiAgICAgICAgbGV0IGluaXQgPSBzZWxmLmdldE9wdGlvbignd3JpdGUuaW5pdCcpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGluaXQpKSBpbml0ID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgaW5pdFsnaGVhZGVycyddICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaW5pdFsnaGVhZGVycyddID0ge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvYmogPSBzZWxmLmdldCgpO1xuICAgICAgICBsZXQgdHJhbnNmb3JtYXRpb24gPSBzZWxmLmdldE9wdGlvbignd3JpdGUubWFwcGluZy50cmFuc2Zvcm1lcicpO1xuICAgICAgICBpZiAodHJhbnNmb3JtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcGlwZSA9IG5ldyBQaXBlKHRyYW5zZm9ybWF0aW9uKTtcbiAgICAgICAgICAgIG9iaiA9IHBpcGUucnVuKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2hlYXRoaW5nT2JqZWN0ID0gc2VsZi5nZXRPcHRpb24oJ3dyaXRlLnNoZWF0aGluZy5vYmplY3QnKTtcbiAgICAgICAgbGV0IHNoZWF0aGluZ1BhdGggPSBzZWxmLmdldE9wdGlvbignd3JpdGUuc2hlYXRoaW5nLnBhdGgnKTtcbiAgICAgICAgbGV0IHJlcG9ydFBhdGggPSBzZWxmLmdldE9wdGlvbignd3JpdGUucmVwb3J0LnBhdGgnKTtcblxuICAgICAgICBpZiAoc2hlYXRoaW5nT2JqZWN0ICYmIHNoZWF0aGluZ1BhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YiA9IG9iajtcbiAgICAgICAgICAgIG9iaiA9IHNoZWF0aGluZ09iamVjdDtcbiAgICAgICAgICAgIChuZXcgUGF0aGZpbmRlcihvYmopKS5zZXRWaWEoc2hlYXRoaW5nUGF0aCwgc3ViKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRbJ2JvZHknXSA9IEpTT04uc3RyaW5naWZ5KG9iaik7XG5cbiAgICAgICAgcmV0dXJuIGZldGNoKHNlbGYuZ2V0T3B0aW9uKCd3cml0ZS51cmwnKSwgaW5pdCkudGhlbihyZXNwb25zZSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkU3RhdHVzID0gc2VsZi5nZXRPcHRpb24oJ3dyaXRlLmFjY2VwdGVkU3RhdHVzJywgWzIwMCwgMjAwMV0pO1xuXG4gICAgICAgICAgICBpZiAoYWNjZXB0ZWRTdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpID09PSAtMSkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKS50aGVuKChib2R5KSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiwgdmFsaWRhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uID0gbmV3IFBhdGhmaW5kZXIob2JqKS5nZXRWaWEocmVwb3J0UGF0aClcblxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5Lmxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnN1YnN0cmluZygwLCA5NykgKyAnLi4uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gKGFjdHVhbDogJyArIGJvZHkgKyAnKS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXcml0ZUVycm9yKCd0aGUgZGF0YSBjYW5ub3QgYmUgd3JpdHRlbiAocmVzcG9uc2UgJyArIHJlc3BvbnNlLnN0YXR1cyArICcpJywgcmVzcG9uc2UsIHZhbGlkYXRpb24pXG5cbiAgICAgICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1Jlc3RBUEl9XG4gICAgICovXG4gICAgZ2V0Q2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFJlc3RBUEkoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVsnb3B0aW9ucyddLnJlYWQsIHNlbGZbaW50ZXJuYWxTeW1ib2xdLmdldFJlYWxTdWJqZWN0KClbJ29wdGlvbnMnXS53cml0ZSk7XG4gICAgfVxuXG59XG5cblxuLyoqXG4gKiBUaGlzIGNhbGxiYWNrIGNhbiBiZSBwYXNzZWQgdG8gYSBkYXRhc291cmNlIGFuZCBpcyB1c2VkIHRvIGFkYXB0IGRhdGEgc3RydWN0dXJlcy5cbiAqXG4gKiBAY2FsbGJhY2sgTW9uc3Rlci5EYXRhLkRhdGFzb3VyY2V+ZXhhbXBsZUNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5ICBLZXlcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGFcbiAqIEBzZWUgTW9uc3Rlci5EYXRhLkRhdGFzb3VyY2VcbiAqL1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IHNjaHVrYWkgR21iSCBhbmQgY29udHJpYnV0b3JzIDIwMjIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBOb2RlIG1vZHVsZTogQHNjaHVrYWkvbW9uc3RlclxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBR1BMdjMgTGljZW5zZS5cbiAqIExpY2Vuc2UgdGV4dCBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLTMuMC5lbi5odG1sXG4gKi9cblxuaW1wb3J0IHtpbnRlcm5hbFN5bWJvbH0gZnJvbSBcIi4uLy4uLy4uL2NvbnN0YW50cy5tanNcIjtcblxuZXhwb3J0IHtXcml0ZUVycm9yfVxuXG4vKipcbiAqIEVycm9yIG1lc3NhZ2UgZm9yIEFQSSByZXF1ZXN0cyB3aXRoIGV4dGVuc2lvbiBvZiByZXF1ZXN0IGFuZCB2YWxpZGF0aW9uLlxuICogXG4gKiBAbGljZW5zZSBBR1BMdjNcbiAqIEBzaW5jZSAxLjI0LjBcbiAqIEBjb3B5cmlnaHQgc2NodWthaSBHbWJIXG4gKiBAbWVtYmVyT2YgTW9uc3Rlci5EYXRhLkRhdGFzb3VyY2UuUmVzdEFQSVxuICogQHN1bW1hcnkgdGhlIGVycm9yIGlzIHRocm93biBieSB0aGUgcmVzdCBhcGkgaW4gY2FzZSBvZiBlcnJvclxuICovXG5jbGFzcyBXcml0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHJlc3BvbnNlLCB2YWxpZGF0aW9uKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzW2ludGVybmFsU3ltYm9sXSA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICAgIHZhbGlkYXRpb246IHZhbGlkYXRpb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtSZXNwb25zZX1cbiAgICAgKi9cbiAgICBnZXRSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbaW50ZXJuYWxTeW1ib2xdWydyZXNwb25zZSddXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldFZhbGlkYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2ludGVybmFsU3ltYm9sXVsndmFsaWRhdGlvbiddXG4gICAgfVxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtSZXN0QVBJfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vYXBwbGljYXRpb24vc291cmNlL2RhdGEvZGF0YXNvdXJjZS9yZXN0YXBpLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZU9iamVjdH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS90eXBlcy92YWxpZGF0ZS5tanNcIjtcblxuXG5kZXNjcmliZSgnUmVzdEFQSScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGxldCBmZXRjaFJlZmVyZW5jZTsgXG4gICAgbGV0IHJldHVyblN0YXR1cztcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFRoaXNbJ2ZldGNoJ10gPSBmZXRjaFJlZmVyZW5jZTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuXG4gICAgICAgIHJldHVyblN0YXR1cyA9IDIwMDtcbiAgICAgICAgZmV0Y2hSZWZlcmVuY2UgPSBnbG9iYWxUaGlzWydmZXRjaCddO1xuICAgICAgICBnbG9iYWxUaGlzWydmZXRjaCddID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuXG4gICAgICAgICAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVybCcpXG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYTogXCJ0ZXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmV0dXJuU3RhdHVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIH07XG5cbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBSZXN0QVBJICcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KG5ldyBSZXN0QVBJKCdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nKSkudG8uYmUuaW5zdGFuY2VvZihSZXN0QVBJKVxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3J3JywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGl0KCdyZWFkIHNob3VsZCByZXR1cm4gb2JqZWN0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRzID0gbmV3IFJlc3RBUEkoe3VybDogJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvd29ybGQuanNvbid9KVxuICAgICAgICAgICAgZHMucmVhZCgpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVPYmplY3QoZGF0YSk7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3dyaXRlIHNob3VsZCAnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgUmVzdEFQSSh7dXJsOiAnaHR0cHM6Ly9tb25zdGVyanMub3JnL2Fzc2V0cy93b3JsZC5qc29uJ30sIHt1cmw6ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nfSlcbiAgICAgICAgICAgIGRzLndyaXRlKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZU9iamVjdChkYXRhKTtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdydyB3aXRoIGVycm9ycycsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpdCgncmVhZCBzaG91bGQgdGhyb3cgZXhjZXB0aW9uJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIHJldHVyblN0YXR1cyA9IDQwMDsgLy8gZmV0Y2ggcmVzcG9uc2Ugd2l0aCA0MDBcblxuICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgUmVzdEFQSSh7dXJsOiAnaHR0cHM6Ly9tb25zdGVyanMub3JnL2Fzc2V0cy93b3JsZC5qc29uJ30pXG4gICAgICAgICAgICBkcy5yZWFkKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKFwic2hvdWxkIG5vdCBydW4uXCIpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKCkpOyAvLyBzaG91bGQgdGhyb3cgZXhjZXB0aW9uIGJlY2F1c2UgcmV0dXJuU3RhdHVzPTQwMFxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkICcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICByZXR1cm5TdGF0dXMgPSA0MDA7IC8vIGZldGNoIHJlc3BvbnNlIHdpdGggNDAwXG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBSZXN0QVBJKHt1cmw6ICdodHRwczovL21vbnN0ZXJqcy5vcmcvYXNzZXRzL3dvcmxkLmpzb24nfSwge3VybDogJ2h0dHBzOi8vbW9uc3RlcmpzLm9yZy9hc3NldHMvd29ybGQuanNvbid9KVxuICAgICAgICAgICAgZHMud3JpdGUoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlT2JqZWN0KGRhdGEpO1xuICAgICAgICAgICAgICAgIGRvbmUoXCJlcnJvclwiKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZSgpKTsgLy8gc2hvdWxkIHRocm93IGV4Y2VwdGlvbiBiZWNhdXNlIHJldHVyblN0YXR1cz00MDBcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cblxufSkiLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gXCIuLi8uLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge0RhdGFzb3VyY2V9IGZyb20gXCIuLi8uLi9kYXRhc291cmNlLm1qc1wiO1xuaW1wb3J0IHtTdG9yYWdlLCBzdG9yYWdlT2JqZWN0U3ltYm9sfSBmcm9tIFwiLi4vc3RvcmFnZS5tanNcIjtcblxuZXhwb3J0IHtTZXNzaW9uU3RvcmFnZX1cblxuLyoqXG4gKiBUaGUgU2Vzc2lvblN0b3JhZ2UgY2xhc3MgcHJvdmlkZXMgYSBkYXRhIHNvdXJjZSB0aGF0IHVzZXMgdGhlIFNlc3Npb25TdG9yYWdlIEFQSSBvbiB0aGUgY2xpZW50LlxuICpcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGEuRGF0YXNvdXJjZS5TdG9yYWdlXG4gKiBAc3VtbWFyeSBUaGUgTG9jYWxTdG9yYWdlIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgYWNjZXNzIHRvIGRhdGEgb2JqZWN0cy5cbiAqL1xuY2xhc3MgU2Vzc2lvblN0b3JhZ2UgZXh0ZW5kcyBTdG9yYWdlIHtcblxuICAgIC8qKlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSB0aGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICAgKiBAcmV0dXJuIHtleHRlcm5hbDpzZXNzaW9uU3RvcmFnZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFtzdG9yYWdlT2JqZWN0U3ltYm9sXSgpIHtcbiAgICAgICAgcmV0dXJuIGdldEdsb2JhbE9iamVjdCgnc2Vzc2lvblN0b3JhZ2UnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgQ2xvbmVcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJuIHtTZXNzaW9uU3RvcmFnZX1cbiAgICAgKi9cbiAgICBnZXRDbG9uZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblN0b3JhZ2Uoc2VsZltpbnRlcm5hbFN5bWJvbF0uZ2V0UmVhbFN1YmplY3QoKVsnb3B0aW9ucyddLmtleSk7XG4gICAgfVxuXG59XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHt2YWxpZGF0ZVN0cmluZ30gZnJvbSBcIi4uLy4uL3R5cGVzL3ZhbGlkYXRlLm1qc1wiO1xuaW1wb3J0IHtEYXRhc291cmNlfSBmcm9tIFwiLi4vZGF0YXNvdXJjZS5tanNcIjtcblxuZXhwb3J0IHtTdG9yYWdlLCBzdG9yYWdlT2JqZWN0U3ltYm9sfVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7c3ltYm9sfVxuICovXG5jb25zdCBzdG9yYWdlT2JqZWN0U3ltYm9sID0gU3ltYm9sKCdzdG9yYWdlT2JqZWN0Jyk7XG5cbi8qKlxuICogVGhlIGNsYXNzIHJlcHJlc2VudHMgYSByZWNvcmQuXG4gKiBcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGEuRGF0YXNvdXJjZVxuICogQHN1bW1hcnkgVGhlIFN0b3JhZ2UgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBhY2Nlc3MgdG8gZGF0YSBvYmplY3RzIG92ZXIgV2ViU3RvcmFnZUFQSS5cbiAqL1xuY2xhc3MgU3RvcmFnZSBleHRlbmRzIERhdGFzb3VyY2Uge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IExvY2FsU3RvcmFnZSBLZXlcbiAgICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IHZhbHVlIGlzIG5vdCBhIHN0cmluZ1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGtleSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNldE9wdGlvbigna2V5JywgdmFsaWRhdGVTdHJpbmcoa2V5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGtleT11bmRlZmluZWQgTG9jYWxTdG9yYWdlIEtleVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmRlZmF1bHRzLCB7XG4gICAgICAgICAgICBrZXk6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzLlxuICAgICAqIEByZXR1cm4ge2V4dGVybmFsOlN0b3JhZ2V9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBbc3RvcmFnZU9iamVjdFN5bWJvbF0oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhlIG9wdGlvbnMgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGpzb24gZGVmaW5pdGlvblxuICAgICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gdmFsdWUgaXMgbm90IGEgb2JqZWN0XG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBkYXRhIGNhbm5vdCBiZSByZWFkXG4gICAgICovXG4gICAgcmVhZCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHNlbGZbc3RvcmFnZU9iamVjdFN5bWJvbF0oKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHN0b3JhZ2UuZ2V0SXRlbShzZWxmLmdldE9wdGlvbigna2V5JykpKTtcbiAgICAgICAgICAgIHNlbGYuc2V0KGRhdGE/P3t9KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSlcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0b3JhZ2V9XG4gICAgICogQHRocm93cyB7RXJyb3J9IHRoZSBkYXRhIGNhbm5vdCBiZSB3cml0dGVuXG4gICAgICovXG4gICAgd3JpdGUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBzZWxmW3N0b3JhZ2VPYmplY3RTeW1ib2xdKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBzZWxmLmdldCgpO1xuICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShzZWxmLmdldE9wdGlvbigna2V5JykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oc2VsZi5nZXRPcHRpb24oJ2tleScpLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdG9yYWdlfVxuICAgICAqL1xuICAgIGdldENsb25lKCkge1xuICAgICAgICBjb25zdCBzZWxmPXRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgU3RvcmFnZShzZWxmW2ludGVybmFsU3ltYm9sXS5nZXRSZWFsU3ViamVjdCgpWydvcHRpb25zJ10ua2V5KTtcbiAgICB9IFxuICAgIFxufVxuIiwgImZ1bmN0aW9uIGNyZWF0ZVN0b3JhZ2UoKSB7XG4gICAgbGV0IFVOU0VUID0gU3ltYm9sKCk7XG4gICAgbGV0IHMgPSB7fSxcbiAgICAgICAgbm9vcENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICB9LFxuICAgICAgICBfaXRlbUluc2VydGlvbkNhbGxiYWNrID0gbm9vcENhbGxiYWNrO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsICdzZXRJdGVtJywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoaywgdiA9IFVOU0VUKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IFVOU0VUKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBleGVjdXRlICdzZXRJdGVtJyBvbiAnU3RvcmFnZSc6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGsgPSBrICsgJyc7XG4gICAgICAgICAgICAgICAgaWYgKCFzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgIF9pdGVtSW5zZXJ0aW9uQ2FsbGJhY2socy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzW2tdID0gdiArICcnO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCAnZ2V0SXRlbScsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gayA9PiB7XG4gICAgICAgICAgICAgICAgayA9IGsgKyAnJztcbiAgICAgICAgICAgICAgICBpZiAocy5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1trXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsICdyZW1vdmVJdGVtJywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBrID0+IHtcbiAgICAgICAgICAgICAgICBrID0gayArICcnO1xuICAgICAgICAgICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJ2NsZWFyJywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc1trXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJ2xlbmd0aCcsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocykubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsIFwia2V5XCIsIHtcbiAgICAgICAgdmFsdWU6IGsgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKHMpW2tdO1xuICAgICAgICAgICAgcmV0dXJuICgha2V5KSA/IG51bGwgOiBrZXk7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsICdpdGVtSW5zZXJ0aW9uQ2FsbGJhY2snLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9pdGVtSW5zZXJ0aW9uQ2FsbGJhY2s7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogdiA9PiB7XG4gICAgICAgICAgICBpZiAoIXYgfHwgdHlwZW9mIHYgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHYgPSBub29wQ2FsbGJhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfaXRlbUluc2VydGlvbkNhbGxiYWNrID0gdjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzO1xufVxuXG5cbmV4cG9ydCB7Y3JlYXRlU3RvcmFnZX07IiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtTZXNzaW9uU3RvcmFnZX0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9kYXRhL2RhdGFzb3VyY2Uvc3RvcmFnZS9zZXNzaW9uc3RvcmFnZS5tanNcIjtcbmltcG9ydCB7Y3JlYXRlU3RvcmFnZX0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWwvbG9jYWxzdG9yYWdlLm1qc1wiO1xuXG5cbmxldCBzdG9yYWdlUmVmZXJlbmNlO1xuXG5kZXNjcmliZSgnU2Vzc2lvblN0b3JhZ2UnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBnbG9iYWxUaGlzWydzZXNzaW9uU3RvcmFnZSddID0gc3RvcmFnZVJlZmVyZW5jZTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHN0b3JhZ2VSZWZlcmVuY2UgPSBnbG9iYWxUaGlzWydzZXNzaW9uU3RvcmFnZSddXG4gICAgICAgIGdsb2JhbFRoaXNbJ3Nlc3Npb25TdG9yYWdlJ10gPSBjcmVhdGVTdG9yYWdlKCk7XG5cbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBTZXNzaW9uU3RvcmFnZSAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChuZXcgU2Vzc2lvblN0b3JhZ2UoJ215a2V5JykpLnRvLmJlLmluc3RhbmNlb2YoU2Vzc2lvblN0b3JhZ2UpXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncncnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3JlYWQgc2hvdWxkIHJldHVybiBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgU2Vzc2lvblN0b3JhZ2UoJ215a2V5JylcbiAgICAgICAgICAgIGRzLnJlYWQoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4gZG9uZShlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd3cml0ZSBzaG91bGQgJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRzID0gbmV3IFNlc3Npb25TdG9yYWdlKCdteWtleScpXG4gICAgICAgICAgICBkcy53cml0ZSgpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiBkb25lKGUpKTtcbiAgICAgICAgfSk7XG5cblxuICAgIH0pXG5cblxufSkiLCAiLyoqXG4gKiBDb3B5cmlnaHQgc2NodWthaSBHbWJIIGFuZCBjb250cmlidXRvcnMgMjAyMi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIE5vZGUgbW9kdWxlOiBAc2NodWthaS9tb25zdGVyXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFHUEx2MyBMaWNlbnNlLlxuICogTGljZW5zZSB0ZXh0IGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwtMy4wLmVuLmh0bWxcbiAqL1xuXG5pbXBvcnQge2ludGVybmFsU3ltYm9sfSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzLm1qc1wiO1xuaW1wb3J0IHtnZXRHbG9iYWxPYmplY3R9IGZyb20gXCIuLi8uLi8uLi90eXBlcy9nbG9iYWwubWpzXCI7XG5pbXBvcnQge0RhdGFzb3VyY2V9IGZyb20gXCIuLi8uLi9kYXRhc291cmNlLm1qc1wiO1xuaW1wb3J0IHtTdG9yYWdlLCBzdG9yYWdlT2JqZWN0U3ltYm9sfSBmcm9tIFwiLi4vc3RvcmFnZS5tanNcIjtcblxuZXhwb3J0IHtMb2NhbFN0b3JhZ2V9XG5cbi8qKlxuICogVGhlIExvY2FsU3RvcmFnZSBEYXRhc291cmNlIHByb3ZpZGVzIGEgZGF0YSBzdG9yZSBpbiB0aGUgYnJvd3NlciBsb2NhbFN0b3JhZ2UuXG4gKiBcbiAqIEBsaWNlbnNlIEFHUEx2M1xuICogQHNpbmNlIDEuMjIuMFxuICogQGNvcHlyaWdodCBzY2h1a2FpIEdtYkhcbiAqIEBtZW1iZXJPZiBNb25zdGVyLkRhdGEuRGF0YXNvdXJjZS5TdG9yYWdlXG4gKiBAc3VtbWFyeSBUaGUgTG9jYWxTdG9yYWdlIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgYWNjZXNzIHRvIGRhdGEgb2JqZWN0cy5cbiAqL1xuY2xhc3MgTG9jYWxTdG9yYWdlIGV4dGVuZHMgU3RvcmFnZSB7XG5cbiAgICAvKipcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gdGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICogQHJldHVybiB7ZXh0ZXJuYWw6bG9jYWxTdG9yYWdlfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgW3N0b3JhZ2VPYmplY3RTeW1ib2xdKCkge1xuICAgICAgICByZXR1cm4gZ2V0R2xvYmFsT2JqZWN0KCdsb2NhbFN0b3JhZ2UnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgY2xvbmVcbiAgICAgKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gICAgICovXG4gICAgZ2V0Q2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IExvY2FsU3RvcmFnZShzZWxmW2ludGVybmFsU3ltYm9sXS5nZXRSZWFsU3ViamVjdCgpWydvcHRpb25zJ10ua2V5KTtcbiAgICB9XG5cblxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge2V4cGVjdH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHtMb2NhbFN0b3JhZ2V9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi9zb3VyY2UvZGF0YS9kYXRhc291cmNlL3N0b3JhZ2UvbG9jYWxzdG9yYWdlLm1qc1wiO1xuaW1wb3J0IHtjcmVhdGVTdG9yYWdlfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbC9sb2NhbHN0b3JhZ2UubWpzXCI7XG5cblxubGV0IGxvY2FsU3RvcmFnZVJlZmVyZW5jZTtcblxuZGVzY3JpYmUoJ0xvY2FsU3RvcmFnZScsIGZ1bmN0aW9uICgpIHtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFRoaXNbJ2xvY2FsU3RvcmFnZSddID0gbG9jYWxTdG9yYWdlUmVmZXJlbmNlO1xuICAgIH0pO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbG9jYWxTdG9yYWdlUmVmZXJlbmNlID0gZ2xvYmFsVGhpc1snbG9jYWxTdG9yYWdlJ11cbiAgICAgICAgZ2xvYmFsVGhpc1snbG9jYWxTdG9yYWdlJ10gPSBjcmVhdGVTdG9yYWdlKCk7XG5cbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZCBpbnN0YW5jZSBvZiBMb2NhbFN0b3JhZ2UgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QobmV3IExvY2FsU3RvcmFnZSgnbXlrZXknKSkudG8uYmUuaW5zdGFuY2VvZihMb2NhbFN0b3JhZ2UpXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncncnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgaXQoJ3JlYWQgc2hvdWxkIHJldHVybiBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZHMgPSBuZXcgTG9jYWxTdG9yYWdlKCdteWtleScpXG4gICAgICAgICAgICBkcy5yZWFkKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnd3JpdGUgc2hvdWxkICcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBkcyA9IG5ldyBMb2NhbFN0b3JhZ2UoJ215a2V5JylcbiAgICAgICAgICAgIGRzLndyaXRlKCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IGRvbmUoZSkpO1xuICAgICAgICB9KTtcblxuXG4gICAgfSlcblxuXG59KSIsICIvKiogbm9kZWpzIGRvZXNudCBzdXBwb3J0IHdpbmRvdy5jcnlwdCAqL1xuaW1wb3J0IHtleHBlY3R9IGZyb20gXCJjaGFpXCJcblxuZGVzY3JpYmUoJ01hdGgnLCBmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgcmFuZG9tID0gKCkgPT4ge31cbiAgICBcbiAgICBiZWZvcmUoZnVuY3Rpb24gKGRvbmUpIHtcblxuICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICBpZiAoIWdsb2JhbFRoaXNbJ2NyeXB0byddKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIkBwZWN1bGlhci93ZWJjcnlwdG9cIikudGhlbihtID0+IHtcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzWydjcnlwdG8nXSA9IG5ldyBtLkNyeXB0bygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuICAgICAgICBwcm9taXNlcy5wdXNoKGltcG9ydChcIi4uLy4uLy4uLy4uL2FwcGxpY2F0aW9uL3NvdXJjZS9tYXRoL3JhbmRvbS5tanNcIikudGhlbihtID0+IHtcbiAgICAgICAgICAgIHJhbmRvbSA9IG0ucmFuZG9tO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pKVxuXG5cbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZSgpXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnLnJhbmRvbSgpJywgZnVuY3Rpb24gKCkge1xuXG5cbiAgICAgICAgaXQoJ2EgZ3JlYXRlciBiIHNob3VsZCB0aHJvdyBlcnJvciAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBleHBlY3QoKCkgPT4gcmFuZG9tKDEwLCAyKSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCByZXR1cm4gYSBudW1iZXIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHIgPSByYW5kb20oKTtcbiAgICAgICAgICAgIGV4cGVjdChyKS50aGF0LmlzLmEoJ251bWJlcicpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCByZXR1cm4gYSBudW1iZXIgJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHJhbmRvbSg1LCA2KSkudG8udGhyb3coRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnIHNob3VsZCB0aHJvdyBFcnJvciB3ZSBjYW5ub3QgZ2VuZXJhdGUgbnVtYmVycyBsYXJnZXIgdGhhbiA1MyBiaXRzLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiByYW5kb20oLTk5OTk5OTk5OSwgOTk5OTk5OTk5OTk5OTk5OTk5OTkpKS50by50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCcgc2hvdWxkIHRocm93IEVycm9yIHdlIGNhbm5vdCBnZW5lcmF0ZSBudW1iZXJzIGxhcmdlciB0aGFuIDUzIGJpdHMuJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWzEsIDEwMF0sXG4gICAgICAgICAgICAgICAgWzUwMCwgNjAwXSxcbiAgICAgICAgICAgICAgICBbMTAwLCAxMDAwXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBsZXQgciA9IHJhbmRvbShhLCBiKTtcblxuICAgICAgICAgICAgICAgIGl0KHIgKyAnIHNob3VsZCByZXR1cm4gdmFsdWUgYmV0d2VlbiAnICsgYSArICcgJyArIGIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIgPj0gYSkudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHIgPD0gYikudG8uYmUudHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgWzEsIDEwMF0sXG4gICAgICAgICAgICAgICAgWzUwMCwgNjAwXSxcbiAgICAgICAgICAgICAgICBbMTAwLCAxMDAwXVxuICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgYSA9IGRhdGEuc2hpZnQoKVxuICAgICAgICAgICAgICAgIGxldCBiID0gZGF0YS5zaGlmdCgpXG5cbiAgICAgICAgICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCByb3VuZHMgPSA1MDBcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSByb3VuZHM7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcmFuZG9tKGEsIGIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhdmcgPSBzdW0gLyByb3VuZHM7XG5cbiAgICAgICAgICAgICAgICBpdChhdmcgKyAnIHNob3VsZCBiZXR3ZWVuICcgKyBhICsgJyAnICsgYiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3QoYXZnID4gYSkudG8uYmUudHJ1ZVxuICAgICAgICAgICAgICAgICAgICBleHBlY3QoYXZnIDwgYikudG8uYmUudHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAgICAgfSlcblxuICAgICAgICB9KVxuXG5cbiAgICB9KVxuXG5cbn0pIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBZUEsZUFBUyxVQUFXO0FBQ2xCLFlBQUksV0FBVyxDQUFDLEVBQUUsTUFBTSxLQUFLLFNBQVM7QUFFdEMsaUJBQVMsYUFBYyxLQUFLLEtBQUs7QUFDL0IsaUJBQU8sS0FBSyxHQUFHLEVBQUUsUUFBUSxTQUFVLEtBQUs7QUFDdEMsZ0JBQUksQ0FBQyxDQUFDLFNBQVMsUUFBUSxHQUFHO0FBQUcsa0JBQUksT0FBTyxJQUFJO0FBQUEsVUFDOUMsQ0FBQztBQUFBLFFBQ0g7QUFFQSxlQUFPLFNBQVMsZ0JBQWlCO0FBQy9CLGNBQUksT0FBTyxDQUFDLEVBQUUsTUFBTSxLQUFLLFNBQVMsR0FDOUIsSUFBSSxHQUNKLE1BQU0sQ0FBQztBQUVYLGlCQUFPLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDM0IseUJBQWEsS0FBSyxLQUFLLEVBQUU7QUFBQSxVQUMzQjtBQUVBLGlCQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFNQSxhQUFPLFVBQVVBO0FBYWpCLGVBQVNBLGdCQUFnQixTQUFTLFFBQVEsS0FBSztBQUM3QyxZQUFJQyxVQUFTLFFBQVEsUUFBUSxXQUFXLFNBQVMsZUFBZSxRQUFRLEdBQ3BFLFFBQVFBLFFBQU8sVUFBVSxDQUFDLENBQUM7QUFHL0IsYUFBSyxVQUFVLFdBQVc7QUFDMUIsYUFBSyxXQUFXO0FBR2hCLGlCQUFTLE9BQU8sT0FBTztBQUNyQixlQUFLLE9BQU8sTUFBTTtBQUFBLFFBQ3BCO0FBR0EsY0FBTSxPQUFPRDtBQUNiLFlBQUksTUFBTSxtQkFBbUI7QUFDM0IsZ0JBQU0sa0JBQWtCLE1BQU0sR0FBRztB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O0FBQUEsUUFDSTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsVUFDSSxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLFFBQ0ksQ0FBQztBQUFBLFFBQ0Q7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxNQUVBO0FBQUEsUUFDSTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsVUFDSSxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFFQTtBQUFBLFFBQ0k7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUFBLE1BRUE7QUFBQSxRQUNJO0FBQUEsVUFDSSxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxNQUVBO0FBQUEsUUFDSTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsVUFDSSxHQUFHO0FBQUEsVUFDSCxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLFFBQ0k7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQSxDQUFDO0FBQUEsUUFDRDtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsUUFDSTtBQUFBLFVBQ0ksR0FBRztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsVUFDSSxHQUFHO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLFFBQ0ksQ0FBQztBQUFBLFFBQ0Q7QUFBQSxVQUNJLEdBQUc7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxNQUFHO0FBQUEsUUFDSCxDQUFDO0FBQUEsUUFDRCxFQUFDLEdBQUcsT0FBUztBQUFBLFFBQ2I7QUFBQSxNQUNKO0FBQUEsSUFHQSxFQUFFLFFBQVEsU0FBVSxNQUFNO0FBRXRCLFVBQUlDLEtBQUksS0FBSyxNQUFNO0FBQ25CLFVBQUksSUFBSSxLQUFLLE1BQU07QUFDbkIsVUFBSSxJQUFJLEtBQUssTUFBTTtBQUduQixTQUFHLHdCQUF3QixHQUFHLFdBQVk7QUFDdEMsWUFBSSxJQUFJLEtBQUtBLElBQUcsQ0FBQztBQUNqQixlQUFPLEtBQUssVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQUFBLE1BQ3hDLENBQUM7QUFBQSxJQUdMLENBQUM7QUFBQSxFQUVMLENBQUM7OztBQ3BNRDtBQUNBO0FBRUE7QUFDQTs7O0FDSkE7QUFhQSxNQUFNLGFBQU4sY0FBeUIsTUFBTTtBQUFBLElBTTNCLFlBQVksU0FBUyxVQUFVLFlBQVk7QUFDdkMsWUFBTSxPQUFPO0FBQ2IsV0FBSyxrQkFBa0I7QUFBQSxRQUNuQjtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLElBS0EsY0FBYztBQUNWLGFBQU8sS0FBSyxnQkFBZ0I7QUFBQSxJQUNoQztBQUFBLElBS0EsZ0JBQWdCO0FBQ1osYUFBTyxLQUFLLGdCQUFnQjtBQUFBLElBQ2hDO0FBQUEsRUFDSjs7O0FEckJBLE1BQU0sVUFBTixjQUFzQixXQUFXO0FBQUEsSUFRN0IsWUFBWSxnQkFBZ0IsaUJBQWlCO0FBQ3pDLFlBQU07QUFFTixZQUFNLFVBQVUsQ0FBQztBQUVqQixVQUFJLFNBQVMsY0FBYztBQUFHLGdCQUFRLE9BQU87QUFDN0MsVUFBSSxTQUFTLGVBQWU7QUFBRyxnQkFBUSxRQUFRO0FBRS9DLFdBQUssV0FBVyxPQUFPO0FBQUEsSUFFM0I7QUFBQSxJQXNCQSxJQUFJLFdBQVc7QUFDWCxhQUFPLE9BQU8sT0FBTyxDQUFDLEdBQUcsTUFBTSxVQUFVO0FBQUEsUUFDckMsT0FBTztBQUFBLFVBQ0gsTUFBTTtBQUFBLFlBQ0YsUUFBUTtBQUFBLFVBQ1o7QUFBQSxVQUNBLGdCQUFnQixDQUFDLEtBQUssR0FBRztBQUFBLFVBQ3pCLEtBQUs7QUFBQSxVQUNMLFNBQVM7QUFBQSxZQUNMLGFBQWE7QUFBQSxZQUNiLFdBQVcsQ0FBQztBQUFBLFVBQ2hCO0FBQUEsVUFDQSxRQUFRO0FBQUEsWUFDSixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLE1BQU07QUFBQSxZQUNGLFFBQVE7QUFBQSxVQUNaO0FBQUEsVUFDQSxnQkFBZ0IsQ0FBQyxHQUFHO0FBQUEsVUFDcEIsS0FBSztBQUFBLFVBQ0wsU0FBUztBQUFBLFlBQ0wsYUFBYTtBQUFBLFlBQ2IsV0FBVyxDQUFDO0FBQUEsVUFDaEI7QUFBQSxRQUNKO0FBQUEsTUFFSixDQUFDO0FBQUEsSUFDTDtBQUFBLElBUUEsT0FBTztBQUNILFlBQU1DLFFBQU87QUFDYixVQUFJO0FBRUosVUFBSUMsUUFBT0QsTUFBSyxVQUFVLFdBQVc7QUFDckMsVUFBSSxDQUFDLFNBQVNDLEtBQUk7QUFBRyxRQUFBQSxRQUFPLENBQUM7QUFFN0IsYUFBTyxNQUFNRCxNQUFLLFVBQVUsVUFBVSxHQUFHQyxLQUFJLEVBQUUsS0FBSyxVQUFRO0FBQ3hELG1CQUFXO0FBRVgsY0FBTSxpQkFBaUJELE1BQUssVUFBVSx1QkFBdUIsQ0FBQyxHQUFHLENBQUM7QUFFbEUsWUFBSSxlQUFlLFFBQVEsS0FBSyxNQUFNLE1BQU0sSUFBSTtBQUM1QyxnQkFBTSxNQUFNLHVDQUF1QyxLQUFLLFNBQVMsR0FBRztBQUFBLFFBQ3hFO0FBRUEsZUFBTyxLQUFLLEtBQUs7QUFBQSxNQUNyQixDQUFDLEVBQUUsS0FBSyxVQUFRO0FBRVosWUFBSTtBQUVKLFlBQUk7QUFDQSxnQkFBTSxLQUFLLE1BQU0sSUFBSTtBQUFBLFFBRXpCLFNBQVMsR0FBUDtBQUVFLGNBQUksS0FBSyxTQUFTLEtBQUs7QUFDbkIsbUJBQU8sS0FBSyxVQUFVLEdBQUcsRUFBRSxJQUFJO0FBQUEsVUFDbkM7QUFFQSxnQkFBTSxJQUFJLE1BQU0seURBQXlELE9BQU8sSUFBSTtBQUFBLFFBQ3hGO0FBRUEsWUFBSSxpQkFBaUJBLE1BQUssVUFBVSwwQkFBMEI7QUFDOUQsWUFBSSxtQkFBbUIsUUFBVztBQUM5QixnQkFBTSxPQUFPLElBQUksS0FBSyxjQUFjO0FBQ3BDLGdCQUFNLEtBQUssSUFBSSxHQUFHO0FBQUEsUUFDdEI7QUFFQSxRQUFBQSxNQUFLLElBQUksR0FBRztBQUNaLGVBQU87QUFBQSxNQUNYLENBQUM7QUFBQSxJQUNMO0FBQUEsSUFNQSxRQUFRO0FBQ0osWUFBTUEsUUFBTztBQUdiLFVBQUlDLFFBQU9ELE1BQUssVUFBVSxZQUFZO0FBQ3RDLFVBQUksQ0FBQyxTQUFTQyxLQUFJO0FBQUcsUUFBQUEsUUFBTyxDQUFDO0FBQzdCLFVBQUksT0FBT0EsTUFBSyxlQUFlLFVBQVU7QUFDckMsUUFBQUEsTUFBSyxhQUFhO0FBQUEsVUFDZCxnQkFBZ0I7QUFBQSxRQUNwQjtBQUFBLE1BQ0o7QUFFQSxVQUFJLE1BQU1ELE1BQUssSUFBSTtBQUNuQixVQUFJLGlCQUFpQkEsTUFBSyxVQUFVLDJCQUEyQjtBQUMvRCxVQUFJLG1CQUFtQixRQUFXO0FBQzlCLGNBQU0sT0FBTyxJQUFJLEtBQUssY0FBYztBQUNwQyxjQUFNLEtBQUssSUFBSSxHQUFHO0FBQUEsTUFDdEI7QUFFQSxVQUFJLGtCQUFrQkEsTUFBSyxVQUFVLHdCQUF3QjtBQUM3RCxVQUFJLGdCQUFnQkEsTUFBSyxVQUFVLHNCQUFzQjtBQUN6RCxVQUFJLGFBQWFBLE1BQUssVUFBVSxtQkFBbUI7QUFFbkQsVUFBSSxtQkFBbUIsZUFBZTtBQUNsQyxjQUFNLE1BQU07QUFDWixjQUFNO0FBQ04sUUFBQyxJQUFJLFdBQVcsR0FBRyxFQUFHLE9BQU8sZUFBZSxHQUFHO0FBQUEsTUFDbkQ7QUFFQSxNQUFBQyxNQUFLLFVBQVUsS0FBSyxVQUFVLEdBQUc7QUFFakMsYUFBTyxNQUFNRCxNQUFLLFVBQVUsV0FBVyxHQUFHQyxLQUFJLEVBQUUsS0FBSyxjQUFZO0FBRTdELGNBQU0saUJBQWlCRCxNQUFLLFVBQVUsd0JBQXdCLENBQUMsS0FBSyxJQUFJLENBQUM7QUFFekUsWUFBSSxlQUFlLFFBQVEsU0FBUyxNQUFNLE1BQU0sSUFBSTtBQUVoRCxpQkFBTyxTQUFTLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUztBQUVsQyxnQkFBSUUsTUFBSztBQUNULGdCQUFJO0FBQ0EsY0FBQUEsT0FBTSxLQUFLLE1BQU0sSUFBSTtBQUNyQiwyQkFBYSxJQUFJLFdBQVdBLElBQUcsRUFBRSxPQUFPLFVBQVU7QUFBQSxZQUV0RCxTQUFTLEdBQVA7QUFFRSxrQkFBSSxLQUFLLFNBQVMsS0FBSztBQUNuQix1QkFBTyxLQUFLLFVBQVUsR0FBRyxFQUFFLElBQUk7QUFBQSxjQUNuQztBQUVBLG9CQUFNLElBQUksTUFBTSx5REFBeUQsT0FBTyxJQUFJO0FBQUEsWUFDeEY7QUFFQSxrQkFBTSxJQUFJLFdBQVcsMENBQTBDLFNBQVMsU0FBUyxLQUFLLFVBQVUsVUFBVTtBQUFBLFVBRTlHLENBQUM7QUFBQSxRQUdMO0FBRUEsZUFBTztBQUFBLE1BQ1gsQ0FBQztBQUFBLElBQ0w7QUFBQSxJQU1BLFdBQVc7QUFDUCxZQUFNRixRQUFPO0FBQ2IsYUFBTyxJQUFJLFFBQVFBLE1BQUssZ0JBQWdCLGVBQWUsRUFBRSxXQUFXLE1BQU1BLE1BQUssZ0JBQWdCLGVBQWUsRUFBRSxXQUFXLEtBQUs7QUFBQSxJQUNwSTtBQUFBLEVBRUo7OztBRTVOQTtBQUdBLFdBQVMsV0FBVyxXQUFZO0FBRTVCLFFBQUlHO0FBQ0osUUFBSTtBQUVKLGNBQVUsTUFBTTtBQUNaLGlCQUFXLFdBQVdBO0FBQUEsSUFDMUIsQ0FBQztBQUVELGVBQVcsTUFBTTtBQUViLHFCQUFlO0FBQ2YsTUFBQUEsa0JBQWlCLFdBQVc7QUFDNUIsaUJBQVcsV0FBVyxTQUFVLEtBQUssU0FBUztBQUUxQyxZQUFJLENBQUM7QUFBSyxnQkFBTSxJQUFJLE1BQU0sYUFBYTtBQUV2QyxlQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUNwQyxrQkFBUTtBQUFBLFlBQ0osTUFBTSxXQUFZO0FBQ2QscUJBQU8sS0FBSyxVQUFVO0FBQUEsZ0JBQ2xCLEdBQUc7QUFBQSxjQUNQLENBQUM7QUFBQSxZQUNMO0FBQUEsWUFDQSxRQUFRO0FBQUEsVUFDWixDQUFDO0FBQUEsUUFDTCxDQUFDO0FBQUEsTUFFTDtBQUFBLElBRUosQ0FBQztBQUVELE9BQUcsK0JBQStCLFdBQVk7QUFDMUMsYUFBTyxJQUFJLFFBQVEseUNBQXlDLENBQUMsRUFBRSxHQUFHLEdBQUcsV0FBVyxPQUFPO0FBQUEsSUFDM0YsQ0FBQztBQUVELGFBQVMsTUFBTSxXQUFZO0FBRXZCLFNBQUcsNkJBQTZCLFNBQVUsTUFBTTtBQUM1QyxjQUFNLEtBQUssSUFBSSxRQUFRLEVBQUMsS0FBSywwQ0FBeUMsQ0FBQztBQUN2RSxXQUFHLEtBQUssRUFBRSxLQUFLLFVBQVE7QUFDbkIseUJBQWUsSUFBSTtBQUNuQixlQUFLO0FBQUEsUUFDVCxDQUFDLEVBQUUsTUFBTSxPQUFLLEtBQUssQ0FBQyxDQUFDO0FBQUEsTUFDekIsQ0FBQztBQUVELFNBQUcsaUJBQWlCLFNBQVUsTUFBTTtBQUNoQyxjQUFNLEtBQUssSUFBSSxRQUFRLEVBQUMsS0FBSywwQ0FBeUMsR0FBRyxFQUFDLEtBQUssMENBQXlDLENBQUM7QUFDekgsV0FBRyxNQUFNLEVBQUUsS0FBSyxVQUFRO0FBQ3BCLHlCQUFlLElBQUk7QUFDbkIsZUFBSztBQUFBLFFBQ1QsQ0FBQyxFQUFFLE1BQU0sT0FBSyxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3pCLENBQUM7QUFBQSxJQUdMLENBQUM7QUFFRCxhQUFTLGtCQUFrQixXQUFZO0FBRW5DLFNBQUcsK0JBQStCLFNBQVUsTUFBTTtBQUM5Qyx1QkFBZTtBQUVmLGNBQU0sS0FBSyxJQUFJLFFBQVEsRUFBQyxLQUFLLDBDQUF5QyxDQUFDO0FBQ3ZFLFdBQUcsS0FBSyxFQUFFLEtBQUssVUFBUTtBQUNuQixlQUFLLGlCQUFpQjtBQUFBLFFBQzFCLENBQUMsRUFBRSxNQUFNLE9BQUssS0FBSyxDQUFDO0FBQUEsTUFDeEIsQ0FBQztBQUVELFNBQUcsaUJBQWlCLFNBQVUsTUFBTTtBQUNoQyx1QkFBZTtBQUNmLGNBQU0sS0FBSyxJQUFJLFFBQVEsRUFBQyxLQUFLLDBDQUF5QyxHQUFHLEVBQUMsS0FBSywwQ0FBeUMsQ0FBQztBQUN6SCxXQUFHLE1BQU0sRUFBRSxLQUFLLFVBQVE7QUFDcEIseUJBQWUsSUFBSTtBQUNuQixlQUFLLE9BQU87QUFBQSxRQUNoQixDQUFDLEVBQUUsTUFBTSxPQUFLLEtBQUssQ0FBQztBQUFBLE1BQ3hCLENBQUM7QUFBQSxJQUdMLENBQUM7QUFBQSxFQUdMLENBQUM7OztBQ2pGRDtBQUNBOzs7QUNEQTtBQUNBO0FBU0EsTUFBTSxzQkFBc0IsT0FBTyxlQUFlO0FBV2xELE1BQU0sVUFBTixjQUFzQixXQUFXO0FBQUEsSUFPN0IsWUFBWSxLQUFLO0FBQ2IsWUFBTTtBQUNOLFdBQUssVUFBVSxPQUFPLGVBQWUsR0FBRyxDQUFDO0FBQUEsSUFDN0M7QUFBQSxJQUtBLElBQUksV0FBVztBQUNYLGFBQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLFVBQVU7QUFBQSxRQUNyQyxLQUFLO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFDTDtBQUFBLElBT0EsQ0FBQyx1QkFBdUI7QUFDcEIsWUFBTSxJQUFJLE1BQU0sb0RBQW9EO0FBQUEsSUFDeEU7QUFBQSxJQVFBLE9BQU87QUFDSCxZQUFNQyxRQUFPO0FBRWIsWUFBTSxVQUFVQSxNQUFLLHFCQUFxQjtBQUUxQyxhQUFPLElBQUksUUFBUSxTQUFVLFNBQVM7QUFDbEMsY0FBTSxPQUFPLEtBQUssTUFBTSxRQUFRLFFBQVFBLE1BQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUM5RCxRQUFBQSxNQUFLLElBQUksUUFBTSxDQUFDLENBQUM7QUFDakIsZ0JBQVE7QUFBQSxNQUNaLENBQUM7QUFBQSxJQUVMO0FBQUEsSUFNQSxRQUFRO0FBQ0osWUFBTUEsUUFBTztBQUViLFlBQU0sVUFBVUEsTUFBSyxxQkFBcUI7QUFFMUMsYUFBTyxJQUFJLFFBQVEsU0FBVSxTQUFTO0FBRWxDLGNBQU0sT0FBT0EsTUFBSyxJQUFJO0FBQ3RCLFlBQUksU0FBUyxRQUFXO0FBQ3BCLGtCQUFRLFdBQVdBLE1BQUssVUFBVSxLQUFLLENBQUM7QUFBQSxRQUM1QyxPQUFPO0FBQ0gsa0JBQVEsUUFBUUEsTUFBSyxVQUFVLEtBQUssR0FBRyxLQUFLLFVBQVUsSUFBSSxDQUFDO0FBQUEsUUFDL0Q7QUFFQSxnQkFBUTtBQUFBLE1BQ1osQ0FBQztBQUFBLElBQ0w7QUFBQSxJQUtBLFdBQVc7QUFDUCxZQUFNQSxRQUFLO0FBQ1gsYUFBTyxJQUFJLFFBQVFBLE1BQUssZ0JBQWdCLGVBQWUsRUFBRSxXQUFXLEdBQUc7QUFBQSxJQUMzRTtBQUFBLEVBRUo7OztBRHBGQSxNQUFNLGlCQUFOLGNBQTZCLFFBQVE7QUFBQSxJQU9qQyxDQUFDLHVCQUF1QjtBQUNwQixhQUFPLGdCQUFnQixnQkFBZ0I7QUFBQSxJQUMzQztBQUFBLElBT0EsV0FBVztBQUNQLFlBQU1DLFFBQU87QUFDYixhQUFPLElBQUksZUFBZUEsTUFBSyxnQkFBZ0IsZUFBZSxFQUFFLFdBQVcsR0FBRztBQUFBLElBQ2xGO0FBQUEsRUFFSjs7O0FFNUNBLFdBQVMsZ0JBQWdCO0FBQ3JCLFFBQUksUUFBUSxPQUFPO0FBQ25CLFFBQUksSUFBSSxDQUFDLEdBQ0wsZUFBZSxNQUFNO0FBQUEsSUFDckIsR0FDQSx5QkFBeUI7QUFFN0IsV0FBTyxlQUFlLEdBQUcsV0FBVztBQUFBLE1BQ2hDLEtBQUssTUFBTTtBQUNQLGVBQU8sQ0FBQyxHQUFHLElBQUksVUFBVTtBQUNyQixjQUFJLE1BQU0sT0FBTztBQUNiLGtCQUFNLElBQUksVUFBVSxxRkFBcUY7QUFBQSxVQUM3RztBQUNBLGNBQUksSUFBSTtBQUNSLGNBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxHQUFHO0FBQ3RCLG1DQUF1QixFQUFFLE1BQU07QUFBQSxVQUNuQztBQUNBLFlBQUUsS0FBSyxJQUFJO0FBQUEsUUFDZjtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFDRCxXQUFPLGVBQWUsR0FBRyxXQUFXO0FBQUEsTUFDaEMsS0FBSyxNQUFNO0FBQ1AsZUFBTyxPQUFLO0FBQ1IsY0FBSSxJQUFJO0FBQ1IsY0FBSSxFQUFFLGVBQWUsQ0FBQyxHQUFHO0FBQ3JCLG1CQUFPLEVBQUU7QUFBQSxVQUNiLE9BQU87QUFDSCxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU8sZUFBZSxHQUFHLGNBQWM7QUFBQSxNQUNuQyxLQUFLLE1BQU07QUFDUCxlQUFPLE9BQUs7QUFDUixjQUFJLElBQUk7QUFDUixjQUFJLEVBQUUsZUFBZSxDQUFDLEdBQUc7QUFDckIsbUJBQU8sRUFBRTtBQUFBLFVBQ2I7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU8sZUFBZSxHQUFHLFNBQVM7QUFBQSxNQUM5QixLQUFLLE1BQU07QUFDUCxlQUFPLE1BQU07QUFDVCxtQkFBUyxLQUFLLEdBQUc7QUFDYixnQkFBSSxFQUFFLGVBQWUsQ0FBQyxHQUFHO0FBQ3JCLHFCQUFPLEVBQUU7QUFBQSxZQUNiO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTyxlQUFlLEdBQUcsVUFBVTtBQUFBLE1BQy9CLEtBQUssTUFBTTtBQUNQLGVBQU8sT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQzFCO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTyxlQUFlLEdBQUcsT0FBTztBQUFBLE1BQzVCLE9BQU8sT0FBSztBQUNSLFlBQUksTUFBTSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLGVBQVEsQ0FBQyxNQUFPLE9BQU87QUFBQSxNQUMzQjtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU8sZUFBZSxHQUFHLHlCQUF5QjtBQUFBLE1BQzlDLEtBQUssTUFBTTtBQUNQLGVBQU87QUFBQSxNQUNYO0FBQUEsTUFDQSxLQUFLLE9BQUs7QUFDTixZQUFJLENBQUMsS0FBSyxPQUFPLEtBQUssWUFBWTtBQUM5QixjQUFJO0FBQUEsUUFDUjtBQUNBLGlDQUF5QjtBQUFBLE1BQzdCO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7OztBQ3RFQSxNQUFJO0FBRUosV0FBUyxrQkFBa0IsV0FBWTtBQUVuQyxjQUFVLE1BQU07QUFDWixpQkFBVyxvQkFBb0I7QUFBQSxJQUNuQyxDQUFDO0FBRUQsZUFBVyxXQUFZO0FBRW5CLHlCQUFtQixXQUFXO0FBQzlCLGlCQUFXLG9CQUFvQixjQUFjO0FBQUEsSUFFakQsQ0FBQztBQUVELE9BQUcsc0NBQXNDLFdBQVk7QUFDakQsYUFBTyxJQUFJLGVBQWUsT0FBTyxDQUFDLEVBQUUsR0FBRyxHQUFHLFdBQVcsY0FBYztBQUFBLElBQ3ZFLENBQUM7QUFFRCxhQUFTLE1BQU0sV0FBWTtBQUV2QixTQUFHLDZCQUE2QixTQUFVLE1BQU07QUFDNUMsY0FBTSxLQUFLLElBQUksZUFBZSxPQUFPO0FBQ3JDLFdBQUcsS0FBSyxFQUFFLEtBQUssVUFBUTtBQUNuQixlQUFLO0FBQUEsUUFDVCxDQUFDLEVBQUUsTUFBTSxPQUFLLEtBQUssQ0FBQyxDQUFDO0FBQUEsTUFDekIsQ0FBQztBQUVELFNBQUcsaUJBQWlCLFNBQVUsTUFBTTtBQUNoQyxjQUFNLEtBQUssSUFBSSxlQUFlLE9BQU87QUFDckMsV0FBRyxNQUFNLEVBQUUsS0FBSyxVQUFRO0FBQ3BCLGVBQUs7QUFBQSxRQUNULENBQUMsRUFBRSxNQUFNLE9BQUssS0FBSyxDQUFDLENBQUM7QUFBQSxNQUN6QixDQUFDO0FBQUEsSUFHTCxDQUFDO0FBQUEsRUFHTCxDQUFDOzs7QUN2Q0Q7QUFDQTtBQWVBLE1BQU0sZUFBTixjQUEyQixRQUFRO0FBQUEsSUFPL0IsQ0FBQyx1QkFBdUI7QUFDcEIsYUFBTyxnQkFBZ0IsY0FBYztBQUFBLElBQ3pDO0FBQUEsSUFNQSxXQUFXO0FBQ1AsWUFBTUMsUUFBTztBQUNiLGFBQU8sSUFBSSxhQUFhQSxNQUFLLGdCQUFnQixlQUFlLEVBQUUsV0FBVyxHQUFHO0FBQUEsSUFDaEY7QUFBQSxFQUdKOzs7QUNyQ0EsTUFBSTtBQUVKLFdBQVMsZ0JBQWdCLFdBQVk7QUFFakMsY0FBVSxNQUFNO0FBQ1osaUJBQVcsa0JBQWtCO0FBQUEsSUFDakMsQ0FBQztBQUVELGVBQVcsV0FBWTtBQUVuQiw4QkFBd0IsV0FBVztBQUNuQyxpQkFBVyxrQkFBa0IsY0FBYztBQUFBLElBRS9DLENBQUM7QUFFRCxPQUFHLG9DQUFvQyxXQUFZO0FBQy9DLGFBQU8sSUFBSSxhQUFhLE9BQU8sQ0FBQyxFQUFFLEdBQUcsR0FBRyxXQUFXLFlBQVk7QUFBQSxJQUNuRSxDQUFDO0FBRUQsYUFBUyxNQUFNLFdBQVk7QUFFdkIsU0FBRyw2QkFBNkIsU0FBVSxNQUFNO0FBQzVDLGNBQU0sS0FBSyxJQUFJLGFBQWEsT0FBTztBQUNuQyxXQUFHLEtBQUssRUFBRSxLQUFLLFVBQVE7QUFDbkIsZUFBSztBQUFBLFFBQ1QsQ0FBQyxFQUFFLE1BQU0sT0FBSyxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3pCLENBQUM7QUFFRCxTQUFHLGlCQUFpQixTQUFVLE1BQU07QUFDaEMsY0FBTSxLQUFLLElBQUksYUFBYSxPQUFPO0FBQ25DLFdBQUcsTUFBTSxFQUFFLEtBQUssVUFBUTtBQUNwQixlQUFLO0FBQUEsUUFDVCxDQUFDLEVBQUUsTUFBTSxPQUFLLEtBQUssQ0FBQyxDQUFDO0FBQUEsTUFDekIsQ0FBQztBQUFBLElBR0wsQ0FBQztBQUFBLEVBR0wsQ0FBQzs7O0FDM0NELFdBQVMsUUFBUSxXQUFZO0FBRXpCLFFBQUlDLFVBQVMsTUFBTTtBQUFBLElBQUM7QUFFcEIsV0FBTyxTQUFVLE1BQU07QUFFbkIsVUFBSSxXQUFXLENBQUM7QUFDaEIsVUFBSSxDQUFDLFdBQVcsV0FBVztBQUN2QixpQkFBUyxLQUFLLDBFQUE4QixLQUFLLE9BQUs7QUFDbEQscUJBQVcsWUFBWSxJQUFJLEVBQUUsT0FBTztBQUNwQyxpQkFBTztBQUFBLFFBQ1gsQ0FBQyxDQUFDO0FBQUEsTUFDTjtBQUVBLGVBQVMsS0FBSyw4REFBeUQsS0FBSyxPQUFLO0FBQzdFLFFBQUFBLFVBQVMsRUFBRTtBQUNYLGVBQU87QUFBQSxNQUNYLENBQUMsQ0FBQztBQUdGLGNBQVEsSUFBSSxRQUFRLEVBQUUsS0FBSyxNQUFNO0FBQzdCLGFBQUs7QUFBQSxNQUNULENBQUM7QUFBQSxJQUVMLENBQUM7QUFFRCxhQUFTLGFBQWEsV0FBWTtBQUc5QixTQUFHLG1DQUFtQyxXQUFZO0FBQzlDLGVBQU8sTUFBTUEsUUFBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxLQUFLO0FBQUEsTUFDOUMsQ0FBQztBQUVELFNBQUcsNEJBQTRCLFdBQVk7QUFDdkMsWUFBSSxJQUFJQSxRQUFPO0FBQ2YsZUFBTyxDQUFDLEVBQUUsS0FBSyxHQUFHLEVBQUUsUUFBUTtBQUFBLE1BQ2hDLENBQUM7QUFFRCxTQUFHLDRCQUE0QixXQUFZO0FBQ3ZDLGVBQU8sTUFBTUEsUUFBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxLQUFLO0FBQUEsTUFDN0MsQ0FBQztBQUVELFNBQUcsdUVBQXVFLFdBQVk7QUFDbEYsZUFBTyxNQUFNQSxRQUFPLFlBQVksSUFBb0IsQ0FBQyxFQUFFLEdBQUcsTUFBTSxLQUFLO0FBQUEsTUFDekUsQ0FBQztBQUVELFNBQUcsdUVBQXVFLFdBQVk7QUFFbEY7QUFBQSxVQUNJLENBQUMsR0FBRyxHQUFHO0FBQUEsVUFDUCxDQUFDLEtBQUssR0FBRztBQUFBLFVBQ1QsQ0FBQyxLQUFLLEdBQUk7QUFBQSxRQUNkLEVBQUUsUUFBUSxTQUFVLE1BQU07QUFFdEIsY0FBSUMsS0FBSSxLQUFLLE1BQU07QUFDbkIsY0FBSSxJQUFJLEtBQUssTUFBTTtBQUVuQixjQUFJLElBQUlELFFBQU9DLElBQUcsQ0FBQztBQUVuQixhQUFHLElBQUksa0NBQWtDQSxLQUFJLE1BQU0sR0FBRyxXQUFZO0FBQzlELG1CQUFPLEtBQUtBLEVBQUMsRUFBRSxHQUFHLEdBQUc7QUFDckIsbUJBQU8sS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHO0FBQUEsVUFDekIsQ0FBQztBQUFBLFFBQ0wsQ0FBQztBQUVEO0FBQUEsVUFDSSxDQUFDLEdBQUcsR0FBRztBQUFBLFVBQ1AsQ0FBQyxLQUFLLEdBQUc7QUFBQSxVQUNULENBQUMsS0FBSyxHQUFJO0FBQUEsUUFDZCxFQUFFLFFBQVEsU0FBVSxNQUFNO0FBRXRCLGNBQUlBLEtBQUksS0FBSyxNQUFNO0FBQ25CLGNBQUksSUFBSSxLQUFLLE1BQU07QUFFbkIsY0FBSSxNQUFNO0FBQ1YsZ0JBQU0sU0FBUztBQUVmLG1CQUFTLElBQUksR0FBRyxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDeEMsbUJBQU9ELFFBQU9DLElBQUcsQ0FBQztBQUFBLFVBQ3RCO0FBRUEsY0FBSSxNQUFNLE1BQU07QUFFaEIsYUFBRyxNQUFNLHFCQUFxQkEsS0FBSSxNQUFNLEdBQUcsV0FBWTtBQUNuRCxtQkFBTyxNQUFNQSxFQUFDLEVBQUUsR0FBRyxHQUFHO0FBQ3RCLG1CQUFPLE1BQU0sQ0FBQyxFQUFFLEdBQUcsR0FBRztBQUFBLFVBQzFCLENBQUM7QUFBQSxRQUdMLENBQUM7QUFBQSxNQUVMLENBQUM7QUFBQSxJQUdMLENBQUM7QUFBQSxFQUdMLENBQUM7IiwKICAibmFtZXMiOiBbIkFzc2VydGlvbkVycm9yIiwgImV4dGVuZCIsICJnbG9iYWwiLCAiQXNzZXJ0aW9uRXJyb3IiLCAiZ2xvYmFsIiwgImV4cG9ydHMiLCAib2JqIiwgInRydW5jYXRlIiwgImdldEFycmF5TmFtZSIsICJpc05hTiIsICJlc2NhcGUiLCAiZ2V0UHJvbWlzZVZhbHVlIiwgImVsZW1lbnQiLCAiQm9vbGVhbiIsICJXZWFrU2V0IiwgIldlYWtNYXAiLCAiRGF0YVZpZXciLCAiQXJyYXlCdWZmZXIiLCAiaW5zcGVjdEN1c3RvbSIsICJjb25maWciLCAiY29uZmlnIiwgImlzUHJpbWl0aXZlIiwgImNvbmZpZyIsICJjaGFpIiwgImNvbmZpZyIsICJjaGFpIiwgImNoYWkiLCAiY2hhaSIsICJjaGFpIiwgImNoYWkiLCAiYSIsICJpc05hTiIsICJnZXRPcGVyYXRvciIsICJpc09iamVjdCIsICJjb25maWciLCAidXRpbCIsICJBc3NlcnRpb25FcnJvciIsICJBc3NlcnRpb24iLCAiY2hhaSIsICJBc3NlcnRpb24iLCAiQXNzZXJ0aW9uRXJyb3IiLCAiYSIsICJtYXRjaElkeCIsICJjaGFpIiwgInV0aWwiLCAiY2hhaSIsICJ1dGlsIiwgIkFzc2VydGlvbiIsICJzaG91bGQiLCAiY2hhaSIsICJ1dGlsIiwgIkFzc2VydGlvbiIsICJhc3NlcnQiLCAidXRpbCIsICJjb25maWciLCAiY29yZSIsICJleHBlY3QiLCAic2hvdWxkIiwgImFzc2VydCIsICJyZXF1aXJlX2NoYWkiLCAiYSIsICJjb25zb2xlIiwgIkRFTElNSVRFUiIsICJpbml0X2NvbnN0YW50cyIsICJpbml0IiwgImEiLCAic2VsZiIsICJhIiwgImludGVybmFsIiwgImEiLCAiZGlmZiIsICJkb2N1bWVudCIsICJ3aW5kb3ciLCAiZWxlbWVudCIsICJkb2N1bWVudCIsICJkb2N1bWVudCIsICJlbGVtZW50IiwgImluaXRfY29uc3RhbnRzIiwgImRvY3VtZW50IiwgIkhUTUxUZW1wbGF0ZUVsZW1lbnQiLCAiRG9jdW1lbnRGcmFnbWVudCIsICJEb2N1bWVudCIsICJpbml0X2NvbnN0YW50cyIsICJzZWxmIiwgImVsZW1lbnQiLCAidmFsdWUiLCAiZG9jdW1lbnQiLCAiZSIsICJpIiwgImluaXRfY29uc3RhbnRzIiwgImVsZW1lbnQiLCAic3ltYm9sIiwgImluaXRfY29uc3RhbnRzIiwgInNlbGYiLCAiZWxlbWVudCIsICJvYmoiLCAiaW5pdF9jb25zdGFudHMiLCAic2VsZiIsICJpbml0X2NvbnN0YW50cyIsICJkb2N1bWVudCIsICJ3aW5kb3ciLCAiQnVmZmVyU291cmNlQ29udmVydGVyIiwgImEiLCAiQ29udmVydCIsICJjb21iaW5lIiwgInJldEJ1ZiIsICJyZXRWaWV3IiwgIkJvb2xlYW4iLCAiU2V0IiwgIl9hIiwgInJldFZpZXciLCAidGVtcEJ1ZmZlclZpZXciLCAiQXNuVHlwZVR5cGVzIiwgIkFzblByb3BUeXBlcyIsICJCb29sZWFuIiwgImltcG9ydF9wdnRzdXRpbHMiLCAiX2EiLCAiU2V0IiwgImRlZmF1bHRDb252ZXJ0ZXIiLCAiX2EiLCAiZWxlbWVudCIsICJTZXQiLCAiU2V0IiwgImVsZW1lbnQiLCAiaW1wb3J0X3B2dHN1dGlscyIsICJfX2V4dGVuZHMiLCAiX19hc3NpZ24iLCAiX19yZXN0IiwgIl9fZGVjb3JhdGUiLCAiX19wYXJhbSIsICJfX21ldGFkYXRhIiwgIl9fYXdhaXRlciIsICJfX2dlbmVyYXRvciIsICJfX2V4cG9ydFN0YXIiLCAiX192YWx1ZXMiLCAiX19yZWFkIiwgIl9fc3ByZWFkIiwgIl9fc3ByZWFkQXJyYXlzIiwgIl9fc3ByZWFkQXJyYXkiLCAiX19hd2FpdCIsICJfX2FzeW5jR2VuZXJhdG9yIiwgIl9fYXN5bmNEZWxlZ2F0b3IiLCAiX19hc3luY1ZhbHVlcyIsICJfX21ha2VUZW1wbGF0ZU9iamVjdCIsICJfX2ltcG9ydFN0YXIiLCAiX19pbXBvcnREZWZhdWx0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkSW4iLCAiX19jcmVhdGVCaW5kaW5nIiwgImV4cG9ydHMiLCAiYSIsICJ2IiwgInRzbGliIiwgImlzQ29udmVydGlibGUiLCAic2NoZW1hU3RvcmFnZSIsICJpbml0X2luZGV4X2VzIiwgIkpzb25Qcm9wVHlwZXMiLCAiaW1wb3J0X3B2dHN1dGlscyIsICJPYmplY3RJZGVudGlmaWVyIiwgImluaXRfaW5kZXhfZXMiLCAiZm9ybWF0IiwgIkVjUHVibGljS2V5IiwgIkVkUHJpdmF0ZUtleSIsICJFZFB1YmxpY0tleSIsICJDdXJ2ZVByaXZhdGVLZXkiLCAiQ3J5cHRvIiwgImEiLCAicHJvY2VzcyIsICJpbXBvcnRfcHZ0c3V0aWxzIiwgIkNyeXB0b0tleSIsICJBZXNDYmNQcm92aWRlciIsICJBZXNDbWFjUHJvdmlkZXIiLCAiQWVzQ3RyUHJvdmlkZXIiLCAiQWVzR2NtUHJvdmlkZXIiLCAiQWVzS3dQcm92aWRlciIsICJBZXNFY2JQcm92aWRlciIsICJSc2FQcml2YXRlS2V5IiwgIlJzYVB1YmxpY0tleSIsICJSc2FTc2FQcm92aWRlciIsICJSc2FQc3NQcm92aWRlciIsICJSc2FPYWVwUHJvdmlkZXIiLCAiRWNQcml2YXRlS2V5IiwgIkVjUHVibGljS2V5IiwgIkVjZHNhUHJvdmlkZXIiLCAiRWNkaFByb3ZpZGVyIiwgIkVkUHJpdmF0ZUtleSIsICJFZFB1YmxpY0tleSIsICJFZERzYVByb3ZpZGVyIiwgIkVjZGhFc1Byb3ZpZGVyIiwgIlBia2RmMlByb3ZpZGVyIiwgIkhtYWNQcm92aWRlciIsICJIa2RmUHJvdmlkZXIiLCAiU2hha2UxMjhQcm92aWRlciIsICJTaGFrZTI1NlByb3ZpZGVyIiwgIlN1YnRsZUNyeXB0byIsICJpbml0X2luZGV4X2VzIiwgImNyeXB0b19fZGVmYXVsdCIsICJmb3JtYXQiLCAiX2EiLCAiZ2xvYmFsUmVmZXJlbmNlIiwgImludGVybmFsQ291bnRlciIsICJlbGVtZW50IiwgImNoYWkiLCAidmVyc2lvbiIsICJhIiwgIm1vbnN0ZXJWZXJzaW9uIiwgImEiLCAiY29uc29sZSIsICJhIiwgImhhbmRsZXIiLCAic2VsZiIsICJhIiwgImluaXRfY29uc3RhbnRzIiwgImluaXRfY29uc3RhbnRzIiwgInNlbGYiLCAic2VsZiIsICJkb2N1bWVudCIsICJjaGFpIiwgIndpbmRvdyIsICJleHBlY3QiLCAiZXhwZWN0IiwgImluaXRfY29uc3RhbnRzIiwgImNyZWF0ZUVsZW1lbnQiLCAiYXBwZW5kVG9Eb2N1bWVudCIsICJzZWxmIiwgImRvY3VtZW50IiwgImV4cGVjdCIsICJmZXRjaFJlZmVyZW5jZSIsICJtdXRhdGlvbm9ic2VydmVyIiwgImFkZGVkTm9kZXMiLCAiZXhwZWN0IiwgImUiLCAiZXhwZWN0IiwgImluaXRfY29uc3RhbnRzIiwgImNyZWF0ZUVsZW1lbnQiLCAic2VsZiIsICJkb2N1bWVudCIsICJleHBlY3QiLCAiZXhwZWN0IiwgImV4cGVjdCIsICJlbGVtZW50IiwgInYiLCAiYSIsICJpbml0X2NvbnN0YW50cyIsICJleHBlY3QiLCAiaHRtbDEiLCAiQ3VzdG9tQ29udHJvbCIsICJyZWdpc3RlckN1c3RvbUVsZW1lbnQiLCAiZG9jdW1lbnQiLCAibSIsICJlbGVtZW50IiwgImRvY3VtZW50IiwgImEiLCAiaW5pdF9jb25zdGFudHMiLCAic2VsZiIsICJmZXRjaFJlZmVyZW5jZSIsICJhIiwgImluaXRfY29uc3RhbnRzIiwgImV4cGVjdCIsICJodG1sMSIsICJDdXN0b21FbGVtZW50IiwgInJlZ2lzdGVyQ3VzdG9tRWxlbWVudCIsICJkb2N1bWVudCIsICJlbGVtZW50IiwgImEiLCAiaHRtbDEiLCAiaHRtbDIiLCAiaHRtbDMiLCAic3ltYm9sIiwgImVsZW1lbnQiLCAiYSIsICJnbG9iYWwiLCAiYSIsICJpbml0X2NvbnN0YW50cyIsICJhIiwgIndpbmRvd1JlYWR5IiwgImRvbVJlYWR5IiwgIktFWV9ET0NVTUVOVCIsICJlbGVtZW50IiwgImVsZW1lbnQiLCAiYSIsICJGb3JtYXR0ZXIiLCAic2VsZiIsICJGb3JtYXR0ZXIiLCAiYSIsICJnbG9iYWwiLCAiYSIsICJhIiwgIlJhbmRvbUlEIiwgIlVVSUQiLCAiYSIsICJhIiwgImEiLCAiYSIsICJhIiwgIk5vZGVMaXN0IiwgInNlbGYiLCAiTm9kZSIsICJOb2RlIiwgIk5vZGVMaXN0IiwgInNlbGYiLCAiTm9kZUxpc3QiLCAiTm9kZSIsICJhIiwgIk5vZGVMaXN0IiwgIk5vZGUiLCAiTm9kZUxpc3QiLCAiTm9kZSIsICJOb2RlIiwgIk5vZGVMaXN0IiwgImEiLCAiYSIsICJhIiwgImEiLCAic2VsZiIsICJhIiwgImEiLCAiYSIsICJpbml0IiwgInNlbGYiLCAiZGlmZiIsICJhIiwgImEiLCAiYSIsICJzZWxmIiwgImEiLCAiYSIsICJhIiwgImkiLCAiYSIsICJwYXJzZU9wdGlvbnNKU09OIiwgInNlbGYiLCAiTm9kZSIsICJOb2RlTGlzdCIsICJOb2RlTGlzdCIsICJhIiwgImEiLCAiYiIsICJjIiwgImEiLCAiYSIsICJzZWxmIiwgImluaXQiLCAib2JqIiwgImZldGNoUmVmZXJlbmNlIiwgInNlbGYiLCAic2VsZiIsICJzZWxmIiwgInJhbmRvbSIsICJhIl0KfQo=